/ Hex Artifact Content
Login

Artifact c683806cd69ae845d5093d6e2906a7a73a2d9775:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0910: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0920: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0930: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0950: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0960: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0970: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0990: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09a0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
09b0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
09c0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
09d0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
09e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
09f0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0a60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0a70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0a80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0a90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0aa0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0ab0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0ac0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0ad0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0ae0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0af0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0b60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0b70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0b80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0b90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ba0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0bb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0bc0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0bd0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0be0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0c10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0c20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0c30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0c40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0c50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0c70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0c90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0cb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0cc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0cd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0ce0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0cf0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
0d00: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0d10: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0d20: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
0d30: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
0d40: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
0d50: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
0d60: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0d70: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
0d80: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
0d90: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
0da0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
0db0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
0dc0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
0dd0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
0de0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0df0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
0e00: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
0e10: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
0e20: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
0e30: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
0e40: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
0e50: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
0e60: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
0e70: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
0e80: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
0e90: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
0ea0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
0eb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0ec0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
0ed0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
0ee0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
0ef0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
0f00: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
0f10: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
0f20: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
0f30: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
0f40: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
0f50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
0f60: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
0f70: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0f80: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0f90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0fa0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0fb0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0fc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
0fd0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
0fe0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
0ff0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1000: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1010: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1020: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1030: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1040: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1060: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1070: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1080: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1090: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
10a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
10b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
10e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
10f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1100: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1110: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1120: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1130: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1140: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1150: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1160: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1170: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1180: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1190: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
11a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
11b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
11c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
11d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
11e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
11f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1200: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1210: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1220: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1230: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1240: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1260: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1270: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1290: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
12a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
12b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
12c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
12d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
12e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
12f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1310: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1320: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1330: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1340: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1350: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1360: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1370: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1380: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1390: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
13a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
13b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
13c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
13d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
13e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
13f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1400: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1410: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1420: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1430: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1440: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1450: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1460: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1470: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1480: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1490: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
14a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
14b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
14c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
14d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
14e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
14f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1500: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1510: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1530: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1540: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1550: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1560: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1570: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1580: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1590: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
15a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
15b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
15c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
15d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
15e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
15f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1600: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1610: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1620: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1640: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1650: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1660: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1670: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1680: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1690: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
16a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
16b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
16d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
16e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
16f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1700: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1710: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1720: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1730: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1740: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1750: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1760: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1770: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1780: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1790: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
17a0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
17b0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
17c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
17d0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
17e0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
17f0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1800: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1830: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1840: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1850: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1870: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1890: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
18a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
18b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18d0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
18f0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1900: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1910: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1920: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1930: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1940: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1950: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1960: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1970: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1980: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1990: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
19a0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
19b0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
19c0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
19d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
19e0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
19f0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1a00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1a10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1a20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1a30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1a40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1a50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1a60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1a80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1a90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1aa0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1ab0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1ac0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1ad0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1ae0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1af0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1b00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1b10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1b20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1b40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1b50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1b60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1b70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1b80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1b90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ba0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1bb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1bc0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1be0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bf0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1c00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1c10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1c20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1c50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1ca0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1cb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1cc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1cd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1ce0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1cf0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1d00: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
1d10: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d20: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
1d30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
1d40: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
1d50: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
1d60: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
1d70: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
1d80: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
1d90: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
1da0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
1db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1dc0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
1dd0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
1de0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1df0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e00: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
1e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1e30: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1e40: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
1e50: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
1e60: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
1e70: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
1e80: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
1e90: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1eb0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
1ec0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
1ed0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
1ee0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
1ef0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
1f00: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
1f10: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
1f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f30: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
1f40: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
1f50: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
1f60: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
1f70: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1f90: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
1fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
1fb0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1fc0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
1fd0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
1fe0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2000: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2010: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2020: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2030: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2040: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2050: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2060: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2070: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2080: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2090: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
20b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
20c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
20d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
20e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
20f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2100: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2120: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2130: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
2140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2150: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2160: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2170: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
2180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2190: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
21a0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
21b0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
21c0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
21d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
21e0: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
21f0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2200: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2210: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2220: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2230: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2240: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2250: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2260: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2270: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
2280: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
2290: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
22a0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
22b0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
22c0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
22d0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
22e0: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
22f0: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2300: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2310: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2320: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2330: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2350: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2360: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2370: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2380: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
2390: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
23a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
23b0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
23c0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
23d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
23e0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
23f0: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2400: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2410: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2430: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2440: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2450: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2460: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2470: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
2480: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
2490: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
24a0: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
24b0: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
24c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
24e0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d  AREDCACHE;.    }
24f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2510: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2520: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2530: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2540: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2550: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
2560: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
2570: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2580: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
2590: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
25a0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
25b0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
25c0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
25d0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
25e0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
25f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  K..**.** This fu
2600: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
2610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2620: 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70  .**   (a) The sp
2630: 65 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62  ecified Btree ob
2640: 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63  ject p is connec
2650: 74 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c  ted to a sharabl
2660: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
2670: 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68  ase (one with th
2680: 65 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61  e BtShared.shara
2690: 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61  ble flag set), a
26a0: 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e  nd.**.**   (b) N
26b0: 6f 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  o other Btree ob
26c0: 6a 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63  jects hold a loc
26d0: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
26e0: 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74  .**       with t
26f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2700: 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61  k (i.e. querySha
2710: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2720: 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20  k() has.**      
2730: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2740: 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  lled and returne
2750: 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  d SQLITE_OK)..**
2760: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2770: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2780: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2790: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
27a0: 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73  ITE_NOMEM .** is
27b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
27c0: 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61  alloc attempt fa
27d0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
27e0: 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68  nt setSharedCach
27f0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
2800: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
2810: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2820: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2830: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2840: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
2850: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2860: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2870: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2890: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
28a0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
28b0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
28c0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20  ( p->db!=0 );.. 
28d0: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
28e0: 20 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75   with the read-u
28f0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2900: 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74  set will never t
2910: 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
2920: 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73  n a read-lock us
2930: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2940: 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64  n. The only read
2950: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20  -lock obtained. 
2960: 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74   ** by a connect
2970: 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  ion in read-unco
2980: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20  mmitted mode is 
2990: 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
29a0: 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ster .  ** table
29b0: 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20  , and that lock 
29c0: 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42  is obtained in B
29d0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29  treeBeginTrans()
29e0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29f0: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
2a00: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
2a10: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63  mmitted) || eLoc
2a20: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2a30: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2a40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
2a50: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
2a60: 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20  sharable b-tree 
2a70: 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68  after it .  ** h
2a80: 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  as been determin
2a90: 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ed that no other
2aa0: 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20   b-tree holds a 
2ab0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
2ac0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ad0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20  p->sharable );. 
2ae0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2af0: 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43  OK==querySharedC
2b00: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
2b10: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
2b20: 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  );..  /* First s
2b30: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
2b40: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
2b50: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
2b60: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
2b70: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2b80: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2b90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2ba0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
2bb0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
2bc0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
2bd0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
2be0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
2bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c00: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
2c10: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
2c20: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
2c30: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
2c40: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
2c50: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
2c60: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
2c70: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
2c80: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2c90: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
2ca0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
2cb0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2cc0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
2cd0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
2ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
2cf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
2d10: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
2d20: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
2d30: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
2d40: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
2d50: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
2d60: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
2d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2d80: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
2d90: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
2da0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
2db0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
2dc0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2dd0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
2de0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
2df0: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
2e00: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
2e10: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
2e20: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
2e30: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
2e40: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
2e50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
2e60: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
2e70: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
2e80: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
2e90: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
2ea0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
2eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2ed0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2ee0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2f10: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
2f20: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
2f30: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
2f40: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
2f50: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
2f60: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
2f70: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
2f80: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
2f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2fa0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2fb0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
2fc0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
2fd0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
2fe0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
2ff0: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3000: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
3010: 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  g variable.** ma
3020: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3030: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3040: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3050: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3060: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3070: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3080: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3090: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
30a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
30b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
30c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
30d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
30f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3100: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3110: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3120: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3130: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3140: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3150: 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75  rt( pBt->isExclu
3160: 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  sive==0 || pBt->
3170: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
3180: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
3190: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31a0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31b0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31c0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31d0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
31e0: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
31f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3200: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3210: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3220: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3230: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3240: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3250: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3260: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3280: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
3290: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32a0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42   }..  assert( pB
32b0: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20  t->isPending==0 
32c0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20  || pBt->pWriter 
32d0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  );.  if( pBt->pW
32e0: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
32f0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3300: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63  ;.    pBt->isExc
3310: 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  lusive = 0;.    
3320: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3330: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
3340: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3350: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
3380: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
3390: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33b0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33c0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
33d0: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
33e0: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
33f0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3400: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3420: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3430: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3440: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3450: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3460: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
3470: 20 74 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66   the isPending f
3480: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
3490: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
34a0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
34b0: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
34c0: 20 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64   BtShared.isPend
34d0: 69 6e 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ing must.    ** 
34e0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
34f0: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3500: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3510: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3520: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   */.    pBt->isP
3530: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a  ending = 0;.  }.
3540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3550: 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61  nction changes a
3560: 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68  ll write-locks h
3570: 65 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69  eld by Btree p i
3580: 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a  nto read-locks..
3590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
35a0: 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
35b0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
35c0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
35d0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35e0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d  >pBt;.  if( pBt-
35f0: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3600: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
3610: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  ;.    pBt->pWrit
3620: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3630: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
3640: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
3650: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ding = 0;.    fo
3660: 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f  r(pLock=pBt->pLo
3670: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
3680: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
3690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
36a0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ock->eLock==READ
36b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
36c0: 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20  pBtree==p );.   
36d0: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
36e0: 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
36f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66   }.  }.}..#endif
3700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3710: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3730: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
3740: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
3750: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
3770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3780: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
3790: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
37a0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
37b0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
37c0: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
37d0: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
37e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
37f0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
3800: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
3810: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
3820: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
3830: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
3840: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
3850: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
3860: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3870: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3880: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
3890: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
38a0: 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20  or cursor pCur, 
38b0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69  if any..*/.stati
38c0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
38d0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  eOverflowCache(B
38e0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
38f0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
3900: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
3910: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
3920: 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
3930: 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76  ow);.  pCur->aOv
3940: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f  erflow = 0;.}../
3950: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3960: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3970: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3980: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3990: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
39a0: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
39b0: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
39d0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
39e0: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
39f0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3a00: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3a10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3a20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3a30: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3a40: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3a50: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3a60: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3a70: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3a80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3a90: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3aa0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3ab0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3ac0: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3ad0: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3ae0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3af0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3b00: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3b10: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3b20: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3b30: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3b40: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3b50: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3b60: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3b70: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
3b80: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
3b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ba0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3bb0: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3bc0: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3bd0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3be0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3bf0: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3c00: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3c10: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3c20: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3c30: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3c40: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
3c50: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
3c60: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
3c70: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
3c80: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
3c90: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
3ca0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
3cb0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3cd0: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3ce0: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3cf0: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3d00: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3d10: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3d20: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
3d50: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
3d60: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
3d70: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
3d80: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
3d90: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
3da0: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
3db0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
3dc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
3dd0: 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ee->pBt;.  asser
3de0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
3df0: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
3e00: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3e10: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3e20: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3e30: 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
3e40: 48 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65  Handle && (isCle
3e50: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
3e60: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
3e70: 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
3e80: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
3e90: 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ID;.    }.  }.}.
3ea0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
3eb0: 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20   functions when 
3ec0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
3ed0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
3ee0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3ef0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
3f00: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
3f10: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f20: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3f30: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3f40: 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23  Cursors(x,y,z).#
3f50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3f60: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
3f70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
3f80: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
3f90: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
3fa0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
3fb0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
3fc0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
3fd0: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
3fe0: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
3ff0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4000: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4010: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4020: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4030: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4040: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4050: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4060: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
4070: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
4080: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
4090: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
40a0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
40b0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
40c0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
40d0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
40e0: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
40f0: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4100: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4110: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4120: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4130: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4140: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4150: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4160: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
4170: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
4180: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
4190: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
41a0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
41b0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
41c0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
41d0: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
41e0: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
41f0: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4200: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4210: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4220: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4230: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4240: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4250: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4260: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
4270: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
4280: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
4290: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
42a0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
42b0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
42c0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
42d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
42e0: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
42f0: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4300: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4310: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4320: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4330: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4340: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4350: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4360: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
4370: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
4380: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
4390: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
43a0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
43b0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
43c0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
43d0: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
43e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43f0: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4400: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4410: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4420: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4430: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4440: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4450: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4460: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4470: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4480: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4490: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
44a0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
44b0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
44c0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
44d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
44e0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
44f0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4500: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4510: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4520: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4530: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4540: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4560: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4570: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4580: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4590: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
45a0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
45b0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
45c0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
45d0: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
45e0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
45f0: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4600: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4610: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4620: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4630: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4640: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4650: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4660: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4670: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4680: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4690: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
46a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
46b0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
46c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
46d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
46e0: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
46f0: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4700: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4710: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4720: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4730: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4740: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4750: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
4770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
4780: 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76  gno<=sqlite3Bitv
4790: 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73  ecSize(pBt->pHas
47a0: 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20  Content) ){.    
47b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
47c0: 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43  ecSet(pBt->pHasC
47d0: 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  ontent, pgno);. 
47e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
47f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  }../*.** Query t
4800: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4810: 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a  Content vector..
4820: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4830: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f  eaf page is remo
4860: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
4870: 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65  free-list for re
4880: 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20  use. It returns 
4890: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
48a0: 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  afe to retrieve 
48b0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d  the.** page from
48c0: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
48d0: 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
48e0: 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
48f0: 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   True otherwise.
4900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4910: 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
4920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4930: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42   Pgno pgno){.  B
4940: 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e  itvec *p = pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72  pHasContent;.  r
4960: 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e  eturn (p && (pgn
4970: 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  o>sqlite3BitvecS
4980: 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65  ize(p) || sqlite
4990: 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70  3BitvecTest(p, p
49a0: 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gno)));.}../*.**
49b0: 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29   Clear (destroy)
49c0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49d0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49e0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
49f0: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74  .** invoked at t
4a00: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
4a10: 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e   each write-tran
4a20: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4a30: 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65  ic void btreeCle
4a40: 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  arHasContent(BtS
4a50: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
4a60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
4a70: 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  roy(pBt->pHasCon
4a80: 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48  tent);.  pBt->pH
4a90: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d  asContent = 0;.}
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4ab0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
4ac0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
4ad0: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
4ae0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
4af0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
4b00: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
4b10: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
4b20: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
4b30: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4b40: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
4b50: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
4b60: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
4b70: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
4b80: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
4b90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
4ba0: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
4bb0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
4bc0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
4bd0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
4be0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
4bf0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
4c00: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
4c10: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
4c20: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
4c30: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4c40: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
4c50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4c60: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
4c70: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
4c80: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
4c90: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
4ca0: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
4cb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
4cc0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
4cd0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
4ce0: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
4cf0: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
4d00: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
4d10: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
4d20: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
4d30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
4d40: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
4d50: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
4d60: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
4d70: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
4d80: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
4d90: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
4da0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
4db0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
4dc0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
4dd0: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
4de0: 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70   if( 0==pCur->ap
4df0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
4e00: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  ){.    void *pKe
4e10: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
4e20: 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  c( (int)pCur->nK
4e30: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
4e40: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
4e50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4e60: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
4e70: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
4e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4e90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ea0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
4eb0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4ed0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
4ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4ef0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
4f00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4f10: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
4f20: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
4f30: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
4f40: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
4f50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4f60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4f70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
4f80: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
4f90: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
4fa0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4fb0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72  [i]);.      pCur
4fc0: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
4fe0: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20  >iPage = -1;.   
4ff0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5000: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5010: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
5020: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5030: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
5040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5050: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5060: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5070: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5080: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5090: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
50a0: 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65    with root-page
50b0: 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c   iRoot. Usually,
50c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
50d0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
50e0: 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73  or.** pExcept is
50f0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5100: 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65  the table (Btree
5110: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5120: 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73  eInsert())..*/.s
5130: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5140: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5150: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5160: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5170: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5180: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
51a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
51b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
51c0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
51d0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
51e0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
51f0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5200: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5210: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5220: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5230: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20  Root==iRoot) && 
5240: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
5250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
5270: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
5280: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
5290: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
52a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
52b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
52c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
52d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
52e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
52f0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5300: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5310: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5320: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5330: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5340: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5350: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5370: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5380: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5390: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
53a0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
53b0: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
53c0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
53d0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
53e0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
53f0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5400: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5410: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5420: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5430: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5440: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5450: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5460: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5470: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5480: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5490: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
54a0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
54b0: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
54c0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
54d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
54e0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
54f0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5500: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5510: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5520: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5530: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5540: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5550: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5560: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5570: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5580: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5590: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
55a0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
55b0: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
55c0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
55d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5600: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5610: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5620: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5630: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5640: 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20  pace[150];      
5650: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5660: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5670: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5680: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
5690: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
56a0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
56b0: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
56c0: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
56d0: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
56e0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
56f0: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
5700: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
5710: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
5720: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
5730: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
5740: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
5750: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5760: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5770: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
5780: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
5790: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
57a0: 64 78 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  dxKey);.  }else{
57b0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
57c0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
57d0: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57e0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57f0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
5800: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
5810: 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  pFree ){.    sql
5820: 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d  ite3DbFree(pCur-
5830: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
5840: 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
5850: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5860: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
5870: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
5880: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
5890: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
58a0: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
58b0: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
58c0: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
58d0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
58e0: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
58f0: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
5900: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
5910: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
5920: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
5930: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
5940: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
5950: 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73  tive restoreCurs
5960: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
5970: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
5980: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5990: 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ion()..*/.static
59a0: 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72   int btreeRestor
59b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
59c0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
59d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
59e0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
59f0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5a00: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
5a10: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
5a20: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
5a30: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
5a40: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
5a50: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
5a60: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
5a70: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
5a80: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5a90: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
5aa0: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
5ab0: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
5ac0: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
5ad0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
5ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5af0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5b00: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
5b10: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
5b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
5b30: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
5b40: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
5b50: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
5b60: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20  NVALID );.  }.  
5b70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
5b80: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
5b90: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
5ba0: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
5bb0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5bc0: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62  K ? \.         b
5bd0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
5be0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
5bf0: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
5c00: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
5c10: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
5c20: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
5c30: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
5c40: 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20   position it.** 
5c50: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20  was last placed 
5c60: 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e  at.  Cursors can
5c70: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
5c80: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
5c90: 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65  ting.** at is de
5ca0: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
5cb0: 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  nder them..**.**
5cc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
5cd0: 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63  turns an error c
5ce0: 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ode if something
5cf0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68   goes wrong.  Th
5d00: 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48  e.** integer *pH
5d10: 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  asMoved is set t
5d20: 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72  o one if the cur
5d30: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e  sor has moved an
5d40: 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69  d 0 if not..*/.i
5d50: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
5d60: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74  ursorHasMoved(Bt
5d70: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
5d80: 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20  t *pHasMoved){. 
5d90: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
5da0: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
5db0: 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
5dc0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
5dd0: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
5de0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5df0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
5e00: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
5e10: 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e  D || pCur->skipN
5e20: 65 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70  ext!=0 ){.    *p
5e30: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
5e40: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73  }else{.    *pHas
5e50: 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  Moved = 0;.  }. 
5e60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5e70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
5e80: 75 70 20 74 68 65 20 63 6f 72 72 65 63 74 20 64  up the correct d
5e90: 61 74 61 20 70 6f 69 6e 74 65 72 73 20 66 6f 72  ata pointers for
5ea0: 20 61 20 4d 65 6d 50 61 67 65 0a 2a 2f 0a 73 74   a MemPage.*/.st
5eb0: 61 74 69 63 20 75 38 20 2a 62 74 72 65 65 47 65  atic u8 *btreeGe
5ec0: 74 44 61 74 61 28 4d 65 6d 50 61 67 65 20 2a 70  tData(MemPage *p
5ed0: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
5ee0: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
5ef0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
5f00: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 70  e->pDbPage);.  p
5f10: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
5f20: 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
5f30: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
5f40: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
5f50: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 70 50 61  >aCellIdx = &pPa
5f60: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
5f70: 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20  >cellOffset];.  
5f80: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 44  return pPage->aD
5f90: 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ata;.}../*.** Ma
5fa0: 6b 65 20 61 20 62 74 72 65 65 20 70 61 67 65 20  ke a btree page 
5fb0: 69 73 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  is writable..*/.
5fc0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
5fd0: 4d 61 6b 65 50 61 67 65 57 72 69 74 65 61 62 6c  MakePageWriteabl
5fe0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
5ff0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  ){.  int rc;.  r
6000: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
6010: 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
6020: 50 61 67 65 29 3b 0a 20 20 62 74 72 65 65 47 65  Page);.  btreeGe
6030: 74 44 61 74 61 28 70 50 61 67 65 29 3b 0a 20 20  tData(pPage);.  
6040: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
6050: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6060: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
6070: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
6080: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
6090: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
60a0: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
60b0: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
60c0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
60d0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
60e0: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
60f0: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
6100: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  age number..**.*
6110: 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20  * Return 0 (not 
6120: 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f  a valid page) fo
6130: 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20  r pgno==1 since 
6140: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70  there is.** no p
6150: 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63  ointer map assoc
6160: 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
6170: 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74  1.  The integrit
6180: 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a  y_check logic.**
6190: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70   requires that p
61a0: 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29  trmapPageno(*,1)
61b0: 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  !=1..*/.static P
61c0: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
61d0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
61e0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
61f0: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
6200: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
6210: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
6220: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6230: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6240: 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c  ) );.  if( pgno<
6250: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
6260: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6270: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
6280: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
6290: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
62a0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
62b0: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
62c0: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
62d0: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
62e0: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
62f0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
6300: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
6310: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
6320: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
6330: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
6340: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6350: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
6360: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
6370: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
6380: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
6390: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
63a0: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
63b0: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
63c0: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
63d0: 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43  '..**.** If *pRC
63e0: 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f   is initially no
63f0: 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49  n-zero (non-SQLI
6400: 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73  TE_OK) then this
6410: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61   routine is.** a
6420: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65   no-op.  If an e
6430: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
6440: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
6450: 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74  or code is writt
6460: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e  en.** into *pRC.
6470: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6480: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
6490: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
64a0: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
64b0: 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70  o parent, int *p
64c0: 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  RC){.  DbPage *p
64d0: 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20  DbPage;  /* The 
64e0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
64f0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
6500: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  p;      /* The p
6510: 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20  ointer map data 
6520: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  */.  Pgno iPtrma
6530: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  p;     /* The po
6540: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e  inter map page n
6550: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  umber */.  int o
6560: 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
6570: 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65  Offset in pointe
6580: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6590: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
65a0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
65b0: 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
65c0: 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ns */..  if( *pR
65d0: 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
65e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
65f0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
6600: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
6610: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
6620: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
6630: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
6640: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
6650: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
6660: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
6670: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
6680: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
6690: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
66a0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
66b0: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
66c0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
66d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
66e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
66f0: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
6700: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6710: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6720: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6730: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6740: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6750: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6760: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
6770: 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
6780: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
6790: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
67a0: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
67b0: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
67c0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
67d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
67e0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
67f0: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73  p_exit;.  }.  as
6800: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
6810: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
6820: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72  Size-5 );.  pPtr
6830: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6840: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6850: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
6860: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
6870: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
6880: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
6890: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
68a0: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
68b0: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
68c0: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
68d0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
68e0: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
68f0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
6900: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
6910: 20 20 20 70 50 74 72 6d 61 70 20 3d 20 73 71 6c     pPtrmap = sql
6920: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
6930: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
6940: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6950: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
6960: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
6970: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
6980: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6990: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
69a0: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
69b0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
69c0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
69d0: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
69e0: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
69f0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
6a00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6a10: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
6a20: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
6a30: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
6a40: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
6a50: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
6a60: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
6a70: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
6a80: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
6a90: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
6aa0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
6ab0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
6ac0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
6ad0: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
6ae0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
6af0: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
6b00: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
6b10: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
6b20: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
6b30: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
6b40: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6b50: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
6b60: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
6b70: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
6b80: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
6b90: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
6ba0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
6bb0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
6bc0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
6bd0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
6be0: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
6bf0: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
6c00: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
6c10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6c20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
6c30: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
6c40: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
6c50: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
6c60: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
6c70: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
6c80: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
6c90: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
6ca0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6cb0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
6cc0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
6cd0: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
6ce0: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
6cf0: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
6d00: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
6d10: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
6d20: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
6d30: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
6d40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6d50: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
6d60: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
6d70: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
6d80: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
6d90: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
6da0: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
6db0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6dc0: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
6dd0: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
6de0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6df0: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
6e00: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
6e10: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
6e20: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
6e30: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
6e40: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6e50: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6e60: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
6e70: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
6e80: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6e90: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
6ea0: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
6eb0: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
6ec0: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
6ed0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
6ee0: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
6ef0: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
6f00: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
6f10: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
6f20: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
6f30: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
6f40: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
6f50: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
6f60: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
6f70: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
6f80: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
6f90: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
6fa0: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
6fb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
6fc0: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
6fd0: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
6fe0: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
6ff0: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
7000: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
7010: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
7020: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
7030: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
7040: 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49  )->aCellIdx[2*(I
7050: 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69  )]))).#define fi
7060: 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49  ndCellv2(D,M,O,I
7070: 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65  ) (D+(M&get2byte
7080: 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a  (D+(O+2*(I))))).
7090: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
70a0: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
70b0: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
70c0: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
70d0: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
70e0: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
70f0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
7100: 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72  tic u8 *findOver
7110: 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65  flowCell(MemPage
7120: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
7130: 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ll){.  int i;.  
7140: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7150: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7160: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
7170: 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e  .  for(i=pPage->
7180: 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d  nOverflow-1; i>=
7190: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
71a0: 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f   k;.    struct _
71b0: 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b  OvflCell *pOvfl;
71c0: 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50  .    pOvfl = &pP
71d0: 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20  age->aOvfl[i];. 
71e0: 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64     k = pOvfl->id
71f0: 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43  x;.    if( k<=iC
7200: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
7210: 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k==iCell ){.   
7220: 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66       return pOvf
7230: 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  l->pCell;.      
7240: 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b  }.      iCell--;
7250: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7260: 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  urn findCell(pPa
7270: 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f  ge, iCell);.}../
7280: 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c  *.** Parse a cel
7290: 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20  l content block 
72a0: 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  and fill in the 
72b0: 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75  CellInfo structu
72c0: 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72  re.  There.** ar
72d0: 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  e two versions o
72e0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  f this function.
72f0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
7300: 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63  () takes a .** c
7310: 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65  ell index as the
7320: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
7330: 20 61 6e 64 20 62 74 72 65 65 50 61 72 73 65 43   and btreeParseC
7340: 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b  ellPtr() .** tak
7350: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
7360: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
7370: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
7380: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
7390: 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66  ** Within this f
73a0: 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65  ile, the parseCe
73b0: 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62  ll() macro can b
73c0: 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  e called instead
73d0: 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73   of.** btreePars
73e0: 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e  eCellPtr(). Usin
73f0: 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  g some compilers
7400: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66  , this will be f
7410: 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aster..*/.static
7420: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
7430: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
7440: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
7450: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
7460: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
7470: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
7480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7490: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
74a0: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
74b0: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
74c0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
74d0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
74e0: 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20  */.){.  u16 n;  
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
7510: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
7520: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
7530: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
7540: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7550: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
7560: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
7570: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7580: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7590: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
75a0: 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20   pInfo->pCell = 
75b0: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
75c0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
75d0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
75e0: 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65  1 );.  n = pPage
75f0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
7600: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34    assert( n==4-4
7610: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
7620: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
7630: 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Key ){.    if( p
7640: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
7650: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  .      n += getV
7660: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
7670: 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
7680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
7690: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
76a0: 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56   }.    n += getV
76b0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
76c0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
76d0: 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Key);.    pInfo-
76e0: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
76f0: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
7700: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30  pInfo->nData = 0
7710: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
7720: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
7730: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
7740: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
7750: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70  Payload;.  }.  p
7760: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
7770: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
7780: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
7790: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
77a0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
77b0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
77c0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
77d0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
77e0: 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  1 );.  if( likel
77f0: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
7800: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
7810: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
7820: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
7830: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
7840: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
7850: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
7860: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
7870: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
7880: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
7890: 20 20 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e     if( (pInfo->n
78a0: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e  Size = (u16)(n+n
78b0: 50 61 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49  Payload))<4 ) pI
78c0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
78d0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
78e0: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
78f0: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
7900: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d  verflow = 0;.  }
7910: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
7920: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
7930: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
7940: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
7950: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
7960: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
7970: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
7980: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
7990: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
79a0: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
79b0: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
79c0: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
79d0: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
79e0: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
79f0: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
7a00: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
7a10: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
7a20: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
7a30: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
7a40: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
7a50: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
7a60: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
7a70: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
7a80: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
7a90: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
7aa0: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
7ab0: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
7ac0: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
7ad0: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
7ae0: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
7af0: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
7b00: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
7b10: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
7b20: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
7b30: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
7b40: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
7b50: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
7b60: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
7b70: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
7b80: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
7b90: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
7ba0: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
7bb0: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
7bc0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
7bd0: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
7be0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
7bf0: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
7c00: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
7c10: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
7c20: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
7c30: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
7c40: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7c50: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
7c60: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
7c70: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
7c80: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
7c90: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
7ca0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
7cb0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
7cc0: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20  u16)surplus;.   
7cd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
7ce0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7cf0: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  16)minLocal;.   
7d00: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
7d10: 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28  verflow = (u16)(
7d20: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
7d30: 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  n);.    pInfo->n
7d40: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
7d50: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
7d60: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
7d70: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7d80: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74  l, pInfo) \.  bt
7d90: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7da0: 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c  (pPage), findCel
7db0: 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c  l((pPage), (iCel
7dc0: 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74  l)), (pInfo)).st
7dd0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
7de0: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
7df0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
7e00: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
7e10: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
7e20: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e40: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
7e50: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
7e60: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
7e70: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
7e80: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
7e90: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
7ea0: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
7eb0: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   iCell, pInfo);.
7ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
7ed0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
7ee0: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
7ef0: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
7f00: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
7f10: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
7f20: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
7f30: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
7f40: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
7f50: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
7f60: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
7f70: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
7f80: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
7f90: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
7fa0: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
7fb0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
7fc0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
7fd0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
7fe0: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
7ff0: 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65  u8 *pIter = &pCe
8000: 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ll[pPage->childP
8010: 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e  trSize];.  u32 n
8020: 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51  Size;..#ifdef SQ
8030: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
8040: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
8050: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
8060: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
8070: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
8080: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
8090: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
80a0: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
80b0: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
80c0: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
80d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
80e0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
80f0: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
8100: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
8110: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
8120: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
8130: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
8140: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
8150: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
8160: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
8170: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
8180: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
8190: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
81a0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
81b0: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20      u8 *pEnd;.  
81c0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
81d0: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49  Data ){.      pI
81e0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
81f0: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
8200: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8210: 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20     nSize = 0;.  
8220: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65    }..    /* pIte
8230: 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
8240: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
8250: 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20  er key value, a 
8260: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
8270: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e  .    ** integer.
8280: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
8290: 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72  lock moves pIter
82a0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
82b0: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
82c0: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
82d0: 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  of the key value
82e0: 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20  . */.    pEnd = 
82f0: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77  &pIter[9];.    w
8300: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
8310: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
8320: 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  End );.  }else{.
8330: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
8340: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
8350: 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74  nSize);.  }..  t
8360: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
8370: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8380: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
8390: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
83a0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
83b0: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
83c0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  xLocal ){.    in
83d0: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
83e0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
83f0: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
8400: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
8410: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
8420: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8430: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
8440: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
8450: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
8460: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
8470: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8480: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
8490: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
84a0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
84b0: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
84c0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
84d0: 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e  ze += 4;.  }.  n
84e0: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
84f0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20  ter - pCell);.. 
8500: 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20   /* The minimum 
8510: 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c  size of any cell
8520: 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a   is 4 bytes. */.
8530: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
8540: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  .    nSize = 4;.
8550: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
8560: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
8570: 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72  nSize );.  retur
8580: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
8590: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
85a0: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
85b0: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
85c0: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
85d0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
85e0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
85f0: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
8600: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
8610: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
8620: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
8630: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
8640: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
8650: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
8660: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
8670: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8680: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
8690: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
86a0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
86b0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
86c0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
86d0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
86e0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
86f0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
8700: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
8710: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
8720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
8730: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
8740: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
8750: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
8760: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
8770: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
8780: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8790: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
87a0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
87b0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
87c0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
87d0: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
87e0: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
87f0: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
8800: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
8810: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
8820: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
8830: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
8840: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
8850: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
8860: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
8870: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
8880: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
8890: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
88a0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
88b0: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
88c0: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
88d0: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
88e0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
88f0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
8900: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
8910: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
8920: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
8930: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
8940: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
8950: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
8960: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
8970: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
8980: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
8990: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
89a0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
89b0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
89c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
89d0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
89e0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
89f0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
8a00: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
8a10: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
8a20: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a40: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
8a50: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
8a60: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8a80: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
8a90: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
8aa0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8ab0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
8ac0: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
8ad0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
8ae0: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
8af0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
8b00: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
8b10: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
8b20: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
8b30: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
8b40: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
8b50: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
8b60: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
8b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8b80: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
8b90: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
8ba0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
8bb0: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
8bc0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
8bd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
8be0: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
8bf0: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
8c00: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
8c10: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
8c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
8c30: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
8c40: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
8c50: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
8c60: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
8c70: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
8c80: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
8c90: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8ca0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8cb0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
8cc0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
8cd0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
8ce0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
8cf0: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
8d00: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
8d10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8d20: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
8d30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
8d40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8d50: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8d60: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
8d70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
8d80: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
8d90: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
8da0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
8db0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
8dc0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
8dd0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
8de0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
8df0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
8e00: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
8e10: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
8e20: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
8e30: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
8e40: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
8e50: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
8e60: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
8e70: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
8e80: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
8e90: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
8ea0: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
8eb0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
8ec0: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
8ed0: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
8ee0: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
8ef0: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
8f00: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
8f10: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
8f20: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
8f30: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
8f40: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
8f50: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
8f60: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
8f70: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
8f80: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
8f90: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8fa0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
8fb0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8fc0: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
8fd0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8fe0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
8ff0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
9000: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
9010: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
9020: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
9030: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
9040: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
9050: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
9060: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
9070: 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20  K is defined .  
9080: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
9090: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
90a0: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
90b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
90c0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
90d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
90e0: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
90f0: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
9100: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
9110: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
9120: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
9130: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
9140: 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69  = size;.#if defi
9150: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9160: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
9170: 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63  CHECK).    if( c
9180: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29  brk<iCellFirst )
9190: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
91a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
91b0: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  PT;.    }.#else.
91c0: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
91d0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
91e0: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
91f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9200: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9210: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
9220: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
9230: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
9240: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
9250: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
9260: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
9270: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
9280: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
9290: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
92a0: 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e );.    memcpy(
92b0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
92c0: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
92d0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
92e0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
92f0: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
9300: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
9310: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9320: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
9330: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
9340: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
9350: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
9360: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
9370: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
9380: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
9390: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
93a0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
93b0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
93c0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
93d0: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
93e0: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
93f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9400: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9410: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
9420: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9430: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
9440: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
9450: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
9460: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
9470: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
9480: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
9490: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
94a0: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
94b0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
94c0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
94d0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
94e0: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
94f0: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
9500: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
9510: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
9520: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
9530: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
9540: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
9550: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
9560: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
9570: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
9580: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9590: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
95a0: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
95b0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
95c0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
95d0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
95e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
95f0: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
9600: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
9610: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
9620: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
9630: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
9640: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
9650: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
9660: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
9670: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
9680: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
9690: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
96a0: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
96b0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
96c0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
96d0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
96e0: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
96f0: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
9700: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
9710: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
9720: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
9730: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
9740: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
9750: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
9760: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
9770: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
9780: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
9790: 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20    int nFrag;    
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
97c0: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62   of fragmented b
97d0: 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ytes on pPage */
97e0: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9800: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9810: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
9820: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
9830: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
9840: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
9850: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
9860: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
9870: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
9880: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9890: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
98a0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
98b0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20   usableSize; /* 
98c0: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74  Usable size of t
98d0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20  he page */.  .  
98e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
98f0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9900: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9910: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9920: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
9930: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9940: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
9950: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9960: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
9970: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
9980: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
9990: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
99a0: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
99b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
99c0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
99d0: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
99e0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
99f0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73  sableSize;.  ass
9a00: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61  ert( nByte < usa
9a10: 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20  bleSize-8 );..  
9a20: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
9a30: 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  +7];.  assert( p
9a40: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
9a50: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
9a60: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
9a70: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
9a80: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
9a90: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f  age->nCell;.  to
9aa0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
9ab0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
9ac0: 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70  );.  if( gap>top
9ad0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
9ae0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9af0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
9b00: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
9b10: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
9b20: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
9b30: 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20 69 66  ap==top );..  if
9b40: 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20  ( nFrag>=60 ){. 
9b50: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 64 65 66     /* Always def
9b60: 72 61 67 6d 65 6e 74 20 68 69 67 68 6c 79 20 66  ragment highly f
9b70: 72 61 67 6d 65 6e 74 65 64 20 70 61 67 65 73 20  ragmented pages 
9b80: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  */.    rc = defr
9b90: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
9ba0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
9bb0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
9bc0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
9bd0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
9be0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ]);.  }else if( 
9bf0: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
9c00: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
9c10: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
9c20: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
9c30: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
9c40: 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74  atisfy .    ** t
9c50: 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65 20  he request. The 
9c60: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61  allocation is ma
9c70: 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  de from the firs
9c80: 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a  t free slot in .
9c90: 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20      ** the list 
9ca0: 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e  that is large en
9cb0: 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61  ough to accomada
9cc0: 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  te it..    */.  
9cd0: 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a    int pc, addr;.
9ce0: 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72      for(addr=hdr
9cf0: 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79  +1; (pc = get2by
9d00: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
9d10: 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20  >0; addr=pc){.  
9d20: 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20      int size;   
9d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9d40: 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f   of the free slo
9d50: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  t */.      if( p
9d60: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c  c>usableSize-4 |
9d70: 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a 20  | pc<addr+4 ){. 
9d80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9d90: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9da0: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
9db0: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
9dc0: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
9dd0: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e       if( size>=n
9de0: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
9df0: 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e  int x = size - n
9e00: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65  Byte;.        te
9e10: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
9e20: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9e30: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
9e40: 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20    if( x<4 ){.   
9e50: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
9e60: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
9e70: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
9e80: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
9e90: 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  of.          ** 
9ea0: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
9eb0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
9ec0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  . */.          m
9ed0: 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72  emcpy(&data[addr
9ee0: 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29  ], &data[pc], 2)
9ef0: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61  ;.          data
9f00: 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e  [hdr+7] = (u8)(n
9f10: 46 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20  Frag + x);.     
9f20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a     }else if( siz
9f30: 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a  e+pc > usableSiz
9f40: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
9f50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9f60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
9f70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9f80: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
9f90: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
9fa0: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
9fb0: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
9fc0: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  ount.          *
9fd0: 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  * for the portio
9fe0: 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65  n used by the ne
9ff0: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f  w allocation. */
a000: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62  .          put2b
a010: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c  yte(&data[pc+2],
a020: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   x);.        }. 
a030: 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70         *pIdx = p
a040: 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72  c + x;.        r
a050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a070: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
a080: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72  o make sure ther
a090: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
a0a0: 65 20 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20  e in the gap to 
a0b0: 73 61 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65  satisfy.  ** the
a0c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66   allocation.  If
a0d0: 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74   not, defragment
a0e0: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
a0f0: 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d  e( gap+2+nByte==
a100: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70  top );.  if( gap
a110: 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a  +2+nByte>top ){.
a120: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
a130: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
a140: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
a150: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
a160: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
a170: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
a180: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
a190: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
a1a0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
a1b0: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
a1c0: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
a1d0: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
a1e0: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
a1f0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
a200: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
a210: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61  reeInitPage() ca
a220: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
a230: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
a240: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
a250: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
a260: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
a270: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
a280: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
a290: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
a2a0: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
a2b0: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
a2c0: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
a2d0: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
a2e0: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
a2f0: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
a300: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
a310: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
a320: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
a330: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
a340: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
a350: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
a360: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
a370: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a390: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
a3a0: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
a3b0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
a3c0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
a3d0: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
a3e0: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
a3f0: 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a  ->aDisk[start].*
a400: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
a410: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22  f the block is "
a420: 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a  size" bytes..**.
a430: 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65  ** Most of the e
a440: 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e  ffort here is in
a450: 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73  volved in coales
a460: 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20  ing adjacent.** 
a470: 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f  free blocks into
a480: 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72   a single big fr
a490: 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  ee block..*/.sta
a4a0: 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63  tic int freeSpac
a4b0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
a4c0: 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74  , int start, int
a4d0: 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64   size){.  int ad
a4e0: 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b  dr, pbegin, hdr;
a4f0: 0a 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20  .  int iLast;   
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
a520: 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f  possible freeblo
a530: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75  ck offset */.  u
a540: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
a550: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
a560: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  a;..  assert( pP
a570: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
a580: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a590: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a5a0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a5b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
a5c0: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
a5d0: 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63  ffset+6+pPage->c
a5e0: 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20  hildPtrSize );. 
a5f0: 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20   assert( (start 
a600: 2b 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e 74 29  + size) <= (int)
a610: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a620: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
a630: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a640: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
a650: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
a660: 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29  ssert( size>=0 )
a670: 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  ;   /* Minimum c
a680: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
a690: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ..  if( pPage->p
a6a0: 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65  Bt->secureDelete
a6b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77   ){.    /* Overw
a6c0: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
a6d0: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
a6e0: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
a6f0: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a  ure_delete.    *
a700: 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  * option is enab
a710: 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
a720: 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  t(&data[start], 
a730: 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  0, size);.  }.. 
a740: 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63   /* Add the spac
a750: 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  e back into the 
a760: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66  linked list of f
a770: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65  reeblocks.  Note
a780: 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20   that.  ** even 
a790: 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62  though the freeb
a7a0: 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68  lock list was ch
a7b0: 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e  ecked by btreeIn
a7c0: 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62  itPage(),.  ** b
a7d0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64  treeInitPage() d
a7e0: 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  id not detect ov
a7f0: 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20  erlapping cells 
a800: 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  or.  ** freebloc
a810: 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70  ks that overlapp
a820: 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20  ed cells.   Nor 
a830: 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77  does it detect w
a840: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c  hen the.  ** cel
a850: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65  l content area e
a860: 78 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65  xceeds the value
a870: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
a880: 64 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20  der.  If these. 
a890: 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61   ** situations a
a8a0: 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65  rise, then subse
a8b0: 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65  quent insert ope
a8c0: 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f  rations might co
a8d0: 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66  rrupt.  ** the f
a8e0: 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20  reelist.  So we 
a8f0: 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  do need to check
a900: 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20   for corruption 
a910: 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20  while scanning. 
a920: 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
a930: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  ..  */.  hdr = p
a940: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
a950: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
a960: 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61  1;.  iLast = pPa
a970: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a980: 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72  ize - 4;.  asser
a990: 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20  t( start<=iLast 
a9a0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  );.  while( (pbe
a9b0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
a9c0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61  data[addr]))<sta
a9d0: 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29  rt && pbegin>0 )
a9e0: 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  {.    if( pbegin
a9f0: 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20  <addr+4 ){.     
aa00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
aa10: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
aa20: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62   }.    addr = pb
aa30: 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  egin;.  }.  if( 
aa40: 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a  pbegin>iLast ){.
aa50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aa60: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
aa70: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62    }.  assert( pb
aa80: 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65  egin>addr || pbe
aa90: 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32  gin==0 );.  put2
aaa0: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
aab0: 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32  , start);.  put2
aac0: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
aad0: 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75  ], pbegin);.  pu
aae0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
aaf0: 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  rt+2], size);.  
ab00: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
ab10: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75  Page->nFree + (u
ab20: 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43  16)size;..  /* C
ab30: 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74  oalesce adjacent
ab40: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a   free blocks */.
ab50: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
ab60: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
ab70: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
ab80: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
ab90: 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20  .    int pnext, 
aba0: 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73  psize, x;.    as
abb0: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
abc0: 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
abd0: 20 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e 74 29   pbegin <= (int)
abe0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
abf0: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
ac00: 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65  pnext = get2byte
ac10: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b  (&data[pbegin]);
ac20: 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74  .    psize = get
ac30: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
ac40: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  in+2]);.    if( 
ac50: 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b  pbegin + psize +
ac60: 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70   3 >= pnext && p
ac70: 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  next>0 ){.      
ac80: 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74  int frag = pnext
ac90: 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65   - (pbegin+psize
aca0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72  );.      if( (fr
acb0: 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28  ag<0) || (frag>(
acc0: 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29  int)data[hdr+7])
acd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
ace0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
acf0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
ad00: 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37        data[hdr+7
ad10: 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20  ] -= (u8)frag;. 
ad20: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
ad30: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b  e(&data[pnext]);
ad40: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
ad50: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78  &data[pbegin], x
ad60: 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65  );.      x = pne
ad70: 78 74 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  xt + get2byte(&d
ad80: 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20  ata[pnext+2]) - 
ad90: 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75  pbegin;.      pu
ada0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
adb0: 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  gin+2], x);.    
adc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
add0: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  r = pbegin;.    
ade0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
adf0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
ae00: 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68  area begins with
ae10: 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65   a freeblock, re
ae20: 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66  move it. */.  if
ae30: 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64  ( data[hdr+1]==d
ae40: 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61  ata[hdr+5] && da
ae50: 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b  ta[hdr+2]==data[
ae60: 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e  hdr+6] ){.    in
ae70: 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69  t top;.    pbegi
ae80: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
ae90: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
aea0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72  memcpy(&data[hdr
aeb0: 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69  +1], &data[pbegi
aec0: 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20  n], 2);.    top 
aed0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
aee0: 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62  [hdr+5]) + get2b
aef0: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
af00: 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79  +2]);.    put2by
af10: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
af20: 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73   top);.  }.  ass
af30: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
af40: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
af50: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
af60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
af70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
af80: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
af90: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
afa0: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
afb0: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
afc0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
afd0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
afe0: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
aff0: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
b000: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
b010: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
b020: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
b030: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
b040: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
b050: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
b060: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
b070: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
b080: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
b090: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
b0a0: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
b0b0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
b0c0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
b0d0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
b0e0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
b0f0: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
b100: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
b110: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
b120: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
b130: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
b140: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
b150: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
b160: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
b170: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
b180: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
b190: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
b1a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b1b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b1c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
b1d0: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
b1e0: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
b1f0: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
b200: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
b210: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
b220: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
b230: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
b240: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
b250: 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20  ->leaf;.  pBt = 
b260: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66  pPage->pBt;.  if
b270: 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46  ( flagByte==(PTF
b280: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
b290: 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70  INTKEY) ){.    p
b2a0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
b2b0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
b2c0: 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Data = pPage->le
b2d0: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
b2e0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
b2f0: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
b300: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
b310: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
b320: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
b330: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
b340: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
b350: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Key = 0;.    pPa
b360: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b  ge->hasData = 0;
b370: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
b380: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
b390: 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  ocal;.    pPage-
b3a0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
b3b0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c  >minLocal;.  }el
b3c0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
b3d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b3e0: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
b3f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b400: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b410: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
b420: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
b430: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
b440: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
b450: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
b460: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
b470: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
b480: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
b490: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
b4a0: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
b4b0: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
b4c0: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
b4d0: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
b4e0: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
b4f0: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
b500: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
b510: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
b520: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
b530: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
b540: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
b550: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
b560: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
b570: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
b580: 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  age){..  assert(
b590: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
b5a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b5b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b5c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b5d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b5e0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
b5f0: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
b600: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
b610: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
b620: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
b630: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
b640: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b650: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b660: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
b670: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
b680: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
b690: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
b6a0: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
b6b0: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
b6c0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
b6d0: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
b6e0: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
b6f0: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
b700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b710: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
b720: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
b730: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
b740: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
b750: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
b760: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
b770: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
b780: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
b790: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
b7a0: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
b7b0: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
b7c0: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
b7d0: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
b7e0: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
b7f0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
b800: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
b810: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
b820: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
b830: 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
b840: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b850: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
b860: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
b870: 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20     int top;     
b880: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
b890: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
b8a0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
b8b0: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72      int iCellFir
b8c0: 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
b8d0: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
b8e0: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
b8f0: 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  et */.    int iC
b900: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
b910: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
b920: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
b930: 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70  offset */..    p
b940: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
b950: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
b960: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
b970: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
b980: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64  aData;.    if( d
b990: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
b9a0: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
b9b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b9c0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
b9d0: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
b9e0: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
b9f0: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
ba00: 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  6 );.    pPage->
ba10: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
ba20: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
ba30: 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   1);.    pPage->
ba40: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
ba50: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
ba60: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
ba70: 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  .    pPage->cell
ba80: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
ba90: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
baa0: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
bab0: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
bac0: 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62  End = &data[usab
bad0: 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61  leSize];.    pPa
bae0: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
baf0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
bb00: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
bb10: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
bb20: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
bb30: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
bb40: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bb50: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
bb60: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
bb70: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
bb80: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
bb90: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
bba0: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
bbb0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
bbc0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
bbd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bbe0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  PT;.    }.    te
bbf0: 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
bc00: 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42  Cell==MX_CELL(pB
bc10: 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  t) );..    /* A 
bc20: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
bc30: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
bc40: 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
bc50: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
bc60: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
bc70: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
bc80: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
bc90: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
bca0: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
bcb0: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
bcc0: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
bcd0: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
bce0: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
bcf0: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
bd00: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
bd10: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
bd20: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
bd30: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  does..    */.   
bd40: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
bd50: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
bd60: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
bd70: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
bd80: 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64  eSize - 4;.#if d
bd90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
bda0: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
bdb0: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a  LL_CHECK).    {.
bdc0: 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
bdd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
bde0: 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70   into the cell p
bdf0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
be00: 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20        int sz;   
be10: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
be20: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20  of a cell */..  
be30: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
be40: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
be50: 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  --;.      for(i=
be60: 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
be70: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
be80: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
be90: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
bea0: 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  i*2]);.        t
beb0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
bec0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
bed0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
bee0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
bef0: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
bf00: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
bf10: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
bf20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bf30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
bf40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bf50: 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65     sz = cellSize
bf60: 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
bf70: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  [pc]);.        t
bf80: 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
bf90: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
bfa0: 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e        if( pc+sz>
bfb0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
bfc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
bfd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bfe0: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
bff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c000: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
c010: 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20  CellLast++;.    
c020: 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  }  .#endif..    
c030: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
c040: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
c050: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
c060: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
c070: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
c080: 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61      nFree = data
c090: 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20  [hdr+7] + top;. 
c0a0: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
c0b0: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
c0c0: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
c0d0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
c0e0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
c0f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74  ){.        /* St
c100: 61 72 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63  art of free bloc
c110: 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67  k is off the pag
c120: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
c130: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c140: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
c150: 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  }.      next = g
c160: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
c170: 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d  ]);.      size =
c180: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c190: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
c1a0: 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  ( (next>0 && nex
c1b0: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c  t<=pc+size+3) ||
c1c0: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
c1d0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
c1e0: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75  * Free blocks mu
c1f0: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
c200: 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68  ng order. And th
c210: 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 09  e last byte of..
c220: 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63  ** the free-bloc
c230: 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68  k must lie on th
c240: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  e database page.
c250: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
c260: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c270: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
c280: 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
c290: 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
c2a0: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
c2b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
c2c0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
c2d0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
c2e0: 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
c2f0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
c300: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
c310: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
c320: 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
c330: 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
c340: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
c350: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
c360: 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
c370: 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
c380: 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
c390: 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
c3a0: 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
c3b0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
c3c0: 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
c3d0: 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
c3e0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
c3f0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
c400: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
c410: 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
c420: 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
c430: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
c440: 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
c450: 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
c460: 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
c470: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
c480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c490: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c4a0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
c4b0: 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72  Free = (u16)(nFr
c4c0: 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29  ee - iCellFirst)
c4d0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
c4e0: 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
c4f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
c510: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
c520: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
c530: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
c540: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
c550: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
c560: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
c570: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
c580: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
c590: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
c5a0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
c5b0: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
c5c0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
c5d0: 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
c5e0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
c5f0: 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
c600: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c610: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
c620: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
c630: 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
c640: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
c650: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
c660: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
c670: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
c680: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c690: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
c6a0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
c6b0: 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
c6c0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
c6d0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
c6e0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
c6f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
c700: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
c710: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
c720: 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65  Bt->secureDelete
c730: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
c740: 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
c750: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c760: 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
c770: 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
c780: 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
c790: 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61  dr + 8 + 4*((fla
c7a0: 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20  gs&PTF_LEAF)==0 
c7b0: 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ?1:0);.  memset(
c7c0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
c7d0: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
c7e0: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
c7f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
c800: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c810: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
c820: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
c830: 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
c840: 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
c850: 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
c860: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
c870: 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61  set = hdr;.  pPa
c880: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
c890: 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
c8a0: 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
c8b0: 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
c8c0: 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  e];.  pPage->aCe
c8d0: 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69  llIdx = &data[fi
c8e0: 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  rst];.  pPage->n
c8f0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
c900: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
c910: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
c920: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
c930: 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  36 );.  pPage->m
c940: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
c950: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
c960: 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  1);.  pPage->nCe
c970: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ll = 0;.  pPage-
c980: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a  >isInit = 1;.}..
c990: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
c9a0: 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64   DbPage obtained
c9b0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
c9c0: 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75  into a MemPage u
c9d0: 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74  sed by.** the bt
c9e0: 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74  ree layer..*/.st
c9f0: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
ca00: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
ca10: 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
ca20: 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74  e, Pgno pgno, Bt
ca30: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
ca40: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
ca50: 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
ca60: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
ca70: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
ca80: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
ca90: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
caa0: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
cab0: 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
cac0: 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  age;.  pPage->pB
cad0: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
cae0: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
caf0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
cb00: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
cb10: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
cb20: 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
cb30: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
cb40: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
cb50: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
cb60: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
cb70: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
cb80: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
cb90: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  needed..**.** If
cba0: 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
cbb0: 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
cbc0: 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
cbd0: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a  not care about.*
cbe0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
cbf0: 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
cc00: 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
cc10: 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
cc20: 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
cc30: 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
cc40: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
cc50: 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
cc60: 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
cc70: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
cc80: 63 61 6c 6c 20 62 74 72 65 65 4d 61 6b 65 50 61  call btreeMakePa
cc90: 67 65 57 72 69 74 65 61 62 6c 65 28 29 20 6f 6e  geWriteable() on
cca0: 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74   this page, that
ccb0: 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76  .** means we hav
ccc0: 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20  e started to be 
ccd0: 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
cce0: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
ccf0: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f  disk.** read sho
cd00: 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
cd10: 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  t point..*/.stat
cd20: 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50  ic int btreeGetP
cd30: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
cd40: 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
cd50: 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
cd60: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
cd70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
cd80: 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
cd90: 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
cda0: 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
cdb0: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
cdc0: 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
cdd0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
cde0: 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  ent        /* Do
cdf0: 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63   not load page c
ce00: 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a  ontent if true *
ce10: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
ce20: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
ce30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
ce40: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ce50: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ce60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
ce70: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
ce80: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
ce90: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
cea0: 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69   noContent);.  i
ceb0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
cec0: 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
ced0: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
cee0: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
cef0: 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
cf00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
cf10: 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
cf20: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
cf30: 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
cf40: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
cf50: 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
cf60: 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
cf70: 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
cf80: 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
cf90: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
cfa0: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
cfb0: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
cfc0: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
cfd0: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
cfe0: 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
cff0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
d000: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
d010: 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
d020: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d030: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
d040: 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
d050: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
d060: 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
d070: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
d080: 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
d090: 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
d0a0: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
d0b0: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
d0c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d0d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
d0e0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
d0f0: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
d100: 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
d110: 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
d120: 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
d130: 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
d140: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
d150: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42  btreePagecount(B
d160: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
d170: 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61   return pBt->nPa
d180: 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65  ge;.}.u32 sqlite
d190: 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42  3BtreeLastPage(B
d1a0: 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
d1b0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
d1c0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
d1d0: 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e  .  assert( ((p->
d1e0: 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30  pBt->nPage)&0x80
d1f0: 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72  00000)==0 );.  r
d200: 65 74 75 72 6e 20 28 69 6e 74 29 62 74 72 65 65  eturn (int)btree
d210: 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74  Pagecount(p->pBt
d220: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
d230: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
d240: 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
d250: 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72  lize it.  This r
d260: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
d270: 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  .** convenience 
d280: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
d290: 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f  eparate calls to
d2a0: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
d2b0: 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69  and .** btreeIni
d2c0: 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  tPage()..**.** I
d2d0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
d2e0: 73 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  s, then the valu
d2f0: 65 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  e *ppPage is set
d300: 20 74 6f 20 69 73 20 75 6e 64 65 66 69 6e 65 64   to is undefined
d310: 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61  . It.** may rema
d320: 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72  in unchanged, or
d330: 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74   it may be set t
d340: 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c  o an invalid val
d350: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
d360: 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
d370: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
d380: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
d390: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d3a0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
d3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d3c0: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
d3d0: 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
d3e0: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20  Page **ppPage   
d3f0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
d400: 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
d410: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
d420: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d430: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
d440: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
d450: 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61  if( pgno>btreePa
d460: 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
d470: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d480: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
d490: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
d4a0: 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
d4b0: 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
d4c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
d4d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d4e0: 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
d4f0: 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  tPage(*ppPage);.
d500: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
d510: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d520: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
d530: 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  ppPage);.      }
d540: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65  .    }.  }..  te
d550: 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20  stcase( pgno==0 
d560: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
d570: 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  o!=0 || rc==SQLI
d580: 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20  TE_CORRUPT );.  
d590: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
d5a0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
d5b0: 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
d5c0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
d5d0: 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
d5e0: 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72  r.** call to btr
d5f0: 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  eeGetPage..*/.st
d600: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
d610: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
d620: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
d630: 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
d640: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
d650: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
d660: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
d670: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d680: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
d690: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
d6a0: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
d6b0: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 73      /* assert( s
d6c0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d6d0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d6e0: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
d6f0: 20 29 3b 20 2a 2f 0a 20 20 20 20 61 73 73 65 72   ); */.    asser
d700: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d710: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
d720: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
d730: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
d740: 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
d750: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
d760: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
d770: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
d780: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
d790: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
d7a0: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
d7b0: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
d7c0: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
d7d0: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
d7e0: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
d7f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
d800: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
d810: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
d820: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
d830: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d840: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
d850: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
d860: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
d870: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
d880: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
d890: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
d8a0: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
d8b0: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
d8c0: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
d8d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
d8e0: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
d8f0: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
d900: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
d910: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d920: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
d930: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
d940: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
d950: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
d960: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d970: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
d980: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
d990: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
d9a0: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
d9b0: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
d9c0: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
d9d0: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
d9e0: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
d9f0: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
da00: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
da10: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
da20: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
da30: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
da40: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
da50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
da60: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
da70: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
da80: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
da90: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
daa0: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
dab0: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
dac0: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
dad0: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
dae0: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
daf0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
db00: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
db10: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
db20: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
db30: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
db40: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
db50: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
db60: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
db70: 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
db80: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
db90: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
dba0: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
dbb0: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
dbc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
dbd0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
dbe0: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
dbf0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
dc00: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
dc10: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
dc20: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
dc30: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
dc40: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
dc50: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
dc60: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
dc70: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
dc80: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
dc90: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
dca0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
dcb0: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
dcc0: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
dcd0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
dce0: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
dcf0: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
dd00: 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
dd10: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
dd20: 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
dd30: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
dd40: 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
dd50: 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
dd60: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
dd70: 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
dd80: 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
dd90: 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
dda0: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
ddb0: 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
ddc0: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
ddd0: 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
dde0: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
ddf0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
de00: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
de10: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
de20: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
de30: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
de40: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
de50: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
de60: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
de70: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
de80: 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
de90: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
dea0: 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
deb0: 20 62 69 74 73 0a 2a 2a 20 42 54 52 45 45 5f 4f   bits.** BTREE_O
dec0: 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f  MIT_JOURNAL and/
ded0: 6f 72 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44  or BTREE_NO_READ
dee0: 4c 4f 43 4b 2e 20 20 54 68 65 20 42 54 52 45 45  LOCK.  The BTREE
def0: 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 0a 2a 2a 20  _NO_READLOCK.** 
df00: 62 69 74 20 69 73 20 61 6c 73 6f 20 73 65 74 20  bit is also set 
df10: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 6f  if the SQLITE_No
df20: 52 65 61 64 6c 6f 63 6b 20 66 6c 61 67 73 20 69  Readlock flags i
df30: 73 20 73 65 74 20 69 6e 20 64 62 2d 3e 66 6c 61  s set in db->fla
df40: 67 73 2e 0a 2a 2a 20 54 68 65 73 65 20 66 6c 61  gs..** These fla
df50: 67 73 20 61 72 65 20 70 61 73 73 65 64 20 74 68  gs are passed th
df60: 72 6f 75 67 68 20 69 6e 74 6f 20 73 71 6c 69 74  rough into sqlit
df70: 65 33 50 61 67 65 72 4f 70 65 6e 28 29 20 61 6e  e3PagerOpen() an
df80: 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65  d must.** be the
df90: 20 73 61 6d 65 20 76 61 6c 75 65 73 20 61 73 20   same values as 
dfa0: 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
dfb0: 41 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f  AL and PAGER_NO_
dfc0: 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  READLOCK..**.** 
dfd0: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
dfe0: 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
dff0: 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
e000: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e010: 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
e020: 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
e030: 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
e040: 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
e050: 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
e060: 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
e070: 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
e080: 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
e090: 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
e0a0: 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
e0b0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
e0c0: 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
e0d0: 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
e0e0: 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
e0f0: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
e100: 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
e110: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
e120: 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56  *pVfs,      /* V
e130: 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
e140: 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63  is b-tree */.  c
e150: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
e160: 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
e170: 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
e180: 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
e190: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
e1a0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
e1b0: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
e1c0: 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
e1d0: 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
e1e0: 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
e1f0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
e200: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
e210: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
e220: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
e230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
e240: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
e250: 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
e260: 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
e270: 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
e280: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
e290: 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
e2a0: 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
e2b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
e2c0: 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
e2d0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
e2e0: 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e300: 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
e310: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  n */.  sqlite3_m
e320: 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20  utex *mutexOpen 
e330: 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74  = 0;  /* Prevent
e340: 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
e350: 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37  on. Ticket #3537
e360: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
e370: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e380: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
e390: 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ode from this fu
e3a0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e  nction */.  u8 n
e3b0: 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20  Reserve;        
e3c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
e3d0: 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  te of unused spa
e3e0: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
e3f0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
e400: 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
e410: 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ];  /* Database 
e420: 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a  header content *
e430: 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20  /..  /* True if 
e440: 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d  opening an ephem
e450: 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20  eral, temporary 
e460: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
e470: 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62  nst int isTempDb
e480: 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20   = zFilename==0 
e490: 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
e4a0: 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  =0;..  /* Set th
e4b0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
e4c0: 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
e4d0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
e4e0: 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
e4f0: 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
e500: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a  based database..
e510: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
e520: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
e530: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
e540: 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  emdb = 0;.#else.
e550: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
e560: 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65  mdb = (zFilename
e570: 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65   && strcmp(zFile
e580: 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
e590: 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  )==0).          
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
e5b0: 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c  (isTempDb && sql
e5c0: 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
e5d0: 28 64 62 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  (db));.#endif.. 
e5e0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
e5f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
e600: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e610: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
e620: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
e630: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
e640: 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
e650: 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
e660: 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
e670: 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
e680: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
e690: 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
e6a0: 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
e6b0: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
e6c0: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
e6d0: 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
e6e0: 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
e6f0: 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
e700: 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
e710: 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
e720: 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
e730: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
e740: 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
e750: 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
e760: 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
e770: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
e780: 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f   SQLITE_NoReadlo
e790: 63 6b 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  ck ){.    flags 
e7a0: 7c 3d 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44  |= BTREE_NO_READ
e7b0: 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  LOCK;.  }.  if( 
e7c0: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66  isMemdb ){.    f
e7d0: 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45  lags |= BTREE_ME
e7e0: 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MORY;.  }.  if( 
e7f0: 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
e800: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
e810: 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20  !=0 && (isMemdb 
e820: 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a  || isTempDb) ){.
e830: 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28      vfsFlags = (
e840: 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49  vfsFlags & ~SQLI
e850: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
e860: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54   | SQLITE_OPEN_T
e870: 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20  EMP_DB;.  }.  p 
e880: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
e890: 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65  ero(sizeof(Btree
e8a0: 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  ));.  if( !p ){.
e8b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e8c0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
e8d0: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
e8e0: 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20  S_NONE;.  p->db 
e8f0: 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  = db;.#ifndef SQ
e900: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
e910: 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b  _CACHE.  p->lock
e920: 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  .pBtree = p;.  p
e930: 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20  ->lock.iTable = 
e940: 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  1;.#endif..#if !
e950: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e960: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
e970: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
e980: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
e990: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  /*.  ** If t
e9a0: 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63  his Btree is a c
e9b0: 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61  andidate for sha
e9c0: 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74  red cache, try t
e9d0: 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65  o find an.  ** e
e9e0: 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64  xisting BtShared
e9f0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20   object that we 
ea00: 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20  can share with. 
ea10: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64   */.  if( isMemd
ea20: 62 3d 3d 30 20 26 26 20 69 73 54 65 6d 70 44 62  b==0 && isTempDb
ea30: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 76  ==0 ){.    if( v
ea40: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
ea50: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
ea60: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
ea70: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
ea80: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
ea90: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
eaa0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
eab0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
eac0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
ead0: 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
eae0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
eaf0: 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
eb00: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
eb10: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
eb20: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
eb30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
eb40: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
eb50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
eb60: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
eb70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
eb80: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
eb90: 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
eba0: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
ebb0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
ebc0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
ebd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ebe0: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
ebf0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  me);.        sql
ec00: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
ec10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
ec20: 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  .      }.#if SQL
ec30: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
ec40: 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d       mutexOpen =
ec50: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
ec60: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
ec70: 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20  STATIC_OPEN);.  
ec80: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
ec90: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65  x_enter(mutexOpe
eca0: 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53  n);.      mutexS
ecb0: 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
ecc0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
ecd0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
ece0: 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c  STER);.      sql
ecf0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
ed00: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23  (mutexShared);.#
ed10: 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28  endif.      for(
ed20: 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
ed30: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
ed40: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
ed50: 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
ed60: 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
ed70: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
ed80: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
ed90: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
eda0: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
edb0: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
edc0: 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  ->pPager)).     
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
ede0: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
edf0: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
ee00: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
ee10: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
ee20: 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
ee30: 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
ee40: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
ee50: 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
ee60: 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
ee70: 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
ee80: 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
ee90: 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
eea0: 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
eeb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
eec0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
eed0: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
eee0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
eef0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
ef00: 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
ef10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ef20: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
ef30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ef40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
ef50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ef60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ef70: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
ef80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ef90: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
efa0: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
efb0: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
efc0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
efd0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
efe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
eff0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f000: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
f010: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f020: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
f030: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
f040: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
f050: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
f060: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
f070: 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
f080: 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
f090: 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
f0a0: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
f0b0: 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
f0c0: 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
f0d0: 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
f0e0: 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
f0f0: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
f100: 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
f110: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
f120: 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
f130: 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
f140: 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
f150: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
f160: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
f170: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
f180: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
f190: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
f1a0: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
f1b0: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
f1c0: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
f1d0: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
f1e0: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
f1f0: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
f200: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
f210: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
f220: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
f230: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
f240: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
f250: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
f260: 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
f270: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f280: 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(i64)==8 || si
f290: 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a  zeof(i64)==4 );.
f2a0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f2b0: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
f2c0: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
f2d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f2e0: 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
f2f0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
f300: 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
f310: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
f320: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
f330: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
f340: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
f350: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
f360: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
f370: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
f380: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
f390: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f3a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
f3b0: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
f3c0: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
f3d0: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
f400: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
f410: 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69  Flags, pageReini
f420: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
f430: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f440: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
f450: 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
f460: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
f470: 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
f480: 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
f490: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
f4a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f4b0: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
f4c0: 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
f4d0: 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pBt->openFlags 
f4e0: 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20  = (u8)flags;.   
f4f0: 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
f500: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
f510: 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42  etBusyhandler(pB
f520: 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
f530: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
f540: 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
f550: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
f560: 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
f570: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
f580: 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ge1 = 0;.    pBt
f590: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c  ->readOnly = sql
f5a0: 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
f5b0: 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29  nly(pBt->pPager)
f5c0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f5d0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
f5e0: 20 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c    pBt->secureDel
f5f0: 65 74 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ete = 1;.#endif.
f600: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
f610: 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
f620: 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
f630: 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
f640: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
f650: 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
f660: 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
f670: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
f680: 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
f690: 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
f6a0: 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
f6b0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
f6c0: 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
f6d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f6e0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
f6f0: 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
f700: 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
f710: 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
f720: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
f730: 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
f740: 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
f750: 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
f760: 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
f770: 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
f780: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
f790: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
f7a0: 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
f7b0: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
f7c0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
f7d0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
f7e0: 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
f7f0: 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
f800: 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
f810: 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
f820: 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
f830: 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
f840: 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
f850: 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
f860: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
f870: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
f880: 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
f890: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
f8a0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
f8b0: 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
f8c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
f8d0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
f8e0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
f8f0: 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
f900: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
f910: 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
f920: 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
f930: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65  lse{.      nRese
f940: 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
f950: 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
f960: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
f970: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
f980: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
f990: 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
f9a0: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
f9b0: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
f9c0: 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
f9d0: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
f9e0: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
f9f0: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
fa00: 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
fa10: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
fa20: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
fa30: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
fa40: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
fa50: 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
fa60: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
fa70: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
fa80: 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
fa90: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
faa0: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
fab0: 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
fac0: 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
fad0: 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
fae0: 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
faf0: 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
fb00: 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
fb10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
fb20: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
fb30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
fb40: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
fb50: 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
fb60: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
fb70: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
fb80: 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
fb90: 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
fba0: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
fbb0: 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  ){.      MUTEX_L
fbc0: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
fbd0: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
fbe0: 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ; ).      pBt->n
fbf0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d  Ref = 1;.      M
fc00: 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
fc10: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
fc20: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
fc30: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
fc40: 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
fc50: 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
fc60: 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
fc70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
fc80: 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
fc90: 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
fca0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
fcb0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
fcc0: 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
fcd0: 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
fce0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
fcf0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
fd00: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
fd10: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
fd20: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
fd30: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
fd40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
fd50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
fd60: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
fd70: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
fd80: 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
fd90: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
fda0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
fdb0: 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
fdc0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
fdd0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
fde0: 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
fdf0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fe00: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
fe10: 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
fe20: 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
fe30: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
fe40: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
fe50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
fe60: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
fe70: 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
fe80: 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
fe90: 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
fea0: 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
feb0: 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
fec0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
fed0: 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
fee0: 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
fef0: 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
ff00: 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
ff10: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
ff20: 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
ff30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
ff40: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
ff50: 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
ff60: 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
ff70: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
ff80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
ff90: 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
ffa0: 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
ffb0: 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
ffc0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
ffd0: 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
ffe0: 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
fff0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
10000 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74  p->pBt<pSib->pBt
10010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
10020 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
10030 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
10040 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
10050 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
10060 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10070 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
10080 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
10090 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42   pSib->pNext->pB
100a0 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  t<p->pBt ){.    
100b0 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
100c0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
100d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
100e0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
100f0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
10100 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
10110 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
10120 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
10130 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
10140 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
10150 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10160 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
10170 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
10180 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
10190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
101a0 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
101b0 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
101c0 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
101d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
101e0 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
101f0 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
10200 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
10210 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
10220 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
10230 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
10240 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
10250 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
10260 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
10270 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
10280 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
10290 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
102a0 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
102b0 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
102c0 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76      ** default v
102d0 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68  alue. Except, wh
102e0 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e  en opening on an
102f0 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
10300 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20   pager-cache,.  
10310 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e    ** do not chan
10320 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  ge the pager-cac
10330 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  he size..    */.
10340 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
10350 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c  treeSchema(p, 0,
10360 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
10370 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
10380 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d  achesize(p->pBt-
10390 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
103a0 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
103b0 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ZE);.    }.  }. 
103c0 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
103d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
103e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
103f0 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
10400 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10410 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
10420 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10430 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
10440 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
10450 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
10460 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
10470 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
10480 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
10490 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
104a0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
104b0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
104c0 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
104d0 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
104e0 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
104f0 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
10500 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
10510 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
10520 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
10530 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
10540 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
10550 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10560 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
10570 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
10580 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
10590 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
105a0 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
105b0 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
105c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
105d0 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
105e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
105f0 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
10600 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
10610 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
10620 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
10630 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
10640 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
10650 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
10660 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
10670 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
10680 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
10690 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
106a0 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
106b0 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
106c0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
106d0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
106e0 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
106f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10700 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
10710 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
10720 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10730 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
10740 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
10750 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
10760 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
10770 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
10780 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
10790 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
107a0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
107b0 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
107c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
107d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
107e0 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
107f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10800 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
10810 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
10820 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
10830 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
10840 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
10850 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
10860 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
10870 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
10880 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
10890 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
108a0 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
108b0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
108c0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
108d0 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
108e0 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
108f0 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
10900 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
10910 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
10920 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
10930 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
10940 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
10950 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
10960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
10970 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
10980 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
10990 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
109a0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
109b0 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
109c0 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
109d0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
109e0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
109f0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
10a00 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
10a10 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
10a20 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
10a30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10a40 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
10a50 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
10a60 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10a70 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
10a80 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
10a90 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
10aa0 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
10ab0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
10ac0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10ad0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10ae0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10af0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
10b00 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
10b10 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
10b20 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
10b30 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
10b40 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
10b50 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
10b60 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
10b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10b80 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
10b90 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
10ba0 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
10bb0 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
10bc0 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
10bd0 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
10be0 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
10bf0 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
10c00 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
10c10 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
10c20 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
10c30 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
10c40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
10c50 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
10c60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10c70 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
10c80 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
10c90 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
10ca0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
10cb0 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
10cc0 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
10cd0 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
10ce0 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
10cf0 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
10d00 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
10d10 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
10d20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
10d30 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
10d40 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
10d50 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
10d60 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
10d70 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
10d80 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
10d90 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
10da0 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
10db0 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
10dc0 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
10dd0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
10de0 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
10df0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
10e00 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
10e10 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
10e20 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
10e30 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
10e40 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
10e50 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
10e60 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
10e70 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
10e80 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
10e90 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
10ea0 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
10eb0 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
10ec0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10ed0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
10ee0 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10ef0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
10f00 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
10f10 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
10f20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10f30 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
10f40 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
10f50 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
10f60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
10f70 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
10f80 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
10f90 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
10fa0 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
10fb0 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
10fc0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
10fd0 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
10fe0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11000 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
11010 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
11020 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
11030 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
11040 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
11050 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
11060 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
11070 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
11080 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
11090 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
110a0 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
110b0 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
110c0 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
110d0 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
110e0 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
110f0 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
11100 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
11110 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
11120 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
11130 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
11140 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
11150 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
11160 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
11170 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
11180 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
11190 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
111a0 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
111b0 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
111c0 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
111d0 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
111e0 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
111f0 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
11200 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
11210 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
11220 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
11230 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
11240 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
11250 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
11260 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
11270 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
11280 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
11290 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
112a0 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
112b0 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
112c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
112d0 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
112e0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
112f0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
11300 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
11310 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11320 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
11330 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
11340 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11350 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11360 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
11370 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
11380 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
11390 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
113a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
113b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
113c0 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
113d0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
113e0 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
113f0 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
11400 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
11410 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
11420 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
11430 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
11440 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
11450 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
11460 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
11470 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
11480 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
11490 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
114a0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
114b0 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
114c0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
114d0 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
114e0 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
114f0 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
11500 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
11510 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
11520 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
11530 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
11540 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
11550 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
11560 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
11570 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11580 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
11590 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
115a0 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
115b0 65 6c 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  el(.  Btree *p, 
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
115d0 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
115e0 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
115f0 6c 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  l on */.  int le
11600 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
11610 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68   /* PRAGMA synch
11620 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20  ronous.  1=OFF, 
11630 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c  2=NORMAL, 3=FULL
11640 20 2a 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79   */.  int fullSy
11650 6e 63 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nc,          /* 
11660 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63  PRAGMA fullfsync
11670 2e 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46  . */.  int ckptF
11680 75 6c 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a  ullSync       /*
11690 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
116a0 6e 74 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29  nt_fullfync */.)
116b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
116c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
116d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
116e0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
116f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11700 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20  rt( level>=1 && 
11710 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71  level<=3 );.  sq
11720 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11730 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11740 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
11750 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
11760 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63  vel, fullSync, c
11770 6b 70 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  kptFullSync);.  
11780 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11790 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
117a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
117b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
117c0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
117d0 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
117e0 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
117f0 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
11800 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
11810 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
11820 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
11830 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
11840 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
11850 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
11860 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
11870 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
11880 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
11890 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
118a0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
118b0 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
118c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
118d0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
118e0 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
118f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
11900 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
11910 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
11920 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11930 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11940 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11950 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
11960 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
11970 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
11980 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
11990 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
119a0 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
119b0 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
119c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
119d0 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
119e0 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
119f0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
11a00 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
11a10 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
11a20 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
11a30 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
11a40 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
11a50 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
11a60 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
11a70 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
11a80 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
11a90 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
11aa0 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
11ab0 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
11ac0 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
11ad0 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
11ae0 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
11af0 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
11b00 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
11b10 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
11b20 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
11b30 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
11b40 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
11b50 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
11b60 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
11b70 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
11b80 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
11b90 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
11ba0 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
11bb0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
11bc0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
11bd0 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
11be0 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
11bf0 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
11c00 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
11c10 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65 46  en the pageSizeF
11c20 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  ixed flag is set
11c30 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
11c40 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
11c50 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
11c60 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
11c70 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
11c80 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
11c90 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
11ca0 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
11cb0 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
11cc0 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
11cd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11ce0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11cf0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
11d00 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
11d10 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
11d20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11d30 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
11d40 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
11d50 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xed ){.    sqlit
11d60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11d70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11d80 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
11d90 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
11da0 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
11db0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
11dc0 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
11dd0 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
11de0 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
11df0 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
11e00 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
11e10 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
11e20 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
11e30 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
11e40 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
11e50 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
11e60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
11e70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
11e80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
11e90 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
11ea0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
11eb0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
11ec0 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a  e = (u32)pageSiz
11ed0 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
11ee0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
11ef0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11f00 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
11f10 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
11f20 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
11f30 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
11f40 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
11f50 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
11f60 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
11f70 46 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53  Fix ) pBt->pageS
11f80 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20  izeFixed = 1;.  
11f90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11fa0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
11fb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
11fc0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
11fd0 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
11fe0 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
11ff0 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
12000 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
12010 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
12020 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 21  geSize;.}..#if !
12030 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12040 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
12050 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
12060 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
12070 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  M)./*.** Return 
12080 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
12090 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
120a0 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
120b0 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
120c0 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
120d0 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
120e0 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
120f0 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
12100 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
12110 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
12120 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12130 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
12140 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
12150 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
12160 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
12170 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
12180 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
12190 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
121a0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
121b0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
121c0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
121d0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
121e0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
121f0 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
12200 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
12210 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
12220 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
12230 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
12240 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
12250 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
12260 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
12270 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
12280 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12290 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
122a0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
122b0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
122c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
122d0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
122e0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
122f0 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
12300 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
12310 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12320 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
12330 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
12340 74 68 65 20 73 65 63 75 72 65 44 65 6c 65 74 65  the secureDelete
12350 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67   flag if newFlag
12360 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20   is 0 or 1.  If 
12370 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a  newFlag is -1,.*
12380 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63  * then make no c
12390 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20  hanges.  Always 
123a0 72 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 73 65 63 75 72 65 44 65   of the secureDe
123c0 6c 65 74 65 0a 2a 2a 20 73 65 74 74 69 6e 67 20  lete.** setting 
123d0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
123e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
123f0 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
12400 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
12410 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
12420 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
12430 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
12440 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
12450 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
12460 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
12470 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d  ->secureDelete =
12480 20 28 6e 65 77 46 6c 61 67 21 3d 30 29 20 3f 20   (newFlag!=0) ? 
12490 31 20 3a 20 30 3b 0a 20 20 7d 20 0a 20 20 62 20  1 : 0;.  } .  b 
124a0 3d 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65  = p->pBt->secure
124b0 44 65 6c 65 74 65 3b 0a 20 20 73 71 6c 69 74 65  Delete;.  sqlite
124c0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
124d0 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65    return b;.}.#e
124e0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
124f0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
12500 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
12510 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12520 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a  MIT_VACUUM) */..
12530 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
12540 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
12550 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
12560 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
12570 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
12580 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
12590 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
125a0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
125b0 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
125c0 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
125d0 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
125e0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
125f0 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
12600 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
12610 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
12620 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
12630 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
12640 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12650 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
12660 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
12670 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
12680 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12690 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
126a0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
126b0 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
126c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
126d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
126e0 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
126f0 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
12700 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
12710 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
12720 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
12730 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29  xed && (av ?1:0)
12740 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
12750 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
12760 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
12770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
12780 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
12790 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
127a0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
127b0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
127c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
127d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
127e0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
127f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
12800 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
12810 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
12820 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
12830 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
12840 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
12850 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
12860 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
12870 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
12880 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
12890 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
128a0 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
128b0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
128c0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
128d0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
128e0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
128f0 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
12900 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
12910 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
12920 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
12930 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
12940 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
12950 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
12960 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
12970 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
12980 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
129a0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
129b0 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
129c0 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
129d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
129e0 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
129f0 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
12a00 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
12a10 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
12a20 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
12a30 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
12a40 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
12a50 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
12a60 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
12a70 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
12a80 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
12a90 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
12aa0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
12ab0 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
12ac0 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
12ad0 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
12ae0 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
12af0 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
12b00 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
12b10 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
12b20 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
12b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12b40 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
12b50 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
12b60 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
12b70 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
12b80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12b90 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
12ba0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
12bb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
12bc0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
12bd0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
12be0 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
12bf0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
12c00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
12c10 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
12c20 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
12c30 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
12c40 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
12c50 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
12c60 72 20 2a 2f 0a 20 20 75 38 20 2a 70 61 67 65 31  r */.  u8 *page1
12c70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
12c80 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 31  ontent of page 1
12c90 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
12ca0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12cb0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
12cc0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
12cd0 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
12ce0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12cf0 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
12d00 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
12d10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
12d20 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
12d30 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
12d40 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
12d50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12d60 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
12d70 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
12d80 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
12d90 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
12da0 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
12db0 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
12dc0 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
12dd0 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 61 67 65 31  e. .  */.  page1
12de0 20 3d 20 62 74 72 65 65 47 65 74 44 61 74 61 28   = btreeGetData(
12df0 70 50 61 67 65 31 29 3b 0a 20 20 6e 50 61 67 65  pPage1);.  nPage
12e00 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d   = nPageHeader =
12e10 20 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31   get4byte(&page1
12e20 5b 32 38 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  [28]);.  sqlite3
12e30 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
12e40 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
12e50 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e  geFile);.  if( n
12e60 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  Page==0 || memcm
12e70 70 28 32 34 2b 70 61 67 65 31 2c 20 39 32 2b 70  p(24+page1, 92+p
12e80 61 67 65 31 2c 20 34 29 21 3d 30 20 29 7b 0a 20  age1, 4)!=0 ){. 
12e90 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
12ea0 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  File;.  }.  if( 
12eb0 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75  nPage>0 ){.    u
12ec0 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32 pageSize;.   
12ed0 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b   u32 usableSize;
12ee0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12ef0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28  _NOTADB;.    if(
12f00 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
12f10 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
12f20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
12f30 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
12f40 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
12f50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
12f60 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
12f70 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
12f80 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
12f90 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
12fa0 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
12fb0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
12fc0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
12fd0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
12fe0 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
12ff0 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64  .      pBt->read
13000 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Only = 1;.    }.
13010 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13020 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>2 ){.      got
13030 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13040 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
13050 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20  /* If the write 
13060 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74  version is set t
13070 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61  o 2, this databa
13080 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63  se should be acc
13090 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  essed.    ** in 
130a0 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  WAL mode. If the
130b0 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65   log is not alre
130c0 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69  ady open, open i
130d0 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20  t now. Then .   
130e0 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
130f0 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20  E_OK and return 
13100 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69  without populati
13110 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67  ng BtShared.pPag
13120 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  e1..    ** The c
13130 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68  aller detects th
13140 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69  is and calls thi
13150 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
13160 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a  . This is.    **
13170 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65   required as the
13180 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
13190 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20   1 currently in 
131a0 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72  the page1 buffer
131b0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
131c0 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65  be the latest ve
131d0 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61  rsion - there ma
131e0 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65  y be a newer one
131f0 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20   in the log.    
13200 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ** file..    */.
13210 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13220 5d 3d 3d 32 20 26 26 20 70 42 74 2d 3e 64 6f 4e  ]==2 && pBt->doN
13230 6f 74 55 73 65 57 41 4c 3d 3d 30 20 29 7b 0a 20  otUseWAL==0 ){. 
13240 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20       int isOpen 
13250 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
13260 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
13270 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Wal(pBt->pPager,
13280 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20   &isOpen);.     
13290 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
132a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
132b0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
132c0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iled;.      }els
132d0 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20  e if( isOpen==0 
132e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
132f0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13300 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13310 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
13320 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
13330 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
13340 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
13350 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62   The maximum emb
13360 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
13370 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32  ust be exactly 2
13380 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e  5%.  And the min
13390 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65  imum.    ** embe
133a0 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
133b0 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20  st be 12.5% for 
133c0 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61  both leaf-data a
133d0 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  nd non-leaf-data
133e0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  ..    ** The ori
133f0 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
13400 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
13410 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
13420 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
13430 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
13440 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
13450 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
13460 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
13470 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
13480 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
13490 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
134a0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
134b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53  .    }.    pageS
134c0 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
134d0 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
134e0 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
134f0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
13500 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
13510 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
13520 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
13530 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
13540 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
13550 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13560 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13570 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
13580 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
13590 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
135a0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
135b0 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
135c0 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a  if( (u32)pageSiz
135d0 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
135e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
135f0 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
13600 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
13610 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
13620 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
13630 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
13640 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
13650 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
13660 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
13670 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
13680 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
13690 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
136a0 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
136b0 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
136c0 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
136d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
136e0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
136f0 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
13700 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
13710 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
13720 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
13730 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
13740 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
13750 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
13760 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
13770 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
13780 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
13790 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
137a0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
137b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
137c0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
137d0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
137e0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
137f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13810 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
13820 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
13830 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
13840 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
13850 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
13860 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d  E_RecoveryMode)=
13870 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
13880 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
13890 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
138a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
138b0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
138c0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
138d0 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
138e0 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
138f0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13900 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
13910 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
13920 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
13930 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
13940 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
13950 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13960 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
13970 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
13980 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
13990 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
139a0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
139b0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
139c0 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
139d0 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
139e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
139f0 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
13a00 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
13a10 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
13a20 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
13a30 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
13a40 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
13a50 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
13a60 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
13a70 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
13a80 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
13a90 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
13aa0 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
13ab0 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
13ac0 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
13ad0 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
13ae0 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
13af0 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
13b00 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
13b10 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
13b20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
13b30 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
13b40 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
13b50 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
13b60 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
13b70 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
13b80 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
13b90 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
13ba0 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
13bb0 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
13bc0 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
13bd0 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
13be0 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
13bf0 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
13c00 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
13c10 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
13c20 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
13c30 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
13c40 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
13c50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
13c60 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
13c70 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
13c80 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
13c90 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
13ca0 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
13cb0 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
13cc0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
13cd0 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
13ce0 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
13cf0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
13d00 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
13d10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
13d20 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
13d30 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
13d40 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
13d50 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
13d60 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
13d70 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
13d80 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
13d90 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
13da0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
13db0 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
13dc0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
13dd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
13de0 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
13df0 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
13e00 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
13e10 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
13e20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
13e30 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
13e40 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
13e50 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
13e60 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
13e70 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
13e80 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
13e90 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
13ea0 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
13eb0 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
13ec0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
13ed0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
13ee0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
13ef0 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
13f00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
13f10 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
13f20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
13f30 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
13f40 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
13f50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13f60 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
13f70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
13f80 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c  Bt->pCursor==0 |
13f90 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
13fa0 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
13fb0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
13fc0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
13fd0 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
13fe0 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
13ff0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
14000 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
14010 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
14020 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
14030 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
14040 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
14050 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
14060 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  a );.    release
14070 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
14080 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
14090 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
140a0 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
140b0 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
140c0 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
140d0 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
140e0 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
140f0 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
14100 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
14110 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
14120 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
14130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
14140 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
14150 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
14160 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
14170 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
14180 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
14190 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
141a0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
141b0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
141c0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
141d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
141e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
141f0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
14200 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
14210 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 61  ;.  rc = btreeMa
14220 6b 65 50 61 67 65 57 72 69 74 65 61 62 6c 65 28  kePageWriteable(
14230 70 50 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29  pP1);.  if( rc )
14240 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 64 61   return rc;.  da
14250 74 61 20 3d 20 62 74 72 65 65 47 65 74 44 61 74  ta = btreeGetDat
14260 61 28 70 50 31 29 3b 0a 20 20 6d 65 6d 63 70 79  a(pP1);.  memcpy
14270 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
14280 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
14290 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
142a0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
142b0 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
142c0 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
142d0 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
142e0 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
142f0 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
14300 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
14310 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
14320 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
14330 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
14340 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
14350 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
14360 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
14370 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
14380 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
14390 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
143a0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
143b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
143c0 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
143d0 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
143e0 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
143f0 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
14400 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
14410 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
14420 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
14430 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
14440 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61  ATA );.  pBt->pa
14450 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
14460 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14470 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
14480 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
14490 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
144a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
144b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
144c0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
144d0 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
144e0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
144f0 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
14500 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
14510 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
14520 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
14530 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
14540 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
14550 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
14560 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
14570 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14580 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  _OK;.}../*.** At
14590 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
145a0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
145b0 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
145c0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
145d0 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
145e0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
145f0 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
14600 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
14610 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
14620 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14630 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
14640 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
14650 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
14660 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
14670 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
14680 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
14690 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
146a0 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
146b0 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
146c0 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
146d0 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
146e0 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
146f0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
14700 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
14710 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
14720 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
14730 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
14740 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
14750 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
14760 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
14770 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
14780 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
14790 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
147a0 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
147b0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
147c0 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
147d0 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
147e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
147f0 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
14800 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
14810 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
14820 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
14830 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
14840 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
14850 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
14860 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
14870 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
14880 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
14890 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
148a0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
148b0 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
148c0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
148d0 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
148e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
148f0 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
14900 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
14910 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
14920 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
14930 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
14940 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
14950 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
14960 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
14970 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
14980 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
14990 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
149a0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
149b0 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
149c0 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
149d0 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
149e0 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
149f0 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
14a00 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
14a10 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
14a20 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
14a30 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
14a40 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
14a50 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
14a60 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
14a70 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
14a80 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
14a90 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
14aa0 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
14ab0 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
14ac0 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
14ad0 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
14ae0 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
14af0 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
14b00 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
14b10 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
14b20 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
14b30 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
14b40 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
14b50 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
14b60 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
14b70 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
14b80 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
14b90 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
14ba0 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
14bb0 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
14bc0 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
14bd0 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
14be0 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
14bf0 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
14c00 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
14c10 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
14c20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14c30 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
14c40 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
14c50 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c  {.  sqlite3 *pBl
14c60 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  ock = 0;.  BtSha
14c70 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
14c80 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
14c90 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
14ca0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
14cb0 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
14cc0 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
14cd0 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
14ce0 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
14cf0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
14d00 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
14d10 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
14d20 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
14d30 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
14d40 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
14d50 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
14d60 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
14d70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
14d80 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
14d90 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
14da0 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
14db0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
14dc0 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  begun;.  }..  /*
14dd0 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
14de0 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
14df0 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
14e00 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
14e10 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
14e20 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b  nly && wrflag ){
14e30 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14e40 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
14e50 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
14e60 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
14e70 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
14e80 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61  _CACHE.  /* If a
14e90 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
14ea0 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
14eb0 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
14ec0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
14ed0 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
14ee0 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
14ef0 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
14f00 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
14f10 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73  n is.  ** reques
14f20 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
14f30 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a  TE_LOCKED..  */.
14f40 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
14f50 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14f60 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
14f70 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50 65 6e 64  ) || pBt->isPend
14f80 69 6e 67 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63  ing ){.    pBloc
14f90 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72  k = pBt->pWriter
14fa0 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->db;.  }else if
14fb0 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
14fc0 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
14fd0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70  .    for(pIter=p
14fe0 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
14ff0 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
15000 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
15010 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
15020 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c  p ){.        pBl
15030 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74  ock = pIter->pBt
15040 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  ree->db;.       
15050 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15060 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
15070 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71  pBlock ){.    sq
15080 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
15090 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42  locked(p->db, pB
150a0 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20  lock);.    rc = 
150b0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
150c0 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67  AREDCACHE;.    g
150d0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
150e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
150f0 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20  * Any read-only 
15100 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72  or read-write tr
15110 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65  ansaction implie
15120 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  s a read-lock on
15130 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53   .  ** page 1. S
15140 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  o if some other 
15150 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69  shared-cache cli
15160 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20  ent already has 
15170 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20  a write-lock .  
15180 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  ** on page 1, th
15190 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e transaction ca
151a0 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20  nnot be opened. 
151b0 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53  */.  rc = queryS
151c0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
151d0 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f  ock(p, MASTER_RO
151e0 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a  OT, READ_LOCK);.
151f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
15200 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73  =rc ) goto trans
15210 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e  _begun;..  pBt->
15220 69 6e 69 74 69 61 6c 6c 79 45 6d 70 74 79 20 3d  initiallyEmpty =
15230 20 28 75 38 29 28 70 42 74 2d 3e 6e 50 61 67 65   (u8)(pBt->nPage
15240 3d 3d 30 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  ==0);.  do {.   
15250 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72   /* Call lockBtr
15260 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65  ee() until eithe
15270 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73  r pBt->pPage1 is
15280 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20   populated or.  
15290 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29    ** lockBtree()
152a0 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69   returns somethi
152b0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ng other than SQ
152c0 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72  LITE_OK. lockBtr
152d0 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ee().    ** may 
152e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
152f0 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e   but leave pBt->
15300 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20  pPage1 set to 0 
15310 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20  if after.    ** 
15320 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69  reading page 1 i
15330 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74  t discovers that
15340 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
15350 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
15360 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e      ** file is n
15370 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ot pBt->pageSize
15380 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
15390 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20  ockBtree() will 
153a0 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42  update.    ** pB
153b0 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74  t->pageSize to t
153c0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
153d0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
153e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
153f0 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  le( pBt->pPage1=
15400 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  =0 && SQLITE_OK=
15410 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65  =(rc = lockBtree
15420 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69  (pBt)) );..    i
15430 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15440 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
15450 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61      if( pBt->rea
15460 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
15470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
15480 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
15490 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
154a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
154b0 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77  in(pBt->pPager,w
154c0 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54  rflag>1,sqlite3T
154d0 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64  empInMemory(p->d
154e0 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b));.        if(
154f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15500 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
15510 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
15520 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15530 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
15540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15550 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  _OK ){.      unl
15560 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
15570 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
15580 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29  while( (rc&0xFF)
15590 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
155a0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
155b0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
155c0 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
155d0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
155e0 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
155f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15600 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
15610 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
15620 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
15630 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
15640 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15650 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15660 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
15670 68 61 72 61 62 6c 65 20 29 7b 0a 09 61 73 73 65  harable ){..asse
15680 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
15690 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
156a0 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
156b0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
156c0 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
156d0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
156e0 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
156f0 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
15700 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
15710 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
15720 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
15730 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
15740 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
15750 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
15760 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
15770 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
15780 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
15790 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
157a0 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
157b0 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
157c0 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
157d0 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
157e0 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20  pPage1;.#ifndef 
157f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
15800 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61  ED_CACHE.      a
15810 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
15820 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
15830 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
15840 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63        pBt->isExc
15850 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28 77 72  lusive = (u8)(wr
15860 66 6c 61 67 3e 31 29 3b 0a 23 65 6e 64 69 66 0a  flag>1);.#endif.
15870 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
15880 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20   db-size header 
15890 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65  field is incorre
158a0 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ct (as it may be
158b0 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20   if an old.     
158c0 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62   ** client has b
158d0 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  een writing the 
158e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
158f0 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44  update it now. D
15900 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  oing.      ** th
15910 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  is sooner rather
15920 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e   than later mean
15930 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
15940 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a  ize can safely .
15950 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64        ** re-read
15960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
15970 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69  ze from page 1 i
15980 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72  f a savepoint or
15990 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
159a0 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f     ** rollback o
159b0 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
159c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
159d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 62 74 72      */.      btr
159e0 65 65 47 65 74 44 61 74 61 28 70 50 61 67 65 31  eeGetData(pPage1
159f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  );.      if( pBt
15a00 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74  ->nPage!=get4byt
15a10 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
15a20 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [28]) ){.       
15a30 20 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50   rc = btreeMakeP
15a40 61 67 65 57 72 69 74 65 61 62 6c 65 28 70 50 61  ageWriteable(pPa
15a50 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge1);.        if
15a60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
15a80 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
15a90 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
15aa0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
15ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15ac0 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
15ad0 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
15ae0 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
15af0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
15b00 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
15b10 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
15b20 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
15b30 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
15b40 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
15b50 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
15b60 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
15b70 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
15b80 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
15b90 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
15ba0 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
15bb0 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
15bc0 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
15bd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15be0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
15bf0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
15c00 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
15c10 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
15c20 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
15c30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15c40 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
15c50 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
15c60 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
15c70 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
15c80 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
15c90 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
15ca0 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
15cb0 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
15cc0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
15cd0 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
15ce0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
15cf0 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
15d00 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
15d10 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
15d20 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
15d30 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
15d40 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
15d50 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
15d60 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
15d90 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
15da0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15dd0 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
15de0 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
15df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e10 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
15e20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15e30 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
15e40 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
15e50 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
15e60 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
15e70 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
15e80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15e90 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
15ea0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
15eb0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
15ec0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
15ed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15ee0 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
15ef0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
15f00 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
15f10 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
15f20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
15f30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
15f40 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
15f50 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
15f60 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
15f70 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
15f80 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
15f90 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
15fa0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
15fb0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
15fc0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
15fd0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
15fe0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
15ff0 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
16000 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
16010 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
16020 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
16030 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
16040 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
16050 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
16060 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
16070 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
16080 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
16090 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
160a0 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
160b0 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
160c0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
160d0 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
160e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
160f0 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
16100 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
16110 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
16120 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
16130 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
16140 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
16150 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
16160 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
16170 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
16180 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
16190 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
161a0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
161b0 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
161c0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
161d0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
161e0 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
16200 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
16210 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
16220 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
16230 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
16240 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
16250 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16270 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
16280 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
16290 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
162a0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
162b0 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
162c0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
162d0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
162e0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
162f0 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
16300 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
16310 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
16320 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
16330 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
16340 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
16350 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
16360 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
16370 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
16380 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16390 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
163a0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
163b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
163c0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
163d0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
163e0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
163f0 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
16400 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
16410 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
16420 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
16430 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
16440 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
16450 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
16460 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
16470 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16480 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
16490 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
164a0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
164b0 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
164c0 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
164d0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
164e0 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
164f0 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
16500 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74  ;..    btreeInit
16510 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
16520 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
16530 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
16540 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
16550 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
16560 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
16570 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
16580 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
16590 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
165a0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
165b0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74  info;.        bt
165c0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
165d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
165e0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
165f0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
16600 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65  .         && pCe
16610 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
16620 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74  w+3<=pPage->aDat
16630 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
16640 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46  e.         && iF
16650 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
16660 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
16670 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29 7b  low]).        ){
16680 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
16690 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
166a0 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
166b0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
166c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
166d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
166e0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
166f0 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
16700 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
16710 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
16720 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
16730 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16740 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
16750 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
16760 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
16770 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
16780 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
16790 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
167a0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
167b0 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
167c0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
167d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
167e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
167f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
16800 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
16810 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
16820 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
16830 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
16840 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
16850 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16860 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
16870 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
16880 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
16890 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
168a0 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
168b0 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
168c0 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
168d0 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
168e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
168f0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
16900 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
16910 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
16920 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
16930 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
16940 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
16950 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
16960 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
16970 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
16980 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
16990 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
169a0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
169b0 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
169c0 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
169d0 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
169e0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
169f0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
16a00 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
16a10 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
16a20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
16a30 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
16a40 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
16a50 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
16a60 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
16a70 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
16a80 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
16a90 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
16aa0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
16ab0 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
16ac0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
16ad0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
16ae0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
16af0 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
16b00 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
16b10 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
16b20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
16b30 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
16b40 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
16b50 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
16b60 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
16b70 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
16b80 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
16b90 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
16ba0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
16bb0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
16bc0 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
16bd0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
16be0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
16bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
16c00 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
16c10 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
16c20 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
16c30 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
16c40 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
16c50 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
16c60 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
16c70 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16c80 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
16c90 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
16ca0 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
16cb0 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
16cc0 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
16cd0 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
16ce0 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
16cf0 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
16d00 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
16d10 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
16d20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
16d30 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
16d40 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
16d50 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
16d60 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
16d70 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
16d80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
16d90 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
16da0 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
16db0 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
16dc0 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
16dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16de0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16df0 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
16e00 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
16e10 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
16e20 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
16e30 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
16e40 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
16e50 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
16e60 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
16e70 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
16e80 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
16e90 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
16ea0 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
16eb0 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
16ec0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
16ed0 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
16ee0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
16ef0 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
16f00 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
16f10 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
16f20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
16f30 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
16f40 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
16f50 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
16f60 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
16f70 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
16f80 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
16f90 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
16fa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
16fb0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
16fc0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
16fd0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
16fe0 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
16ff0 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
17000 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
17020 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
17030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
17040 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
17050 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
17060 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
17070 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
17080 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
17090 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
170a0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
170b0 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
170c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
170d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
170e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
170f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17100 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
17110 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
17120 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
17130 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
17140 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
17150 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
17160 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
17170 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
17180 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
17190 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
171a0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
171b0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
171c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
171d0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
171e0 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
171f0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
17200 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17210 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
17230 20 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57 72   btreeMakePageWr
17240 69 74 65 61 62 6c 65 28 70 50 74 72 50 61 67 65  iteable(pPtrPage
17250 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
17260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17270 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
17280 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
17290 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
172a0 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
172b0 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
172c0 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
172d0 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
172e0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
172f0 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
17300 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17310 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
17320 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
17330 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
17340 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
17350 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17360 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
17370 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
17380 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
17390 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
173a0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
173b0 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
173c0 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
173d0 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
173e0 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
173f0 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
17400 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
17410 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
17420 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72  successful,.** r
17430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
17440 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
17450 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
17460 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20  therefore no.** 
17470 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67  point in calling
17480 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
17490 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
174a0 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
174b0 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79   More specificly
174c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
174d0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
174e0 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20  rganize the .** 
174f0 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74  database so that
17500 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
17510 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
17520 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69  ntly in use.** i
17530 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
17540 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
17550 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20   nFin parameter 
17560 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
17570 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
17580 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  es.** that the c
17590 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
175a0 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
175b0 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a  umStep() until.*
175c0 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  * it returns SQL
175d0 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65  ITE_DONE or an e
175e0 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e  rror, and that n
175f0 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75  Fin is the.** nu
17600 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
17610 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17620 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74  will contain aft
17630 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63  er this .** proc
17640 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e  ess is complete.
17650 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72    If nFin is zer
17660 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  o, it is assumed
17670 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56 61 63   that.** incrVac
17680 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c 20 62  uumStep() will b
17690 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e 69 74  e called a finit
176a0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
176b0 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79 20 6f  s.** which may o
176c0 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74 79 20  r may not empty 
176d0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 41  the freelist.  A
176e0 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75 75 6d   full autovacuum
176f0 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30 2e 20  .** has nFin>0. 
17700 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63 72 65   A "PRAGMA incre
17710 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22 20 68  mental_vacuum" h
17720 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f 0a 73  as nFin==0..*/.s
17730 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
17740 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
17750 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
17760 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29  n, Pgno iLastPg)
17770 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
17780 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
17790 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
177a0 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
177b0 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ee-list */.  int
177c0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
177d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
177e0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
177f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
17800 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
17810 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
17820 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
17830 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
17840 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
17850 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79  t) ){.    u8 eTy
17860 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
17870 72 50 61 67 65 3b 0a 0a 20 20 20 20 62 74 72 65  rPage;..    btre
17880 65 47 65 74 44 61 74 61 28 70 42 74 2d 3e 70 50  eGetData(pBt->pP
17890 61 67 65 31 29 3b 0a 20 20 20 20 6e 46 72 65 65  age1);.    nFree
178a0 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
178b0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
178c0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
178d0 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
178e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
178f0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
17900 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
17910 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
17920 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
17930 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
17940 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17950 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17970 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
17980 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
17990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
179a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
179b0 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
179c0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
179d0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  E ){.      if( n
179e0 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Fin==0 ){.      
179f0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
17a00 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
17a10 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
17a20 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
17a30 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
17a40 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65  f nFin is non-ze
17a50 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
17a60 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
17a70 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
17a80 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
17a90 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
17aa0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
17ab0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
17ac0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
17ad0 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
17ae0 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
17af0 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
17b00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17b10 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
17b20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
17b30 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
17b40 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
17b50 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
17b60 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
17b70 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20   iLastPg, 1);.  
17b80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17b90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17ba0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17bb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17bc0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
17bd0 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
17be0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
17bf0 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
17c00 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
17c10 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
17c20 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
17c30 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
17c40 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
17c50 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
17c60 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
17c70 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  tPg;..      rc =
17c80 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
17c90 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
17ca0 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
17cb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17cc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
17cd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
17ce0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69  .      /* If nFi
17cf0 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  n is zero, this 
17d00 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
17d10 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
17d20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
17d30 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
17d40 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
17d50 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
17d60 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
17d70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17d80 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
17d90 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67  nd, if nFin is g
17da0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
17db0 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
17dc0 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
17dd0 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
17de0 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
17df0 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
17e00 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
17e10 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
17e20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17e30 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
17e40 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
17e50 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
17e60 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
17e70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
17e80 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20  FreePg, 0, 0);. 
17e90 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
17ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17eb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
17ec0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
17ed0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17ee0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17ef0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
17f00 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
17f10 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26  while( nFin!=0 &
17f20 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
17f30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17f40 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
17f50 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
17f60 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50 61  rc = btreeMakePa
17f70 67 65 57 72 69 74 65 61 62 6c 65 28 70 4c 61 73  geWriteable(pLas
17f80 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
17f90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17fa0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
17fb0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
17fc0 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
17fd0 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
17fe0 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20  g, nFin!=0);.   
17ff0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
18000 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
18010 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18020 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18030 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18050 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20  ..  if( nFin==0 
18060 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  ){.    iLastPg--
18070 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61  ;.    while( iLa
18080 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg==PENDING_BY
18090 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54  TE_PAGE(pBt)||PT
180a0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
180b0 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20   iLastPg) ){.   
180c0 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
180d0 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
180e0 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65  g) ){.        Me
180f0 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20  mPage *pPg;.    
18100 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
18110 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
18120 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20  Pg, &pPg, 0);.  
18130 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18140 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18150 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18160 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18170 20 20 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65    rc = btreeMake
18180 50 61 67 65 57 72 69 74 65 61 62 6c 65 28 70 50  PageWriteable(pP
18190 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  g);.        rele
181a0 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
181b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
181c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
181d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
181e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
181f0 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  }.      iLastPg-
18200 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  -;.    }.    sql
18210 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
18220 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
18230 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20  er, iLastPg);.  
18240 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69    pBt->nPage = i
18250 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65  LastPg;.  }.  re
18260 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18270 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65  }../*.** A write
18280 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
18290 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f  t be opened befo
182a0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
182b0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
182c0 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c  performs a singl
182d0 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74  e unit of work t
182e0 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d  owards an increm
182f0 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a  ental vacuum..**
18300 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65  .** If the incre
18310 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73  mental vacuum is
18320 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20   finished after 
18330 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
18340 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45  s run,.** SQLITE
18350 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
18360 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  d. If it is not 
18370 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f  finished, but no
18380 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
18390 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
183a0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
183b0 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
183c0 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
183d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
183e0 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
183f0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
18400 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
18410 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
18420 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18430 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
18440 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
18450 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
18460 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
18470 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
18480 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
18490 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
184a0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
184b0 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  e{.    invalidat
184c0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
184d0 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  e(pBt);.    rc =
184e0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
184f0 70 42 74 2c 20 30 2c 20 62 74 72 65 65 50 61 67  pBt, 0, btreePag
18500 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20  ecount(pBt));.  
18510 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18520 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
18530 3d 20 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57  = btreeMakePageW
18540 72 69 74 65 61 62 6c 65 28 70 42 74 2d 3e 70 50  riteable(pBt->pP
18550 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 75 74  age1);.      put
18560 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
18570 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
18580 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
18590 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
185a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
185b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
185c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
185d0 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
185e0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
185f0 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
18600 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
18610 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20  commited for an 
18620 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
18630 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
18640 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18650 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
18660 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
18670 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
18680 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
18690 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
186a0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
186b0 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
186c0 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
186d0 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
186e0 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
186f0 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
18700 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
18710 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
18720 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
18730 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
18740 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
18750 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
18760 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18770 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
18780 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56  pBt->pPager;.  V
18790 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65  VA_ONLY( int nRe
187a0 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
187b0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
187c0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   );..  assert( s
187d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
187e0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
187f0 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
18800 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
18810 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
18820 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
18830 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
18840 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
18850 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
18860 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
18870 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61  es in database a
18880 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69  fter autovacuumi
18890 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ng */.    Pgno n
188a0 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
188b0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
188c0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
188d0 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20  initially */.   
188e0 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20   Pgno nPtrmap;  
188f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18900 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f   PtrMap pages to
18910 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
18920 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20   Pgno iFree;    
18930 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
18940 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64  page to be freed
18950 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74   */.    int nEnt
18960 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ry;        /* Nu
18970 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
18980 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61  on one ptrmap pa
18990 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
189a0 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20  Orig;        /* 
189b0 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65  Database size be
189c0 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a  fore freeing */.
189d0 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72  .    nOrig = btr
189e0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
189f0 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50  ;.    if( PTRMAP
18a00 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
18a10 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45  ig) || nOrig==PE
18a20 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
18a30 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
18a40 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
18a50 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ble to create a 
18a60 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69  database for whi
18a70 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67  ch the final pag
18a80 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  e.      ** is ei
18a90 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d  ther a pointer-m
18aa0 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70  ap page or the p
18ab0 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65  ending-byte page
18ac0 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a  . If one.      *
18ad0 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
18ae0 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
18af0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
18b00 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
18b10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18b20 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
18b30 20 20 20 62 74 72 65 65 47 65 74 44 61 74 61 28     btreeGetData(
18b40 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
18b50 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
18b60 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
18b70 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
18b80 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
18b90 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20  sableSize/5;.   
18ba0 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
18bb0 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
18bc0 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
18bd0 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
18be0 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72  ;.    nFin = nOr
18bf0 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
18c00 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f  rmap;.    if( nO
18c10 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
18c20 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
18c30 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
18c40 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
18c50 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
18c60 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
18c70 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
18c80 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
18c90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
18ca0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46  pBt) ){.      nF
18cb0 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  in--;.    }.    
18cc0 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
18cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18ce0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
18cf0 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
18d00 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
18d10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
18d20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
18d30 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
18d40 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
18d50 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Free);.    }.   
18d60 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
18d70 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
18d80 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
18d90 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
18da0 20 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57 72   btreeMakePageWr
18db0 69 74 65 61 62 6c 65 28 70 42 74 2d 3e 70 50 61  iteable(pBt->pPa
18dc0 67 65 31 29 3b 0a 20 20 20 20 20 20 70 75 74 34  ge1);.      put4
18dd0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
18de0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
18df0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
18e00 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
18e10 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
18e20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
18e30 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
18e40 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
18e50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
18e60 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
18e70 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b  ->pPager, nFin);
18e80 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
18e90 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a  e = nFin;.    }.
18ea0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18eb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
18ec0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
18ed0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
18ee0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
18ef0 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50  ( nRef==sqlite3P
18f00 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
18f10 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
18f20 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
18f30 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
18f40 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
18f50 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
18f60 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
18f70 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
18f80 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
18f90 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
18fa0 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
18fb0 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
18fc0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
18fd0 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
18fe0 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
18ff0 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
19000 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
19010 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
19020 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
19030 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
19040 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
19050 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
19060 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
19070 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
19080 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
19090 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
190a0 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
190b0 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
190c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
190d0 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
190e0 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
190f0 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
19100 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
19110 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
19120 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
19130 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
19140 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
19150 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19160 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
19170 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
19180 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
19190 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
191a0 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
191b0 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
191c0 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
191d0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
191e0 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
191f0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
19200 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
19210 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
19220 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
19230 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
19240 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
19250 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
19260 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
19270 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
19280 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
19290 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
192a0 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
192b0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
192c0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
192d0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
192e0 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
192f0 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
19300 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
19310 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19320 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
19330 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
19340 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
19350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
19360 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
19370 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
19380 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
19390 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
193a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
193b0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
193c0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
193d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
193e0 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
193f0 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
19400 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
19410 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
19420 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
19430 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
19440 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
19450 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
19460 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
19470 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
19480 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
19490 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
194a0 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
194b0 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
194c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
194d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
194e0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
194f0 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
19500 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
19510 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19520 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
19530 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
19540 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
19550 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
19560 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
19570 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
19580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19590 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
195a0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
195b0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
195c0 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
195d0 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
195e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
195f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
19600 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19610 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
19620 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
19630 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
19640 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19650 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
19660 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
19670 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ter, 0);.    sql
19680 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19690 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
196a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
196b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
196c0 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42  lled from both B
196d0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
196e0 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f  wo() and BtreeRo
196f0 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74  llback().** at t
19700 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
19710 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
19720 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
19730 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
19740 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  on(Btree *p){.  
19750 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19760 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
19770 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
19780 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
19790 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
197a0 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 69  ontent(pBt);.  i
197b0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
197c0 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 2d 3e 64  ANS_NONE && p->d
197d0 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
197e0 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
197f0 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
19800 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
19810 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
19820 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
19830 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
19840 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
19850 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
19860 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
19870 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
19880 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
19890 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
198a0 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
198b0 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
198c0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
198d0 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
198e0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
198f0 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
19900 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
19910 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
19920 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
19930 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
19940 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
19950 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
19960 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
19970 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
19980 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
19990 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
199a0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
199b0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
199c0 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
199d0 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
199e0 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
199f0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
19a00 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
19a10 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
19a20 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
19a30 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
19a40 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
19a50 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
19a60 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
19a70 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
19a80 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
19a90 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
19aa0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
19ab0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
19ac0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
19ad0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
19ae0 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
19af0 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
19b00 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
19b10 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
19b20 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
19b30 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
19b40 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
19b50 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
19b60 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
19b70 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
19b80 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
19b90 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
19ba0 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
19bb0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
19bc0 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
19bd0 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
19be0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
19bf0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
19c00 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
19c10 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
19c20 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
19c30 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
19c40 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
19c50 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
19c60 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
19c70 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
19c80 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
19c90 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
19ca0 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
19cb0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
19cc0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
19cd0 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
19ce0 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
19cf0 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
19d00 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
19d10 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
19d20 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
19d30 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
19d40 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
19d50 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
19d60 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
19d70 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
19d80 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
19d90 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
19da0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
19db0 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
19dc0 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
19dd0 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
19de0 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
19df0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
19e00 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
19e10 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
19e20 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
19e30 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
19e40 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
19e50 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
19e60 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
19e70 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
19e80 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
19e90 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
19ea0 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
19eb0 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
19ec0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19ed0 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
19ee0 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
19ef0 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
19f00 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
19f10 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
19f20 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
19f30 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
19f40 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
19f50 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
19f60 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
19f70 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
19f80 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
19f90 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
19fa0 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
19fb0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
19fc0 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
19fd0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
19fe0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
19ff0 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
1a000 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
1a010 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
1a020 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1a030 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
1a040 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
1a050 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
1a060 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
1a070 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
1a080 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
1a090 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
1a0a0 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
1a0b0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
1a0c0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1a0d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1a0e0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1a0f0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1a100 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
1a110 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
1a120 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
1a130 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1a140 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
1a150 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
1a160 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
1a170 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1a180 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
1a190 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
1a1a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1a1b0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1a1c0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
1a1d0 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
1a1e0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1a1f0 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
1a200 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
1a210 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1a220 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
1a230 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
1a240 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
1a250 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1a260 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1a270 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1a280 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a290 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
1a2a0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1a2b0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1a2c0 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
1a2d0 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
1a2e0 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
1a2f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1a300 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
1a310 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1a320 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a330 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
1a340 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a350 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1a360 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a370 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
1a380 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1a390 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
1a3a0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1a3b0 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1a3c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1a3d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1a3e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1a3f0 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
1a400 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
1a410 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1a420 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
1a430 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1a440 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1a450 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1a460 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1a470 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
1a480 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a490 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1a4a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1a4b0 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
1a4c0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1a4d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1a4e0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1a4f0 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
1a500 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1a510 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72   of write-cursor
1a520 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68  s open on this h
1a530 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66  andle. This is f
1a540 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
1a550 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
1a560 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
1a570 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
1a580 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
1a590 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  fined..**.** For
1a5a0 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
1a5b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
1a5c0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
1a5d0 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
1a5e0 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
1a5f0 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  f writing to the
1a600 20 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20   databse.  That 
1a610 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72  means the cursor
1a620 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   was.** original
1a630 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  ly opened for wr
1a640 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75  iting and the cu
1a650 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20  rsor has not be 
1a660 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68  disabled.** by h
1a670 61 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20  aving its state 
1a680 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f  changed to CURSO
1a690 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74  R_FAULT..*/.stat
1a6a0 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74  ic int countWrit
1a6b0 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  eCursors(BtShare
1a6c0 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
1a6d0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
1a6e0 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
1a6f0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
1a700 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
1a710 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1a720 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26  ( pCur->wrFlag &
1a730 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
1a740 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
1a750 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
1a760 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
1a770 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a780 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  e sets the state
1a790 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
1a7a0 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a   and the error.*
1a7b0 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64  * code to errCod
1a7c0 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
1a7d0 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74  or on BtShared t
1a7e0 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
1a7f0 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
1a800 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
1a810 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
1a820 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ng cursors that 
1a830 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68  belong.** to oth
1a840 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1a850 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
1a860 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e  pen to be sharin
1a870 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77  g.** the cache w
1a880 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
1a890 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
1a8a0 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
1a8b0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1a8c0 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72  s..** All cursor
1a8d0 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  s using the same
1a8e0 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74   cache must be t
1a8f0 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65  ripped.** to pre
1a900 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74  vent them from t
1a910 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65  rying to use the
1a920 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20   btree after.** 
1a930 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  the rollback.  T
1a940 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
1a950 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62  have deleted tab
1a960 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20  les.** or moved 
1a970 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69  root pages, so i
1a980 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
1a990 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74  ent to.** save t
1a9a0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
1a9b0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72  cursor.  The cur
1a9c0 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69  sor must be.** i
1a9d0 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76  nvalidated..*/.v
1a9e0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1a9f0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42  TripAllCursors(B
1aa00 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e  tree *pBtree, in
1aa10 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74  t errCode){.  Bt
1aa20 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c  Cursor *p;.  sql
1aa30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1aa40 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Btree);.  for(p=
1aa50 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1aa60 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1aa70 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ext){.    int i;
1aa80 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1aa90 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
1aaa0 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d  .    p->eState =
1aab0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
1aac0 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
1aad0 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f   errCode;.    fo
1aae0 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
1aaf0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1ab00 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
1ab10 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
1ab20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
1ab30 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  0;.    }.  }.  s
1ab40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1ab50 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  (pBtree);.}../*.
1ab60 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
1ab70 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
1ab80 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
1ab90 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
1aba0 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
1abb0 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
1abc0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
1abd0 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
1abe0 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
1abf0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1ac00 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
1ac10 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
1ac20 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
1ac30 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
1ac40 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1ac50 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1ac60 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1ac70 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1ac80 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1ac90 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1aca0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1acb0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
1acc0 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
1acd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1ace0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1acf0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
1ad00 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c   *pPage1;..  sql
1ad10 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1ad20 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  );.  rc = saveAl
1ad30 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1ad40 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
1ad50 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1ad60 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d  CACHE.  if( rc!=
1ad70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ad80 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f   /* This is a ho
1ad90 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e  rrible situation
1ada0 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  . An IO or mallo
1adb0 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 72  c() error occurr
1adc0 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a  ed whilst.    **
1add0 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20   trying to save 
1ade0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73  cursor positions
1adf0 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
1ae00 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61  automatic rollba
1ae10 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68  ck (as.    ** th
1ae20 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f  e result of a co
1ae30 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63  nstraint, malloc
1ae40 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f  () failure or IO
1ae50 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20   error) then .  
1ae60 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d    ** the cache m
1ae70 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79  ay be internally
1ae80 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e   inconsistent (n
1ae90 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64  ot contain valid
1aea0 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a   trees) so.    *
1aeb0 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70  * we cannot simp
1aec0 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  ly return the er
1aed0 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ror to the calle
1aee0 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72  r. Instead, abor
1aef0 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75  t .    ** all qu
1af00 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62  eries that may b
1af10 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74  e using any of t
1af20 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
1af30 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a  failed to save..
1af40 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1af50 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1af60 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20  rsors(p, rc);.  
1af70 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65  }.#endif.  btree
1af80 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1af90 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1afa0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1afb0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
1afc0 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
1afd0 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
1afe0 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
1aff0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
1b000 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
1b010 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
1b020 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
1b030 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
1b040 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
1b050 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
1b060 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
1b070 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
1b080 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
1b090 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
1b0a0 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
1b0b0 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
1b0c0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
1b0d0 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
1b0e0 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
1b0f0 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
1b100 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
1b110 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
1b120 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
1b130 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
1b140 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
1b150 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
1b160 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
1b170 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
1b180 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
1b190 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1b1a0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
1b1b0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
1b1c0 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
1b1d0 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
1b1e0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1b1f0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
1b200 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
1b210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1b220 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
1b230 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
1b240 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
1b250 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1b260 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  READ;.  }..  btr
1b270 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1b280 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1b290 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1b2a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b2b0 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
1b2c0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1b2d0 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
1b2e0 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20  saction can can 
1b2f0 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  be rolled.** bac
1b300 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
1b310 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
1b320 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73  saction. You mus
1b330 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
1b340 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65  ction .** before
1b350 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
1b360 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1b370 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
1b380 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
1b390 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65  cally .** if the
1b3a0 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1b3b0 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  n commits or rol
1b3c0 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  ls back..**.** S
1b3d0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1b3e0 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
1b3f0 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
1b400 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
1b410 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
1b420 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
1b430 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
1b440 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
1b450 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
1b460 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
1b470 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
1b480 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
1b490 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
1b4a0 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
1b4b0 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
1b4c0 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
1b4d0 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
1b4e0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1b4f0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74   statement sub-t
1b500 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d  ransaction is im
1b510 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20  plemented as an 
1b520 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
1b530 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  int. The.** valu
1b540 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1b550 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1b560 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
1b570 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
1b580 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ts,.** including
1b590 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f   the new anonymo
1b5a0 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70  us savepoint, op
1b5b0 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65  en on the B-Tree
1b5c0 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a  . i.e. if there.
1b5d0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1b5e0 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
1b5f0 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  no other stateme
1b600 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt-transactions 
1b610 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d  open,.** iStatem
1b620 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61  ent is 1. This a
1b630 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1b640 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  nt can be releas
1b650 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
1b660 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73  k.** using the s
1b670 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1b680 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  oint() function.
1b690 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b6a0 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
1b6b0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61  ree *p, int iSta
1b6c0 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  tement){.  int r
1b6d0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1b6e0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
1b6f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b700 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1b710 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1b720 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
1b730 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  rt( pBt->readOnl
1b740 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
1b750 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
1b760 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1b770 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
1b780 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
1b790 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1b7a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1b7b0 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
1b7c0 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
1b7d0 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
1b7e0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
1b7f0 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
1b800 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
1b810 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
1b820 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
1b830 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
1b840 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
1b850 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
1b860 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
1b870 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
1b880 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
1b890 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
1b8a0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
1b8b0 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
1b8c0 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
1b8d0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1b8e0 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
1b8f0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1b900 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
1b910 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b920 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1b930 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
1b940 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1b950 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1b960 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
1b970 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1b980 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
1b990 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
1b9a0 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
1b9b0 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
1b9c0 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
1b9d0 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
1b9e0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
1b9f0 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
1ba00 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
1ba10 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
1ba20 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
1ba30 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
1ba40 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1ba50 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
1ba60 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
1ba70 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
1ba80 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
1ba90 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
1baa0 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
1bab0 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
1bac0 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
1bad0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
1bae0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
1baf0 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
1bb00 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
1bb10 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
1bb20 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
1bb30 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
1bb40 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
1bb50 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
1bb60 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
1bb70 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
1bb80 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
1bb90 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
1bba0 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
1bbb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
1bbc0 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
1bbd0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1bbe0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
1bbf0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1bc00 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
1bc10 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
1bc20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
1bc30 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
1bc40 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
1bc50 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
1bc60 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
1bc70 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
1bc80 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
1bc90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1bca0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1bcb0 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
1bcc0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
1bcd0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
1bce0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1bcf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1bd00 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
1bd10 26 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c 6c 79  & pBt->initially
1bd20 45 6d 70 74 79 20 29 20 70 42 74 2d 3e 6e 50 61  Empty ) pBt->nPa
1bd30 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ge = 0;.      rc
1bd40 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1bd50 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
1bd60 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
1bd70 28 32 38 20 2b 20 62 74 72 65 65 47 65 74 44 61  (28 + btreeGetDa
1bd80 74 61 28 70 42 74 2d 3e 70 50 61 67 65 31 29 29  ta(pBt->pPage1))
1bd90 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
1bda0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
1bdb0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1bdc0 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20  he offset 28 of 
1bdd0 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20  the header.     
1bde0 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61   ** when the tra
1bdf0 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
1be00 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61  , so we know tha
1be10 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f  t the value at o
1be20 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32  ffset.      ** 2
1be30 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f  8 is nonzero. */
1be40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1be50 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20  Bt->nPage>0 );. 
1be60 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1be70 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1be80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1be90 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1bea0 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
1beb0 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
1bec0 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
1bed0 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
1bee0 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
1bef0 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1bf00 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
1bf10 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
1bf20 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
1bf30 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
1bf40 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1bf50 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
1bf60 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
1bf70 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
1bf80 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1bf90 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
1bfa0 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
1bfb0 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
1bfc0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1bfd0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  on..**.** If wrF
1bfe0 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
1bff0 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
1c000 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1c010 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
1c020 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
1c030 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
1c040 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
1c050 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
1c060 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
1c070 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
1c080 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
1c090 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
1c0a0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
1c0b0 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
1c0c0 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
1c0d0 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
1c0e0 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
1c0f0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
1c100 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
1c110 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
1c120 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
1c130 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1c140 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
1c150 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
1c160 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
1c170 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
1c180 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
1c190 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
1c1a0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
1c1b0 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
1c1c0 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
1c1d0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
1c1e0 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
1c1f0 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
1c200 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
1c210 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
1c220 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
1c230 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
1c240 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
1c250 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1c260 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
1c270 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
1c280 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
1c290 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
1c2a0 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
1c2b0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
1c2c0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
1c2d0 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
1c2e0 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
1c2f0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
1c300 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
1c310 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
1c320 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
1c330 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1c340 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1c350 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
1c360 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
1c370 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
1c380 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1c390 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1c3a0 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73  CursorZero() has
1c3b0 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20   been called.** 
1c3c0 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69  on pCur to initi
1c3d0 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
1c3e0 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20   space prior to 
1c3f0 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
1c400 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
1c410 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
1c420 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c450 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
1c460 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c480 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1c490 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
1c4a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
1c4b0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c4d0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1c4e0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1c4f0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1c500 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1c510 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1c520 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
1c530 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
1c540 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c560 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
1c570 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
1c580 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1c590 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
1c5a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c5b0 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
1c5c0 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dle */..  assert
1c5d0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1c5e0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1c5f0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1c600 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20  =0 || wrFlag==1 
1c610 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
1c620 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
1c630 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
1c640 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
1c650 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
1c660 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
1c670 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
1c680 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
1c690 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
1c6a0 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
1c6b0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
1c6c0 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
1c6d0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
1c6e0 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
1c6f0 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
1c700 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c710 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1c720 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
1c730 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
1c740 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61  wrFlag+1) );.  a
1c750 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1c760 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
1c770 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
1c780 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
1c790 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1c7a0 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
1c7b0 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
1c7c0 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
1c7d0 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
1c7e0 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
1c7f0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1c800 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
1c810 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1c820 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
1c830 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
1c840 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20  e1->aData );..  
1c850 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67  if( NEVER(wrFlag
1c860 20 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c   && pBt->readOnl
1c870 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  y) ){.    return
1c880 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1c890 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
1c8a0 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
1c8b0 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
1c8c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  ){.    assert( w
1c8d0 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rFlag==0 );.    
1c8e0 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  iTable = 0;.  }.
1c8f0 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
1c900 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
1c910 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
1c920 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
1c930 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
1c940 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
1c950 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
1c960 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
1c970 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
1c980 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
1c990 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
1c9a0 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
1c9b0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
1c9c0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
1c9d0 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
1c9e0 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
1c9f0 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
1ca00 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20  = (u8)wrFlag;.  
1ca10 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
1ca20 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
1ca30 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1ca40 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
1ca50 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
1ca60 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
1ca70 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
1ca80 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1ca90 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43  OR_INVALID;.  pC
1caa0 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20  ur->cachedRowid 
1cab0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
1cac0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
1cad0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1cae0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb10 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1cb20 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cb50 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1cb60 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1cb70 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cba0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1cbb0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1cbc0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1cbd0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1cbe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1cbf0 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
1cc00 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
1cc10 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc30 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
1cc40 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
1cc50 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1cc60 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1cc70 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
1cc80 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61  reeCursor(p, iTa
1cc90 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65  ble, wrFlag, pKe
1cca0 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20  yInfo, pCur);.  
1ccb0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1ccc0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1ccd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1cce0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
1ccf0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1cd00 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
1cd10 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
1cd20 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
1cd30 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
1cd40 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
1cd50 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
1cd60 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
1cd70 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
1cd80 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1cd90 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
1cda0 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
1cdb0 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
1cdc0 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
1cdd0 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
1cde0 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
1cdf0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1ce00 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
1ce10 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
1ce20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42   ROUND8(sizeof(B
1ce30 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a  tCursor));.}../*
1ce40 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d  .** Initialize m
1ce50 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20  emory that will 
1ce60 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
1ce70 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  o a BtCursor obj
1ce80 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ect..**.** The s
1ce90 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68  imple approach h
1cea0 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ere would be to 
1ceb0 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74  memset() the ent
1cec0 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ire object.** to
1ced0 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74   zero.  But it t
1cee0 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68  urns out that th
1cef0 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  e apPage[] and a
1cf00 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a  iIdx[] arrays.**
1cf10 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
1cf20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68  be zeroed and th
1cf30 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f  ey are large, so
1cf40 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c   we can save a l
1cf50 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d  ot.** of run-tim
1cf60 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68  e by skipping th
1cf70 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
1cf80 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e   of those elemen
1cf90 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
1cfa0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
1cfb0 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ro(BtCursor *p){
1cfc0 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1cfd0 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f  offsetof(BtCurso
1cfe0 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  r, iPage));.}../
1cff0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63  *.** Set the cac
1d000 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20  hed rowid value 
1d010 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  of every cursor 
1d020 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
1d030 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20  base file.** as 
1d040 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20  pCur and having 
1d050 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61  the same root pa
1d060 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75  ge number as pCu
1d070 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  r.  The value is
1d080 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69  .** set to iRowi
1d090 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f  d..**.** Only po
1d0a0 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c  sitive rowid val
1d0b0 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
1d0c0 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69  ed valid for thi
1d0d0 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20  s cache..** The 
1d0e0 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c  cache is initial
1d0f0 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e  ized to zero, in
1d100 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61  dicating an inva
1d110 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20  lid cache..** A 
1d120 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20  btree will work 
1d130 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f  fine with zero o
1d140 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
1d150 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e  s.  We just cann
1d160 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f  ot.** cache zero
1d170 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1d180 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ids, which means
1d190 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65   tables that use
1d1a0 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61   zero or.** nega
1d1b0 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68  tive rowids migh
1d1c0 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
1d1d0 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70  lower.  But in p
1d1e0 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a  ractice, zero.**
1d1f0 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1d200 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e 63  ids are very unc
1d210 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68  ommon so this sh
1d220 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72  ould not be a pr
1d230 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
1d240 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
1d250 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73  chedRowid(BtCurs
1d260 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65  or *pCur, sqlite
1d270 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b  3_int64 iRowid){
1d280 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1d290 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42    for(p=pCur->pB
1d2a0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1d2b0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1d2c0 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  if( p->pgnoRoot=
1d2d0 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
1d2e0 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  ) p->cachedRowid
1d2f0 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20   = iRowid;.  }. 
1d300 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
1d310 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77  achedRowid==iRow
1d320 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  id );.}../*.** R
1d330 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65 64  eturn the cached
1d340 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67   rowid for the g
1d350 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20  iven cursor.  A 
1d360 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f  negative or zero
1d370 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
1d380 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1d390 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20  the rowid cache 
1d3a0 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73  is invalid and s
1d3b0 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f  hould be.** igno
1d3c0 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77  red.  If the row
1d3d0 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65 76  id cache has nev
1d3e0 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73  er before been s
1d3f0 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65  et, then a.** ze
1d400 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
1d410 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
1d420 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1d430 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
1d440 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
1d450 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68  eturn pCur->cach
1d460 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  edRowid;.}../*.*
1d470 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
1d480 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
1d490 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d4a0 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
1d4b0 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
1d4c0 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
1d4d0 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
1d4e0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
1d4f0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
1d500 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
1d510 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
1d520 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
1d530 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
1d540 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1d550 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
1d560 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1d570 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1d580 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1d590 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
1d5a0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
1d5b0 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43  Prev ){.      pC
1d5c0 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
1d5d0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
1d5e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d5f0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1d600 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1d610 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
1d620 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
1d630 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1d640 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
1d650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1d660 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
1d670 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1d680 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1d690 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
1d6a0 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
1d6b0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1d6c0 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  );.    invalidat
1d6d0 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
1d6e0 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  Cur);.    /* sql
1d6f0 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
1d700 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
1d710 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1d720 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d730 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1d740 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1d750 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
1d760 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
1d770 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
1d780 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
1d790 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
1d7a0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1d7b0 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
1d7c0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
1d7d0 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
1d7e0 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
1d7f0 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
1d800 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1d810 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
1d820 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
1d830 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
1d840 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1d850 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
1d860 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a  rseCell()..**.**
1d870 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68   2007-06-25:  Th
1d880 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20  ere is a bug in 
1d890 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
1d8a0 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65   MSVC that cause
1d8b0 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
1d8c0 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67   to crash when g
1d8d0 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20  etCellInfo() is 
1d8e0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1d8f0 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74   macro..** But t
1d900 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72  here is a measur
1d910 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61  eable speed adva
1d920 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74  ntage to using t
1d930 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a  he macro on gcc.
1d940 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f  ** (when less co
1d950 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74  mpiler optimizat
1d960 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72  ions like -Os or
1d970 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e   -O0 are used an
1d980 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  d the.** compile
1d990 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61  r is not doing a
1d9a0 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e  gressive inlinin
1d9b0 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61  g.)  So we use a
1d9c0 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a   real function.*
1d9d0 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61  * for MSVC and a
1d9e0 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79   macro for every
1d9f0 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63  thing else.  Tic
1da00 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69  ket #2457..*/.#i
1da10 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
1da20 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
1da30 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
1da40 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
1da50 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1da60 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1da70 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
1da80 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
1da90 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
1daa0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1dab0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1dac0 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
1dad0 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
1dae0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
1daf0 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
1db00 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
1db10 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
1db20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
1db30 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
1db40 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
1db50 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
1db60 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
1db70 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
1db80 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
1db90 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
1dba0 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
1dbb0 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
1dbc0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1dbd0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
1dbe0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
1dbf0 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
1dc00 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
1dc10 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1dc20 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1dc30 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
1dc40 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
1dc50 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43  >info);.      pC
1dc60 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1dc70 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1dc80 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1dc90 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  fo(pCur);.    }.
1dca0 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20    }.#else /* if 
1dcb0 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a  not _MSC_VER */.
1dcc0 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f    /* Use a macro
1dcd0 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f   in all other co
1dce0 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20  mpilers so that 
1dcf0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
1dd00 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69  inlined */.#defi
1dd10 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  ne getCellInfo(p
1dd20 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20  Cur)            
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
1dd60 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1dd70 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  ze==0 ){        
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1ddb0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1ddc0 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20  r->iPage;       
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1de00 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1de10 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1de20 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1de30 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1de40 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72  nfo); \.    pCur
1de50 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65         \.  }else
1dea0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dee0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73          \.    as
1def0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1df00 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r);             
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df30 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
1df40 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
1df50 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44  R */..#ifndef ND
1df60 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
1df70 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
1df80 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
1df90 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1dfa0 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
1dfb0 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
1dfc0 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
1dfd0 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
1dfe0 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
1dff0 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
1e000 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
1e010 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
1e020 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
1e030 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
1e040 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
1e050 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
1e060 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1e070 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
1e080 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
1e090 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
1e0a0 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
1e0b0 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
1e0c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1e0d0 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
1e0e0 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NDEBUG */../*.**
1e0f0 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
1e100 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
1e110 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20  uffer needed to 
1e120 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f  hold the value o
1e130 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72  f.** the key for
1e140 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
1e150 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ry.  If the curs
1e160 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
1e170 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
1e180 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69   entry, *pSize i
1e190 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a  s set to 0. .**.
1e1a0 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77  ** For a table w
1e1b0 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66  ith the INTKEY f
1e1c0 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f  lag set, this ro
1e1d0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1e1e0 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c  e key.** itself,
1e1f0 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
1e200 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
1e210 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  key..**.** The c
1e220 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74  aller must posit
1e230 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70  ion the cursor p
1e240 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
1e250 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1e260 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
1e270 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  ne cannot fail. 
1e280 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72   It always retur
1e290 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a  ns SQLITE_OK.  .
1e2a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e2b0 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
1e2c0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
1e2d0 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
1e2e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1e2f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1e300 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1e310 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1e320 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
1e330 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e340 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1e350 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
1e360 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69  ALID ){.    *pSi
1e370 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ze = 0;.  }else{
1e380 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  .    getCellInfo
1e390 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69  (pCur);.    *pSi
1e3a0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
1e3b0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nKey;.  }.  retu
1e3c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e3d0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1e3e0 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
1e3f0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
1e400 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
1e410 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
1e420 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1e430 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1e440 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
1e450 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
1e460 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
1e470 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
1e480 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
1e490 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
1e4a0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
1e4b0 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
1e4c0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
1e4d0 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
1e4e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1e4f0 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75  LID..**.** Failu
1e500 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
1e510 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  le.  This functi
1e520 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  on always return
1e530 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  s SQLITE_OK..** 
1e540 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73  It might just as
1e550 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65   well be a proce
1e560 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20  dure (returning 
1e570 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e  void) but we con
1e580 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75  tinue.** to retu
1e590 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  rn an integer re
1e5a0 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69  sult code for hi
1e5b0 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73  storical reasons
1e5c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e5d0 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
1e5e0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1e5f0 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  2 *pSize){.  ass
1e600 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1e610 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1e620 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1e630 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1e640 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
1e650 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
1e660 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1e670 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72  o.nData;.  retur
1e680 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e690 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
1e6a0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
1e6b0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
1e6c0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1e6d0 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
1e6e0 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
1e6f0 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
1e700 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1e710 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1e720 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
1e730 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
1e740 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
1e750 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
1e760 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
1e770 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
1e780 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
1e790 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
1e7a0 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
1e7b0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
1e7c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
1e7d0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1e7e0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1e7f0 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
1e800 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1e810 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
1e820 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1e830 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
1e840 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
1e850 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
1e860 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c  ge ovfl is the l
1e870 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20  ast page in its 
1e880 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c  linked .** list,
1e890 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
1e8a0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
1e8b0 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
1e8c0 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20  not NULL, and a 
1e8d0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
1e8e0 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
1e8f0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1e900 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
1e910 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e  pOvfl was obtain
1e920 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  ed, then *ppPage
1e930 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1e940 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65   to that.** refe
1e950 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65  rence. It is the
1e960 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1e970 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
1e980 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
1e990 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67  e().** on *ppPag
1e9a0 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65  e to free the re
1e9b0 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72  ference. In no r
1e9c0 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74  eference was obt
1e9d0 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a  ained (because.*
1e9e0 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
1e9f0 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62  p was used to ob
1ea00 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66  tain the value f
1ea10 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20  or *pPgnoNext), 
1ea20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20  then.** *ppPage 
1ea30 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  is set to zero..
1ea40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1ea50 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
1ea60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea80 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
1ea90 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66  le */.  Pgno ovf
1eaa0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1eab0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1eac0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1ead0 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  mber */.  MemPag
1eae0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
1eaf0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
1eb00 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d  emPage handle (m
1eb10 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20  ay be NULL) */. 
1eb20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb40 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
1eb50 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1eb60 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
1eb70 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  t = 0;.  MemPage
1eb80 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
1eb90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1eba0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
1ebb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1ebc0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1ebd0 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65    assert(pPgnoNe
1ebe0 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xt);..#ifndef SQ
1ebf0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1ec00 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
1ec10 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
1ec20 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1ec30 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
1ec40 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
1ec50 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
1ec60 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
1ec70 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1ec80 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
1ec90 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
1eca0 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
1ecb0 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
1ecc0 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
1ecd0 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
1ece0 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
1ecf0 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
1ed00 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
1ed10 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
1ed20 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
1ed30 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
1ed40 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1ed50 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
1ed60 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
1ed70 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
1ed80 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
1ed90 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
1eda0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
1edb0 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
1edc0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1edd0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1ede0 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
1edf0 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
1ee00 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  =btreePagecount(
1ee10 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
1ee20 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1ee30 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
1ee40 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
1ee50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ee60 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  K && eType==PTRM
1ee70 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
1ee80 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
1ee90 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
1eea0 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ess;.        rc 
1eeb0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1eec0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1eed0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1eee0 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63  t( next==0 || rc
1eef0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  ==SQLITE_DONE );
1ef00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ef10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1ef20 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1ef30 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
1ef40 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1ef50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
1ef60 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
1ef70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ef80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
1ef90 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
1efa0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
1efb0 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
1efc0 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
1efd0 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
1efe0 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
1eff0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1f000 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
1f010 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
1f020 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1f030 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
1f040 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1f050 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1f060 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
1f070 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
1f080 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
1f090 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
1f0a0 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
1f0b0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
1f0c0 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70   If the eOp.** p
1f0d0 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74  arameter is 0, t
1f0e0 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
1f0f0 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f  eration (data co
1f100 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66  pied into.** buf
1f110 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74  fer pBuf). If it
1f120 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20   is non-zero, a 
1f130 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69  write (data copi
1f140 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65  ed from.** buffe
1f150 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41  r pBuf)..**.** A
1f160 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20   total of "amt" 
1f170 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f  bytes are read o
1f180 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e  r written beginn
1f190 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ing at "offset".
1f1a0 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64  .** Data is read
1f1b0 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20   to or from the 
1f1c0 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a  buffer pBuf..**.
1f1d0 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62  ** The content b
1f1e0 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69  eing read or wri
1f1f0 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61  tten might appea
1f200 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61  r on the main pa
1f210 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74  ge.** or be scat
1f220 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c  tered out on mul
1f230 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70  tiple overflow p
1f240 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ages..**.** If t
1f250 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e  he BtCursor.isIn
1f260 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
1f270 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68  g is set, and th
1f280 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72  e current.** cur
1f290 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
1f2a0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
1f2b0 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20  low pages, this 
1f2c0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f  function.** allo
1f2d0 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20  cates space for 
1f2e0 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75  and lazily poplu
1f2f0 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  ates the overflo
1f300 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20  w page-list .** 
1f310 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
1f320 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
1f330 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  . Subsequent cal
1f340 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63  ls use this.** c
1f350 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65  ache to make see
1f360 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  king to the supp
1f370 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65  lied offset more
1f380 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
1f390 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
1f3a0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1f3b0 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
1f3c0 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65  cated, it may be
1f3d0 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
1f3e0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
1f3f0 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
1f400 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
1f410 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
1f420 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
1f430 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
1f440 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
1f450 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
1f460 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
1f470 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
1f480 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
1f490 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1f4a0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
1f4b0 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
1f4c0 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
1f4d0 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
1f4e0 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
1f4f0 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
1f500 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
1f510 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
1f520 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1f530 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1f540 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
1f550 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1f560 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
1f570 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
1f580 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
1f590 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
1f5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
1f5b0 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
1f5c0 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
1f5d0 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
1f5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f5f0 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
1f600 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
1f610 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
1f620 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
1f630 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
1f640 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
1f650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
1f660 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
1f670 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
1f680 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1f690 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1f6a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1f6b0 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65  TE_OK;.  u32 nKe
1f6c0 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  y;.  int iIdx = 
1f6d0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1f6e0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1f6f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1f700 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
1f710 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
1f720 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
1f730 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f750 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
1f760 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
1f770 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1f780 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
1f790 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1f7a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1f7b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1f7c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1f7d0 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
1f7e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1f7f0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1f800 75 72 29 20 29 3b 0a 0a 0a 20 20 67 65 74 43 65  ur) );...  getCe
1f810 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1f820 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1f830 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43  >info.pCell + pC
1f840 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
1f850 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67  ;.  nKey = (pPag
1f860 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20  e->intKey ? 0 : 
1f870 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
1f880 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45  nKey);..  if( NE
1f890 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e  VER(offset+amt >
1f8a0 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
1f8b0 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20 26  .nData) .   || &
1f8c0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
1f8d0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
1f8e0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
1f8f0 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29  >usableSize].  )
1f900 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
1f910 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
1f920 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
1f930 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
1f940 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
1f950 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f960 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
1f970 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
1f980 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
1f990 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
1f9a0 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
1f9b0 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
1f9c0 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
1f9d0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
1f9e0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
1f9f0 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
1fa00 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
1fa10 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
1fa20 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
1fa30 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
1fa40 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
1fa50 20 20 69 66 28 20 28 72 63 20 3d 20 62 74 72 65    if( (rc = btre
1fa60 65 4d 61 6b 65 50 61 67 65 57 72 69 74 65 61 62  eMakePageWriteab
1fa70 6c 65 28 70 50 61 67 65 29 29 21 3d 53 51 4c 49  le(pPage))!=SQLI
1fa80 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1fa90 63 3b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  c;.      getCell
1faa0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1fab0 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
1fac0 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20  r->info.pCell + 
1fad0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
1fae0 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  er;.      memcpy
1faf0 28 61 50 61 79 6c 6f 61 64 2b 6f 66 66 73 65 74  (aPayload+offset
1fb00 2c 20 70 42 75 66 2c 20 61 29 3b 0a 20 20 20 20  , pBuf, a);.    
1fb10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
1fb20 63 70 79 28 70 42 75 66 2c 20 61 50 61 79 6c 6f  cpy(pBuf, aPaylo
1fb30 61 64 2b 6f 66 66 73 65 74 2c 20 61 29 3b 0a 20  ad+offset, a);. 
1fb40 20 20 20 7d 0a 20 20 20 20 6f 66 66 73 65 74 20     }.    offset 
1fb50 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
1fb60 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
1fb70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
1fb80 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
1fb90 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
1fba0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1fbb0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1fbc0 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
1fbd0 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
1fbe0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
1fbf0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
1fc00 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
1fc10 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
1fc20 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
1fc30 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
1fc40 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
1fc50 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
1fc60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fc70 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
1fc80 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
1fc90 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
1fca0 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
1fcb0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
1fcc0 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
1fcd0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
1fce0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
1fcf0 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
1fd00 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
1fd10 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
1fd20 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
1fd30 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1fd40 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
1fd50 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
1fd60 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
1fd70 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
1fd80 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
1fd90 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
1fda0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
1fdb0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
1fdc0 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
1fdd0 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
1fde0 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
1fdf0 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
1fe00 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
1fe10 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
1fe20 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
1fe30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
1fe40 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
1fe50 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
1fe60 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
1fe70 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
1fe80 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
1fe90 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
1fea0 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
1feb0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1fec0 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
1fed0 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a  nOvfl);.      /*
1fee0 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79 73   nOvfl is always
1fef0 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20 69   positive.  If i
1ff00 74 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65 74  t were zero, fet
1ff10 63 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20  chPayload would 
1ff20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  have.      ** be
1ff30 65 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  en used instead 
1ff40 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  of this routine.
1ff50 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
1ff60 57 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20 21  WAYS(nOvfl) && !
1ff70 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1ff80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ff90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1ffa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1ffb0 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
1ffc0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1ffd0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
1ffe0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
1fff0 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
20000 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
20010 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
20020 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
20030 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
20040 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
20050 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
20060 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
20070 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
20080 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ovflSize] ){.   
20090 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
200a0 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
200b0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
200c0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
200d0 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
200e0 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
200f0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Size);.    }.#en
20100 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20  dif..    for( ; 
20110 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20120 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
20130 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69  ge; iIdx++){..#i
20140 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20150 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
20160 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
20170 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
20180 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
20190 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
201a0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
201b0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
201c0 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
201d0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
201e0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
201f0 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
20200 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
20210 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
20220 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
20230 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
20240 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
20250 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
20260 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
20270 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
20280 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
20290 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
202a0 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
202b0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
202c0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
202d0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
202e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
202f0 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
20300 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
20310 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
20320 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
20330 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
20340 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
20350 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
20360 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
20370 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
20380 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
20390 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
203a0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
203b0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
203c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
203d0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
203e0 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
203f0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
20400 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
20410 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
20420 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20  } else .#endif. 
20430 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
20440 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
20450 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
20460 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
20470 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
20480 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
20490 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
204a0 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
204b0 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
204c0 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
204d0 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
204e0 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
204f0 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
20500 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
20510 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
20520 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  )..        */.#i
20530 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
20540 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
20550 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20560 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69  _file *fd;.#endi
20570 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  f.        int a 
20580 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  = amt;.        i
20590 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
205a0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
205b0 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
205c0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
205d0 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
205e0 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
205f0 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
20600 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65     /* If all the
20610 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
20620 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rue:.        **.
20630 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20          **   1) 
20640 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
20650 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20  peration, and . 
20660 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64         **   2) d
20670 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
20680 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
20690 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  f this overflow 
206a0 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  page, and.      
206b0 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61    **   3) the da
206c0 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62  tabase is file-b
206d0 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20  acked, and.     
206e0 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65     **   4) there
206f0 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74   is no open writ
20700 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e-transaction, a
20710 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
20720 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  5) the database 
20730 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74  is not a WAL dat
20740 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a  abase,.        *
20750 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
20760 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65  n data can be re
20770 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ad directly from
20780 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20790 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  le into the.    
207a0 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75      ** output bu
207b0 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20  ffer, bypassing 
207c0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
207d0 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20  ltogether. This 
207e0 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a  speeds.        *
207f0 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72  * up loading lar
20800 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
20810 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c  span many overfl
20820 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20  ow pages..      
20830 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
20840 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20   eOp==0         
20850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20870 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
20880 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74         && offset
20890 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
208c0 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
208d0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
208e0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41  ction==TRANS_REA
208f0 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
20900 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a        /* (4) */.
20910 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20           && (fd 
20920 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
20930 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  le(pBt->pPager))
20940 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f  ->pMethods     /
20950 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (3) */.       
20960 20 20 26 26 20 62 74 72 65 65 47 65 74 44 61 74    && btreeGetDat
20970 61 28 70 42 74 2d 3e 70 50 61 67 65 31 29 5b 31  a(pBt->pPage1)[1
20980 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20  9]==0x01        
20990 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a          /* (5) *
209a0 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
209b0 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
209c0 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
209d0 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
209e0 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
209f0 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57  memcpy(aSave, aW
20a00 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  rite, 4);.      
20a10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20a20 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74  OsRead(fd, aWrit
20a30 65 2c 20 61 2b 34 2c 20 70 42 74 2d 3e 70 61 67  e, a+4, pBt->pag
20a40 65 53 69 7a 65 20 2a 20 28 6e 65 78 74 50 61 67  eSize * (nextPag
20a50 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  e-1));.         
20a60 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
20a70 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20  byte(aWrite);.  
20a80 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
20a90 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29  Write, aSave, 4)
20aa0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
20ab0 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20  #endif..        
20ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  {.          DbPa
20ad0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
20ae0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20af0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
20b00 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
20b10 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  e, &pDbPage);.  
20b20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
20b30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20b40 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70           if( eOp
20b50 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
20b60 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
20b70 61 67 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  age))!=SQLITE_OK
20b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20b90 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
20ba0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
20bb0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
20bc0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
20bd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
20be0 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
20bf0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
20c00 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20c10 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
20c20 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
20c30 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ad);.           
20c40 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
20c50 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
20c60 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
20c70 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 29 3b 0a  t+4], pBuf, a);.
20c80 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
20c90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
20ca0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 61   memcpy(pBuf, &a
20cb0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
20cc0 5d 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20  ], a);.         
20cd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
20ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
20cf0 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
20d00 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
20d10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
20d20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20d30 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20     amt -= a;.   
20d40 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
20d50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20d60 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
20d70 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
20d80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
20d90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20da0 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
20db0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
20dc0 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65  d part of the ke
20dd0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
20de0 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
20df0 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
20e00 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
20e10 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
20e20 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
20e30 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
20e40 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
20e50 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
20e60 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
20e70 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  ur is pointing t
20e80 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a  o a valid row.**
20e90 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
20ea0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
20eb0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
20ec0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
20ed0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
20ee0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
20ef0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
20f00 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
20f10 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
20f20 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
20f30 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
20f40 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
20f50 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
20f60 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
20f70 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
20f80 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  uf){.  assert( c
20f90 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
20fa0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
20fb0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
20fc0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
20fd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20fe0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
20ff0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21000 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
21010 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
21020 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
21030 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21040 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
21050 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
21060 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
21070 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
21080 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
21090 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
210a0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ad part of the d
210b0 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
210c0 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
210d0 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
210e0 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
210f0 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
21100 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
21110 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
21120 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
21130 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
21140 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
21150 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
21160 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
21170 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
21180 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
21190 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
211a0 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
211b0 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
211c0 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
211d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
211e0 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ta(BtCursor *pCu
211f0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
21200 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
21210 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
21220 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21230 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69  MIT_INCRBLOB.  i
21240 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
21250 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
21260 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
21270 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
21280 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
21290 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
212a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
212b0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
212c0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
212d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
212e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
212f0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
21300 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
21310 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
21320 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
21330 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21340 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20  r->iPage] );.   
21350 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21360 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
21370 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
21380 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
21390 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  ll );.    rc = a
213a0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
213b0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
213c0 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pBuf, 0);.  }.  
213d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
213e0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
213f0 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20  nter to payload 
21400 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
21410 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
21420 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72  the .** pCur cur
21430 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
21440 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72  to.  The pointer
21450 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e   is to the begin
21460 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  ning of.** the k
21470 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30  ey if skipKey==0
21480 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74   and it points t
21490 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
214a0 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b  of data if.** sk
214b0 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e  ipKey==1.  The n
214c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
214d0 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f  f available key/
214e0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a  data is written.
214f0 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  ** into *pAmt.  
21500 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
21510 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
21520 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
21530 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e  .** a valid poin
21540 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
21550 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
21560 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
21570 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
21580 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
21590 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
215a0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
215b0 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
215c0 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
215d0 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
215e0 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
215f0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
21600 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
21610 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
21620 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
21630 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
21640 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
21650 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
21660 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
21670 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
21680 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
21690 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
216a0 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  le.** the key/da
216b0 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
216c0 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
216d0 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
216e0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
216f0 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
21700 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
21710 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
21720 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
21730 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
21740 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
21750 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
21760 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
21770 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
21780 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
21790 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
217a0 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50  ned char *fetchP
217b0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
217c0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
217d0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
217e0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
217f0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
21800 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20   *pAmt,         
21810 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
21820 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
21830 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
21840 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20  .  int skipKey  
21850 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20          /* read 
21860 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74  beginning at dat
21870 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
21880 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
21890 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
218a0 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d;.  MemPage *pP
218b0 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  age;.  u32 nKey;
218c0 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a  .  u32 nLocal;..
218d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
218e0 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  0 && pCur->iPage
218f0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
21900 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21920 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21930 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
21940 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
21950 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
21960 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
21970 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21980 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  e];.  assert( pC
21990 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
219a0 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
219b0 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ell );.  if( NEV
219c0 45 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  ER(pCur->info.nS
219d0 69 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 62  ize==0) ){.    b
219e0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
219f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21a00 3e 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  >iPage], pCur->a
21a10 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
21a20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
21a30 20 20 20 20 20 20 26 70 43 75 72 2d 3e 69 6e 66        &pCur->inf
21a40 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c 6f  o);.  }.  aPaylo
21a50 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
21a60 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61  pCell;.  aPayloa
21a70 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  d += pCur->info.
21a80 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70  nHeader;.  if( p
21a90 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
21aa0 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20      nKey = 0;.  
21ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20  }else{.    nKey 
21ac0 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
21ad0 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  o.nKey;.  }.  if
21ae0 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
21af0 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65   aPayload += nKe
21b00 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  y;.    nLocal = 
21b10 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
21b20 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73  l - nKey;.  }els
21b30 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  e{.    nLocal = 
21b40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
21b50 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  l;.    assert( n
21b60 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20  Local<=nKey );. 
21b70 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f   }.  *pAmt = nLo
21b80 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50  cal;.  return aP
21b90 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ayload;.}.../*.*
21ba0 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
21bb0 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
21bc0 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
21bd0 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
21be0 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
21bf0 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
21c00 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
21c10 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
21c20 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
21c30 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
21c40 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
21c50 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
21c60 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
21c70 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
21c80 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
21c90 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
21ca0 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
21cb0 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
21cc0 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
21cd0 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
21ce0 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
21cf0 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
21d00 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
21d10 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
21d20 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
21d30 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
21d40 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
21d50 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
21d60 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
21d70 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
21d80 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
21d90 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
21da0 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
21db0 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
21dc0 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
21dd0 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
21de0 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
21df0 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
21e00 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21e10 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f  int *pAmt){.  co
21e20 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b  nst void *p = 0;
21e30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21e40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
21e50 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
21e60 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
21e70 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21e80 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21e90 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d  if( ALWAYS(pCur-
21ea0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21eb0 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20  VALID) ){.    p 
21ec0 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  = (const void*)f
21ed0 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
21ee0 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
21ef0 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f    return p;.}.co
21f00 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
21f10 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
21f20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21f30 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f  int *pAmt){.  co
21f40 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b  nst void *p = 0;
21f50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21f60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
21f70 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
21f80 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
21f90 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21fa0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21fb0 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d  if( ALWAYS(pCur-
21fc0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21fd0 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20  VALID) ){.    p 
21fe0 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  = (const void*)f
21ff0 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
22000 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  , pAmt, 1);.  }.
22010 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a    return p;.}...
22020 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
22030 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
22040 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
22050 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
22060 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
22070 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
22080 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
22090 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
220a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
220b0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
220c0 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
220d0 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
220e0 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
220f0 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
22100 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
22110 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
22120 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
22130 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
22140 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
22150 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
22160 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
22170 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
22180 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
22190 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
221a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
221b0 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
221c0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
221d0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
221e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
221f0 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
22200 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
22210 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
22220 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22230 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
22240 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
22250 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
22260 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
22270 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
22280 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28  X_DEPTH );.  if(
22290 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
222a0 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
222b0 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
222c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
222d0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  T_BKPT;.  }.  rc
222e0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
222f0 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
22300 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66  &pNewPage);.  if
22310 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
22320 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
22330 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65  [i+1] = pNewPage
22340 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
22350 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  i+1] = 0;.  pCur
22360 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43  ->iPage++;..  pC
22370 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
22380 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
22390 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
223a0 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
223b0 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e  <1 || pNewPage->
223c0 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70  intKey!=pCur->ap
223d0 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20  Page[i]->intKey 
223e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
223f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
22400 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
22410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
22420 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
22430 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
22440 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
22450 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
22460 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
22470 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
22480 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
22490 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
224a0 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
224b0 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
224c0 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
224d0 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
224e0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
224f0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
22500 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
22510 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
22520 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
22530 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
22540 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
22550 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
22560 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
22570 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
22580 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
22590 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
225a0 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
225b0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
225c0 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
225d0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
225e0 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
225f0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
22600 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
22610 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
22620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
22630 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
22640 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
22650 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
22660 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
22670 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
22680 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
22690 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
226a0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
226b0 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
226c0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
226d0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
226e0 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
226f0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
22700 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
22710 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
22720 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
22730 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
22740 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
22750 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
22760 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
22770 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
22780 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
22790 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
227a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
227b0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
227c0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
227d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
227e0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
227f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22800 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22810 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
22820 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
22830 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
22840 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22850 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
22860 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
22870 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
22880 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
22890 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
228a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
228b0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
228c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
228d0 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  e]->pgno.  );.  
228e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
228f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22900 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e  Page]);.  pCur->
22910 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d  iPage--;.  pCur-
22920 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
22930 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
22940 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ey = 0;.}../*.**
22950 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
22960 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
22970 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74   root page of it
22980 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  s b-tree structu
22990 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
229a0 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72   table has a vir
229b0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20  tual root page, 
229c0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
229d0 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e  is moved to poin
229e0 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74  t.** to the virt
229f0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ual root page in
22a00 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74  stead of the act
22a10 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41  ual root page. A
22a20 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20   table has a.** 
22a30 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
22a40 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61  e when the actua
22a50 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74  l root page cont
22a60 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e  ains no cells an
22a70 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63  d a .** single c
22a80 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20  hild page. This 
22a90 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
22aa0 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72  with the table r
22ab0 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e  ooted at page 1.
22ac0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d  .**.** If the b-
22ad0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
22ae0 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72  s empty, the cur
22af0 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74  sor state is set
22b00 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49   to .** CURSOR_I
22b10 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73  NVALID. Otherwis
22b20 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  e, the cursor is
22b30 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
22b40 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65   the first.** ce
22b50 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68  ll located on th
22b60 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75  e root (or virtu
22b70 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e  al root) page an
22b80 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  d the cursor sta
22b90 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  te.** is set to 
22ba0 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
22bb0 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
22bc0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63  tion returns suc
22bd0 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61  cessfully, it ma
22be0 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  y be assumed tha
22bf0 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65  t the.** page-he
22c00 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63  ader flags indic
22c10 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69  ate that the [vi
22c20 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65  rtual] root-page
22c30 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
22c40 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74   .** kind of b-t
22c50 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69  ree page (i.e. i
22c60 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  f when opening t
22c70 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61  he cursor the ca
22c80 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20  ller did not.** 
22c90 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
22ca0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  o structure the 
22cb0 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
22cc0 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30  t to 0x05 or 0x0
22cd0 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  D,.** indicating
22ce0 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
22cf0 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65   or if the calle
22d00 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20  r did specify a 
22d10 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
22d20 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
22d30 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
22d40 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64  x02 or 0x0A, ind
22d50 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  icating an index
22d60 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a  .** b-tree)..*/.
22d70 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
22d80 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
22d90 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
22da0 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
22db0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22dc0 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
22dd0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
22de0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22df0 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
22e00 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
22e10 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
22e20 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
22e30 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
22e40 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
22e50 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
22e60 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
22e70 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
22e80 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
22e90 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
22ea0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
22eb0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
22ec0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
22ed0 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
22ee0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22ef0 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
22f00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22f10 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
22f20 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74  _OK );.      ret
22f30 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
22f40 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  xt;.    }.    sq
22f50 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
22f60 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d  ursor(pCur);.  }
22f70 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
22f80 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  age>=0 ){.    in
22f90 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
22fa0 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
22fb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
22fc0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
22fd0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
22fe0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
22ff0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
23000 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  f( pCur->pgnoRoo
23010 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  t==0 ){.    pCur
23020 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
23030 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
23040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23050 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
23060 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
23070 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
23080 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
23090 50 61 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69 66  Page[0]);.    if
230a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
230b0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
230c0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
230d0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
230e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
230f0 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
23100 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   0;..    /* If p
23110 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
23120 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
23130 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
23140 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
23150 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74  or.    ** expect
23160 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e  ed to open it on
23170 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
23180 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
23190 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20  pKeyInfo is.    
231a0 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
231b0 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
231c0 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
231d0 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
231e0 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75  ase,.    ** retu
231f0 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
23200 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a  RUPT error.  */.
23210 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
23220 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
23230 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e  Key==1 || pCur->
23240 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
23250 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  y==0 );.    if( 
23260 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
23270 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67  =0)!=pCur->apPag
23280 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
23290 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
232a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
232b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
232c0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
232d0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f  e root page is o
232e0 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79  f the correct ty
232f0 70 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  pe. This must be
23300 20 74 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 61   the.  ** case a
23310 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68  s the call to th
23320 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  is function that
23330 20 6c 6f 61 64 65 64 20 74 68 65 20 72 6f 6f 74   loaded the root
23340 2d 70 61 67 65 20 28 65 69 74 68 65 72 0a 20 20  -page (either.  
23350 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f 72 20  ** this call or 
23360 61 20 70 72 65 76 69 6f 75 73 20 69 6e 76 6f 63  a previous invoc
23370 61 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76  ation) would hav
23380 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
23390 70 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74  ption .  ** if t
233a0 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 77 65  he assumption we
233b0 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
233c0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
233d0 62 6c 65 20 66 6f 72 20 74 68 65 20 66 6c 61 67  ble for the flag
233e0 73 20 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f 20  s .  ** byte to 
233f0 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69  have been modifi
23400 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 63 75  ed while this cu
23410 72 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  rsor is holding 
23420 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a  a reference.  **
23430 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20 20 2a   to the page.  *
23440 2f 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  /.  pRoot = pCur
23450 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61  ->apPage[0];.  a
23460 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
23470 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
23480 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ot );.  assert( 
23490 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26  pRoot->isInit &&
234a0 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
234b0 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74  ==0)==pRoot->int
234c0 4b 65 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  Key );..  pCur->
234d0 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
234e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
234f0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74   = 0;.  pCur->at
23500 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72  Last = 0;.  pCur
23510 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
23520 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ..  if( pRoot->n
23530 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
23540 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
23550 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
23560 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
23570 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
23580 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23590 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
235a0 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
235b0 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
235c0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
235d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
235e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
235f0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
23600 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
23610 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23620 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28  pCur->eState = (
23630 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29  (pRoot->nCell>0)
23640 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55  ?CURSOR_VALID:CU
23650 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20  RSOR_INVALID);. 
23660 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
23670 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
23680 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
23690 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
236a0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
236b0 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
236c0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
236d0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
236e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
236f0 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
23700 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
23710 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
23720 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
23730 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
23740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
23750 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
23760 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
23770 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
23780 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23790 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
237a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
237b0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
237c0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
237d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
237e0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
237f0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
23800 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
23810 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
23820 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
23830 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
23840 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
23850 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
23860 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
23870 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
23880 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
23890 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
238a0 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20  ->iPage]));.    
238b0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
238c0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
238d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
238e0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
238f0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
23900 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
23910 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
23920 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
23930 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
23940 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
23950 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
23960 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
23970 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
23980 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
23990 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
239a0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
239b0 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
239c0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
239d0 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
239e0 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
239f0 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
23a00 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
23a10 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
23a20 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
23a30 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
23a40 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
23a50 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
23a60 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
23a70 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
23a80 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
23a90 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
23aa0 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
23ab0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
23ac0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
23ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
23ae0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
23af0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
23b00 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
23b10 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
23b20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23b30 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
23b40 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
23b50 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
23b60 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
23b70 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
23b80 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
23b90 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
23ba0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
23bb0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
23bc0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
23bd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
23be0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
23bf0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
23c00 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
23c10 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
23c20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
23c30 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23c40 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
23c50 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75  nCell-1;.    pCu
23c60 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
23c70 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
23c80 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  idNKey = 0;.  }.
23c90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23ca0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
23cb0 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
23cc0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
23cd0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
23ce0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
23cf0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
23d00 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
23d10 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
23d20 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
23d30 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
23d40 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
23d50 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
23d60 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
23d70 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
23d80 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
23d90 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
23da0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
23db0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
23dc0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23dd0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
23de0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
23df0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
23e00 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
23e10 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
23e20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
23e30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23e40 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
23e50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23e60 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
23e70 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
23e80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
23e90 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
23ea0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
23eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
23ec0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
23ed0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
23ee0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
23ef0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
23f00 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
23f10 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
23f20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23f30 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
23f40 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
23f50 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
23f60 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
23f70 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
23f80 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
23f90 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
23fa0 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
23fb0 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
23fc0 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
23fd0 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
23fe0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
23ff0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24000 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
24010 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
24020 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
24030 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
24040 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
24050 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
24060 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
24070 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
24080 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
24090 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
240a0 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
240b0 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
240c0 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
240d0 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
240e0 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
240f0 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43 75  r->eState && pCu
24100 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66  r->atLast ){.#if
24110 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
24120 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
24130 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73  ck serves to ass
24140 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63  ert() that the c
24150 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  ursor really doe
24160 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20  s point .    ** 
24170 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
24180 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e  y in the b-tree.
24190 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
241a0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
241b0 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69  <pCur->iPage; ii
241c0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
241d0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  t( pCur->aiIdx[i
241e0 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  i]==pCur->apPage
241f0 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  [ii]->nCell );. 
24200 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
24210 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24220 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d  r->iPage]==pCur-
24230 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24240 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b  age]->nCell-1 );
24250 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
24260 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24270 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a  iPage]->leaf );.
24280 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
24290 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
242a0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
242b0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
242c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
242d0 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
242e0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
242f0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
24300 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
24310 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
24320 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24330 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
24340 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
24350 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
24360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
24370 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
24380 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
24390 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
243a0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
243b0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
243c0 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73       pCur->atLas
243d0 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  t = rc==SQLITE_O
243e0 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20  K ?1:0;.    }.  
243f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24400 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
24410 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
24420 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
24430 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
24440 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
24450 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
24460 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
24470 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
24480 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
24490 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
244a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
244b0 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
244c0 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
244d0 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
244e0 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
244f0 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
24500 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
24510 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
24520 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
24530 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
24540 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
24550 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
24560 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
24570 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
24580 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
24590 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
245a0 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
245b0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
245c0 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
245d0 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
245e0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
245f0 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
24600 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
24610 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
24620 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
24630 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
24640 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
24650 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
24660 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
24670 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
24680 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
24690 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
246a0 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
246b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
246c0 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
246d0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
246e0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
246f0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
24700 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
24710 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
24720 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
24730 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
24740 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
24750 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
24760 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
24770 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
24780 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
24790 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
247a0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
247b0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
247c0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247e0 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
247f0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
24800 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
24810 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
24820 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
24830 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
24840 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
24850 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
24860 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
24870 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74  dxKey..**.*/.int
24880 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
24890 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
248a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
248b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
248c0 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
248d0 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
248e0 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
248f0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
24900 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
24910 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
24920 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
24930 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
24940 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
24950 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
24960 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
24970 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
24980 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
24990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
249a0 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
249b0 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
249c0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
249d0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
249e0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
249f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24a00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
24a10 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
24a20 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
24a30 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65  ( pRes );.  asse
24a40 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29  rt( (pIdxKey==0)
24a50 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
24a60 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  o==0) );..  /* I
24a70 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
24a80 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
24a90 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
24aa0 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
24ab0 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
24ac0 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
24ad0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
24ae0 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
24af0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
24b00 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43  RSOR_VALID && pC
24b10 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20  ur->validNKey . 
24b20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
24b30 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
24b40 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
24b50 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
24b60 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
24b70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
24b80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24b90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
24ba0 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
24bb0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
24bc0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
24bd0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
24be0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24bf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63  .    }.  }..  rc
24c00 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
24c10 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
24c20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
24c30 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
24c40 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
24c50 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
24c60 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
24c70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24c80 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
24c90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
24ca0 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
24cb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24cc0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
24cd0 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
24ce0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24cf0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
24d00 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
24d10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
24d20 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
24d30 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
24d40 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
24d50 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
24d60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24d70 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
24d80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
24d90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
24da0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
24db0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c  ge[0]->intKey ||
24dc0 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
24dd0 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
24de0 77 72 2c 20 75 70 72 2c 20 69 64 78 3b 0a 20 20  wr, upr, idx;.  
24df0 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20    Pgno chldPg;. 
24e00 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
24e10 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
24e20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
24e30 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f     int c;..    /
24e40 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d  * pPage->nCell m
24e50 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ust be greater t
24e60 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69  han zero. If thi
24e70 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61  s is the root-pa
24e80 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  ge.    ** the cu
24e90 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20  rsor would have 
24ea0 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f  been INVALID abo
24eb0 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28  ve and this for(
24ec0 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20  ;;) loop.    ** 
24ed0 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73  not run. If this
24ee0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74   is not the root
24ef0 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20  -page, then the 
24f00 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f  moveToChild() ro
24f10 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75  utine.    ** wou
24f20 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
24f30 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72  detected db corr
24f40 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c  uption. Similarl
24f50 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20  y, pPage must.  
24f60 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68    ** be the righ
24f70 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72  t kind (index or
24f80 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65   table) of b-tre
24f90 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  e page. Otherwis
24fa0 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54  e.    ** a moveT
24fb0 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65  oChild() or move
24fc0 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f  ToRoot() call wo
24fd0 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
24fe0 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  d corruption.  *
24ff0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
25000 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
25010 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
25020 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78  e->intKey==(pIdx
25030 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c  Key==0) );.    l
25040 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
25050 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
25060 3b 0a 20 20 20 20 69 66 28 20 62 69 61 73 52 69  ;.    if( biasRi
25070 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ght ){.      pCu
25080 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
25090 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64  Page] = (u16)(id
250a0 78 20 3d 20 75 70 72 29 3b 0a 20 20 20 20 7d 65  x = upr);.    }e
250b0 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
250c0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
250d0 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20  ge] = (u16)(idx 
250e0 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a  = (upr+lwr)/2);.
250f0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b      }.    for(;;
25100 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
25110 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25130 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
25140 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
25150 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
25160 74 28 20 69 64 78 3d 3d 70 43 75 72 2d 3e 61 69  t( idx==pCur->ai
25170 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
25180 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
25190 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
251a0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
251b0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
251c0 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
251d0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
251e0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
251f0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  y ){.        i64
25200 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
25210 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
25220 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
25230 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
25240 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
25250 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
25260 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20  ll, dummy);.    
25270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
25280 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
25290 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
252a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
252b0 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  llKey==intKey ){
252c0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  .          c = 0
252d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
252e0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
252f0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
25300 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   c = -1;.       
25310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25320 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
25330 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  ey>intKey );.   
25340 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20         c = +1;. 
25350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25360 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
25370 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
25380 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
25390 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
253a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
253b0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
253c0 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
253d0 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73  e is 65536 bytes
253e0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
253f0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
25400 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
25410 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
25420 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
25430 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
25440 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73    ** page is les
25450 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74  s than 16384 byt
25460 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74  es and may be st
25470 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
25480 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
25490 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
254a0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
254b0 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
254c0 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
254d0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
254e0 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
254f0 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
25500 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
25510 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
25520 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
25530 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
25540 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
25550 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
25560 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
25570 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
25580 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25590 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43    int nCell = pC
255a0 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
255b0 69 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78  if( !(nCell & 0x
255c0 38 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  80).         && 
255d0 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
255e0 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 20  xLocal.         
255f0 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  && (pCell+nCell+
25600 31 29 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  1)<=pPage->aData
25610 45 6e 64 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  End.        ){. 
25620 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
25630 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
25640 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
25650 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
25660 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
25670 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
25680 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
25690 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
256a0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
256b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
256c0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
256d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
256e0 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
256f0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
25700 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
25710 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
25720 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
25730 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
25740 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
25750 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
25760 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
25770 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
25780 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
25790 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
257a0 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
257b0 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
257c0 20 20 20 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65     && (pCell+nCe
257d0 6c 6c 2b 32 29 3c 3d 70 50 61 67 65 2d 3e 61 44  ll+2)<=pPage->aD
257e0 61 74 61 45 6e 64 0a 20 20 20 20 20 20 20 20 29  ataEnd.        )
257f0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
25800 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
25810 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65  ield is a 2 byte
25820 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
25830 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20  record .        
25840 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65    ** fits entire
25850 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62  ly on the main b
25860 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
25870 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
25880 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
25890 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  2==pPage->aDataE
258a0 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
258b0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
258c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
258d0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
258e0 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
258f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25900 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25910 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
25920 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
25930 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
25940 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
25950 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
25960 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
25970 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
25980 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
25990 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
259a0 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
259b0 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
259c0 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
259d0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
259e0 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
259f0 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
25a00 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
25a10 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  alled. */.      
25a20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
25a30 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
25a40 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
25a50 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
25a60 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
25a70 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  ;.          btre
25a80 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
25a90 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
25aa0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
25ab0 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
25ac0 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
25ad0 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
25ae0 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
25af0 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20  e3Malloc( nCell 
25b00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25b10 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
25b20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
25b30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
25b40 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
25b50 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
25b60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25b70 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73       rc = access
25b80 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c  Payload(pCur, 0,
25b90 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65   nCell, (unsigne
25ba0 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79  d char*)pCellKey
25bb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
25bc0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
25bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25be0 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
25bf0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
25c00 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
25c10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25c20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
25c30 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
25c40 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79  (nCell, pCellKey
25c50 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
25c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25c70 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
25c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25c90 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
25ca0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
25cb0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
25cc0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
25cd0 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
25ce0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  dx;.          br
25cf0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
25d00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  se{.          *p
25d10 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
25d20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
25d30 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
25d40 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
25d50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25d60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30   }.      if( c<0
25d70 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20   ){.        lwr 
25d80 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d  = idx+1;.      }
25d90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70  else{.        up
25da0 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
25db0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72   }.      if( lwr
25dc0 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >upr ){.        
25dd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
25de0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
25df0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
25e00 28 75 31 36 29 28 69 64 78 20 3d 20 28 6c 77 72  (u16)(idx = (lwr
25e10 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a  +upr)/2);.    }.
25e20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
25e30 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
25e40 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
25e50 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
25e60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
25e70 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
25e80 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
25e90 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
25ea0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
25eb0 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
25ec0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
25ed0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
25ee0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
25ef0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
25f00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25f10 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
25f20 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
25f30 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
25f40 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67  }.    if( chldPg
25f50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
25f60 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
25f70 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
25f80 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25f90 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
25fa0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
25fb0 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
25fc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
25fd0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
25fe0 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  h;.    }.    pCu
25ff0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26000 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72  Page] = (u16)lwr
26010 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
26020 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
26030 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
26040 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
26050 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
26060 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
26070 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
26080 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f  o_finish;.  }.mo
26090 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72  veto_finish:.  r
260a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
260b0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
260c0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
260d0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
260e0 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
260f0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
26100 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
26110 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
26120 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
26130 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
26140 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
26150 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
26160 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
26170 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
26180 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
26190 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
261a0 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
261b0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
261c0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
261d0 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
261e0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
261f0 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
26200 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
26210 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
26220 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
26230 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
26240 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
26250 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
26260 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
26270 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
26280 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
26290 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
262a0 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
262b0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
262c0 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
262d0 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
262e0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
262f0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
26300 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
26310 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
26320 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
26330 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
26340 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
26350 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
26360 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
26370 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
26380 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
26390 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
263a0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
263b0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
263c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
263d0 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
263e0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
263f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
26400 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
26410 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
26420 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
26430 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
26440 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
26450 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
26460 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
26470 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
26480 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
26490 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
264a0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
264b0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
264c0 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
264d0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
264e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
264f0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
26500 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ext>0 ){.    pCu
26510 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
26520 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
26530 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26540 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
26550 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
26560 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
26570 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26580 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
26590 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
265a0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
265b0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
265c0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  t );.  assert( i
265d0 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx<=pPage->nCell
265e0 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66   );..  pCur->inf
265f0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
26600 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
26610 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70   0;.  if( idx>=p
26620 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
26630 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
26640 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
26650 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
26660 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
26670 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
26680 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
26690 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
266a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
266b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
266c0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
266d0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
266e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
266f0 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
26700 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
26710 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
26720 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
26730 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
26740 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
26750 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
26760 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
26770 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
26780 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
26790 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
267a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
267b0 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69  iPage];.    }whi
267c0 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
267d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
267e0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
267f0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
26800 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
26810 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
26820 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
26830 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
26840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26850 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26860 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
26870 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73   rc;.  }.  *pRes
26880 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
26890 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
268a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
268b0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65  .  }.  rc = move
268c0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
268d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
268e0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  .../*.** Step th
268f0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
26900 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
26910 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
26920 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
26930 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
26940 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
26950 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
26960 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
26970 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
26980 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
26990 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
269a0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
269b0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
269c0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
269d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
269e0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
269f0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
26a00 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
26a10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
26a20 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
26a30 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
26a40 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
26a50 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
26a60 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
26a70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26a80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
26a90 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74  ;.  }.  pCur->at
26aa0 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Last = 0;.  if( 
26ab0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
26ac0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
26ad0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
26ae0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26af0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
26b00 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20  Cur->skipNext<0 
26b10 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
26b20 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a  pNext = 0;.    *
26b30 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
26b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26b50 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
26b60 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61  Next = 0;..  pPa
26b70 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
26b80 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
26b90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
26ba0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
26bb0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
26bc0 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
26bd0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26be0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
26bf0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
26c00 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
26c10 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
26c20 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
26c30 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
26c40 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
26c50 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
26c60 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
26c70 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
26c80 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26c90 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20  iPage]==0 ){.   
26ca0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
26cb0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
26cc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
26cd0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
26ce0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
26cf0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
26d00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
26d10 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
26d20 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
26d30 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
26d40 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
26d50 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
26d60 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75  ey = 0;..    pCu
26d70 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26d80 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
26d90 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
26da0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
26db0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
26dc0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
26dd0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
26de0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
26df0 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
26e00 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
26e10 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
26e20 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
26e30 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
26e40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26e50 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
26e60 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
26e70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
26e80 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
26e90 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
26ea0 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
26eb0 72 20 77 6f 72 64 73 2c 20 62 74 72 65 65 4d 61  r words, btreeMa
26ec0 6b 65 50 61 67 65 57 72 69 74 65 61 62 6c 65 28  kePageWriteable(
26ed0 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
26ee0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
26ef0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
26f00 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
26f10 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
26f20 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
26f30 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
26f40 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
26f50 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
26f60 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
26f70 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
26f80 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
26f90 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
26fa0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
26fb0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
26fc0 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
26fd0 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
26fe0 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
26ff0 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
27000 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
27010 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
27020 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
27030 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
27040 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
27050 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
27060 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
27070 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
27080 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
27090 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
270a0 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
270b0 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
270c0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
270d0 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
270e0 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
270f0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
27100 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
27110 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
27120 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
27130 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
27140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27150 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
27160 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
27170 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
27180 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
27190 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
271a0 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
271b0 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
271c0 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
271d0 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
271e0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
271f0 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
27200 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
27210 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
27220 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
27230 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
27240 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
27250 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
27260 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
27270 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
27280 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
27290 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
272a0 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
272b0 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
272c0 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
272d0 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
272e0 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
272f0 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
27300 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
27310 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
27320 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
27330 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27340 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
27350 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
27360 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
27370 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
27380 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
27390 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
273a0 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
273b0 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
273c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
273d0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
273e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
273f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
27400 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
27410 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20  Page1;.  mxPage 
27420 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
27430 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74  (pBt);.  n = get
27440 34 62 79 74 65 28 26 62 74 72 65 65 47 65 74 44  4byte(&btreeGetD
27450 61 74 61 28 70 50 61 67 65 31 29 5b 33 36 5d 29  ata(pPage1)[36])
27460 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
27470 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
27480 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
27490 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
274a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
274b0 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
274c0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
274d0 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
274e0 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
274f0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
27500 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
27510 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
27520 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
27530 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
27540 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
27550 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
27560 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
27570 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70  If the 'exact' p
27580 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75  arameter was tru
27590 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  e and a query of
275a0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
275b0 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
275c0 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
275d0 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
275e0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
275f0 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
27600 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
27610 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
27620 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
27630 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
27640 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
27650 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78  ACUUM.    if( ex
27660 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d  act && nearby<=m
27670 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75  xPage ){.      u
27680 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61  8 eType;.      a
27690 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
276a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
276b0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
276c0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
276d0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
276e0 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
276f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
27700 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27710 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
27720 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
27730 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
27740 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  st = 1;.      }.
27750 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e        *pPgno = n
27760 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e  earby;.    }.#en
27770 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
27780 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
27790 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
277a0 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
277b0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
277c0 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
277d0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
277e0 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
277f0 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
27800 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 62 74 72   */.    rc = btr
27810 65 65 4d 61 6b 65 50 61 67 65 57 72 69 74 65 61  eeMakePageWritea
27820 62 6c 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  ble(pPage1);.   
27830 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
27840 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
27850 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
27860 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
27870 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
27880 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
27890 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
278a0 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
278b0 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
278c0 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
278d0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
278e0 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
278f0 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
27900 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
27910 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
27920 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
27930 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ocated..    */. 
27940 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
27950 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
27960 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
27970 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
27980 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
27990 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
279a0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
279b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
279c0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
279d0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
279e0 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
279f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27a00 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
27a10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
27a20 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  unk>mxPage ){.  
27a30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27a40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
27a50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27a60 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
27a70 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
27a80 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
27a90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
27aa0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
27ab0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
27ac0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
27ad0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
27ae0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
27af0 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a  t( pTrunk!=0 );.
27b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
27b10 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29  runk->aData!=0 )
27b20 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  ;..      k = get
27b30 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
27b40 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20 6f  Data[4]); /* # o
27b50 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69 73  f leaves on this
27b60 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
27b70 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
27b80 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
27b90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
27ba0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
27bb0 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
27bc0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
27bd0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
27be0 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
27bf0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
27c00 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
27c10 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
27c20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
27c30 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
27c40 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
27c50 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
27c60 20 20 20 72 63 20 3d 20 62 74 72 65 65 4d 61 6b     rc = btreeMak
27c70 65 50 61 67 65 57 72 69 74 65 61 62 6c 65 28 70  ePageWriteable(p
27c80 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
27c90 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
27ca0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
27cb0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
27cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
27cd0 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
27ce0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
27cf0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
27d00 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
27d10 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
27d20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
27d30 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
27d40 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
27d50 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
27d60 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
27d70 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
27d80 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
27d90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
27da0 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
27db0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
27dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
27dd0 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
27de0 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
27df0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
27e00 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
27e10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
27e20 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
27e30 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
27e40 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
27e50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
27e60 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
27e70 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26  if( searchList &
27e80 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b  & nearby==iTrunk
27e90 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
27ea0 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67  he list is being
27eb0 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68   searched and th
27ec0 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  is trunk page is
27ed0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
27ee0 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65    ** to allocate
27ef0 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
27f00 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c  whether it has l
27f10 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  eaves..        *
27f20 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
27f30 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b  ( *pPgno==iTrunk
27f40 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50   );.        *ppP
27f50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
27f60 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
27f70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
27f80 20 3d 20 62 74 72 65 65 4d 61 6b 65 50 61 67 65   = btreeMakePage
27f90 57 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e 6b  Writeable(pTrunk
27fa0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27fb0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
27fc0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
27fd0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
27fe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
27ff0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
28000 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
28010 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
28020 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
28030 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
28040 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
28050 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
28060 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
28070 3d 20 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57  = btreeMakePageW
28080 72 69 74 65 61 62 6c 65 28 70 50 72 65 76 54 72  riteable(pPrevTr
28090 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
280a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
280b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
280c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
280d0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
280e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
280f0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
28100 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
28110 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
28120 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
28130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28150 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
28160 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
28170 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
28180 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
28190 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
281a0 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
281b0 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
281c0 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
281d0 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
281e0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
281f0 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
28200 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
28210 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
28220 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
28230 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
28240 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
28250 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
28260 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
28270 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
28280 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
28290 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
282a0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
282b0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
282c0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
282d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
282e0 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
282f0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
28300 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
28310 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
28320 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
28330 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
28340 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28360 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
28370 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
28380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28390 20 20 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65    rc = btreeMake
283a0 50 61 67 65 57 72 69 74 65 61 62 6c 65 28 70 4e  PageWriteable(pN
283b0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
283c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
283d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
283e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
283f0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
28400 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
28410 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
28420 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28430 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
28440 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
28450 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
28460 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
28470 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
28480 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
28490 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
284a0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
284b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
284c0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
284d0 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
284e0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
284f0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
28500 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
28510 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
28520 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
28530 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
28540 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
28550 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
28560 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
28570 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
28580 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
28590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
285a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
285b0 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50 61  rc = btreeMakePa
285c0 67 65 57 72 69 74 65 61 62 6c 65 28 70 50 72 65  geWriteable(pPre
285d0 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  vTrunk);.       
285e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
28600 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
28610 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
28620 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
28630 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
28640 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
28650 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
28660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
28670 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
28680 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
28690 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
286a0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
286b0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
286c0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
286d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
286e0 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
286f0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
28700 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
28710 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
28720 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
28730 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
28740 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
28750 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
28760 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
28770 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
28780 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
28790 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
287a0 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
287b0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
287c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
287d0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73  ist = sqlite3Abs
287e0 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
287f0 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
28800 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  by);.          f
28810 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
28820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
28830 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41  nt d2 = sqlite3A
28840 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
28850 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
28860 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
28870 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
28880 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
28890 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
288a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
288b0 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
288c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
288d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
288e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
288f0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
28900 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
28910 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
28920 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
28930 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
28940 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
28950 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
28960 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
28970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
28980 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
28990 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
289a0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
289b0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
289c0 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
289d0 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
289e0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
289f0 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c  ( !searchList ||
28a00 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29   iPage==nearby )
28a10 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
28a20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  noContent;.     
28a30 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
28a40 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54  age;.          T
28a50 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
28a60 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20   %d was leaf %d 
28a70 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25  of %d on trunk %
28a80 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
28a90 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66      ": %d more f
28aa0 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20  ree pages\n",.  
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
28ac0 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31  pPgno, closest+1
28ad0 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  , k, pTrunk->pgn
28ae0 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
28af0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 4d 61      rc = btreeMa
28b00 6b 65 50 61 67 65 57 72 69 74 65 61 62 6c 65 28  kePageWriteable(
28b10 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  pTrunk);.       
28b20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
28b30 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
28b40 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61 44  ge;.          aD
28b50 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
28b60 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ata;.          i
28b70 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
28b80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
28b90 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
28ba0 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
28bb0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
28bc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28bd0 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
28be0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
28bf0 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
28c00 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
28c10 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
28c20 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
28c30 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
28c40 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
28c50 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
28c60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
28c90 3d 20 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57  = btreeMakePageW
28ca0 72 69 74 65 61 62 6c 65 28 2a 70 70 50 61 67 65  riteable(*ppPage
28cb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
28cc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28ce0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
28cf0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
28d00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28d10 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
28d20 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
28d30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28d40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
28d50 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
28d60 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
28d70 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
28d80 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
28d90 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
28da0 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
28db0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
28dc0 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   so create a new
28dd0 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20   page at the.   
28de0 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66   ** end of the f
28df0 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ile */.    rc = 
28e00 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57 72 69  btreeMakePageWri
28e10 74 65 61 62 6c 65 28 70 42 74 2d 3e 70 50 61 67  teable(pBt->pPag
28e20 65 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  e1);.    if( rc 
28e30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
28e40 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
28e50 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
28e60 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
28e70 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
28e80 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
28e90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
28ea0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
28eb0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
28ec0 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
28ed0 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
28ee0 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
28ef0 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
28f00 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
28f10 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
28f20 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
28f30 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
28f40 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
28f50 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
28f60 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
28f70 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
28f80 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
28f90 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
28fa0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
28fb0 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
28fc0 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
28fd0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
28fe0 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
28ff0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
29000 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
29010 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
29020 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
29030 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
29040 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
29050 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
29060 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
29070 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
29080 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
29090 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
290a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
290b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
290c0 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50 61 67  c = btreeMakePag
290d0 65 57 72 69 74 65 61 62 6c 65 28 70 50 67 29 3b  eWriteable(pPg);
290e0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
290f0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
29100 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
29110 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29120 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
29130 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
29140 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
29150 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
29160 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d   pBt->nPage++; }
29170 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
29180 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20    put4byte(28 + 
29190 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  (u8*)pBt->pPage1
291a0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50  ->aData, pBt->nP
291b0 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  age);.    *pPgno
291c0 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a   = pBt->nPage;..
291d0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
291e0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
291f0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
29200 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
29210 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
29220 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20   ppPage, 1);.   
29230 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29240 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 62 74   rc;.    rc = bt
29250 72 65 65 4d 61 6b 65 50 61 67 65 57 72 69 74 65  reeMakePageWrite
29260 61 62 6c 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  able(*ppPage);. 
29270 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
29290 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
292a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  e);.    }.    TR
292b0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
292c0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
292d0 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
292e0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
292f0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
29300 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
29310 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
29320 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
29330 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
29340 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
29350 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72  vTrunk);.  if( r
29360 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29370 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
29380 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
29390 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
293a0 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  age)>1 ){.      
293b0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
293c0 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
293d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
293e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
293f0 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
29400 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
29410 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
29420 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
29430 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
29440 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
29450 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61  writeable((*ppPa
29460 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge)->pDbPage) );
29470 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29480 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
29490 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
294a0 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
294b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
294c0 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
294d0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
294e0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
294f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
29500 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
29510 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
29520 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
29530 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
29540 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
29550 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
29560 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
29570 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
29580 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
29590 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
295a0 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
295b0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
295c0 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
295d0 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
295e0 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
295f0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
29600 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
29610 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
29620 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
29630 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
29640 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
29650 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
29660 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
29670 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
29680 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
29690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
296a0 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
296b0 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
296c0 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
296d0 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
296e0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29700 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
29710 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
29720 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
29730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29740 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
29750 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
29760 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
29770 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
29780 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
29790 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
297a0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
297b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
297c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
297d0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
297e0 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
297f0 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
29800 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
29810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29820 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
29830 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
29840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29850 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
29860 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
29870 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
29880 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
29890 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
298a0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
298b0 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65  .  assert( iPage
298c0 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
298d0 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
298e0 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
298f0 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65  ge );..  if( pMe
29900 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
29910 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
29920 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
29930 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
29940 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
29950 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
29960 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
29970 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
29980 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
29990 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
299a0 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
299b0 3d 20 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57  = btreeMakePageW
299c0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 29  riteable(pPage1)
299d0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
299e0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
299f0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
29a00 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
29a10 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
29a20 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
29a30 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
29a40 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63  ..  if( pBt->sec
29a50 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ureDelete ){.   
29a60 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
29a70 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
29a80 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
29a90 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
29aa0 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
29ab0 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
29ac0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
29ad0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
29ae0 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
29af0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
29b00 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
29b10 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
29b20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
29b30 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50 61  rc = btreeMakePa
29b40 67 65 57 72 69 74 65 61 62 6c 65 28 70 50 61 67  geWriteable(pPag
29b50 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  e))!=0).    ){. 
29b60 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
29b70 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
29b80 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
29b90 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
29ba0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
29bb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
29bc0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
29bd0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
29be0 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
29bf0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
29c00 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
29c10 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
29c20 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
29c30 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
29c40 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  UM ){.    ptrmap
29c50 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
29c60 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
29c70 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
29c80 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
29c90 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
29ca0 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
29cb0 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
29cc0 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
29cd0 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
29ce0 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
29cf0 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
29d00 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
29d10 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
29d20 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
29d30 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
29d40 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
29d50 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
29d60 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
29d70 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
29d80 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
29d90 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
29da0 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
29db0 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
29dc0 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
29dd0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
29de0 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
29df0 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
29e00 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
29e10 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
29e20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
29e30 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
29e40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
29e50 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
29e60 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
29e70 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
29e80 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
29e90 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
29ea0 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
29eb0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
29ec0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
29ed0 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
29ee0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
29ef0 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
29f00 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
29f10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29f20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
29f30 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
29f40 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
29f50 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
29f60 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
29f70 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
29f80 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
29f90 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
29fa0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
29fb0 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
29fc0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
29fd0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
29fe0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
29ff0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
2a000 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
2a010 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
2a020 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
2a030 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
2a040 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
2a050 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
2a060 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
2a070 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
2a080 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
2a090 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2a0a0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2a0b0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
2a0c0 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
2a0d0 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
2a0e0 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
2a0f0 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
2a100 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
2a110 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
2a120 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
2a130 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
2a140 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
2a150 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
2a160 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
2a170 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
2a180 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
2a190 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
2a1a0 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
2a1b0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
2a1c0 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
2a1d0 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
2a1e0 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
2a1f0 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
2a200 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
2a210 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
2a220 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
2a230 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
2a240 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
2a250 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
2a260 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
2a270 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
2a280 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
2a290 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
2a2a0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
2a2b0 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
2a2c0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
2a2d0 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
2a2e0 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
2a2f0 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
2a300 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
2a310 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
2a320 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
2a330 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
2a340 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
2a350 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
2a360 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
2a370 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  4-8"..      */. 
2a380 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 4d       rc = btreeM
2a390 61 6b 65 50 61 67 65 57 72 69 74 65 61 62 6c 65  akePageWriteable
2a3a0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  (pTrunk);.      
2a3b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a3c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
2a3d0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2a3e0 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
2a3f0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
2a400 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2a410 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
2a420 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2a430 66 28 20 70 50 61 67 65 20 26 26 20 21 70 42 74  f( pPage && !pBt
2a440 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29  ->secureDelete )
2a450 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2a460 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
2a470 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2a480 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2a490 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
2a4a0 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2a4b0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
2a4c0 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
2a4d0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
2a4e0 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
2a4f0 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
2a500 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
2a510 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
2a520 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2a530 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
2a540 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
2a550 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
2a560 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
2a570 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
2a580 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
2a590 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
2a5a0 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
2a5b0 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
2a5c0 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
2a5d0 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
2a5e0 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
2a5f0 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
2a600 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
2a610 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
2a620 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
2a630 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
2a640 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
2a650 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
2a660 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
2a670 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
2a680 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2a690 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
2a6a0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  /.  if( pPage==0
2a6b0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
2a6c0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2a6d0 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
2a6e0 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  Page, 0)) ){.   
2a6f0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2a700 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 62  ut;.  }.  rc = b
2a710 74 72 65 65 4d 61 6b 65 50 61 67 65 57 72 69 74  treeMakePageWrit
2a720 65 61 62 6c 65 28 70 50 61 67 65 29 3b 0a 20 20  eable(pPage);.  
2a730 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a740 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
2a750 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
2a760 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
2a770 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
2a780 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2a790 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
2a7a0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2a7b0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2a7c0 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
2a7d0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
2a7e0 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
2a7f0 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
2a800 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
2a810 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
2a820 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
2a830 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
2a840 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2a850 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
2a860 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
2a870 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
2a880 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
2a890 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
2a8a0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
2a8b0 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
2a8c0 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
2a8d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
2a8e0 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
2a8f0 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
2a900 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
2a910 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
2a920 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
2a930 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
2a940 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
2a950 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
2a960 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
2a970 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
2a980 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2a990 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2a9a0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2a9b0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
2a9c0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
2a9d0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
2a9e0 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
2a9f0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
2aa00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2aa10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2aa20 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2aa30 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
2aa40 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
2aa50 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
2aa60 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
2aa70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2aa80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
2aa90 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
2aaa0 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
2aab0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
2aac0 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  g */.  }.  if( p
2aad0 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
2aae0 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61  low+3 > pPage->a
2aaf0 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
2ab00 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
2ab10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2ab20 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65  T;  /* Cell exte
2ab30 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
2ab40 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  page */.  }.  ov
2ab50 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
2ab60 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
2ab70 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73  verflow]);.  ass
2ab80 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
2ab90 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
2aba0 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
2abb0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
2abc0 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
2abd0 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
2abe0 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
2abf0 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
2ac00 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
2ac10 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
2ac20 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
2ac30 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
2ac40 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
2ac50 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
2ac60 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
2ac70 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
2ac80 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74  2 || ovflPgno>bt
2ac90 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
2aca0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
2acb0 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
2acc0 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
2acd0 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
2ace0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
2acf0 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
2ad00 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
2ad10 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
2ad20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
2ad30 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
2ad40 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
2ad50 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
2ad60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2ad70 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2ad80 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
2ad90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
2ada0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
2adb0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
2adc0 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
2add0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2ade0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
2adf0 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20      if( ( pOvfl 
2ae00 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72  || ((pOvfl = btr
2ae10 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
2ae20 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29  , ovflPgno))!=0)
2ae30 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74   ).     && sqlit
2ae40 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2ae50 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  unt(pOvfl->pDbPa
2ae60 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20  ge)!=1.    ){.  
2ae70 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
2ae80 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75  no reason any cu
2ae90 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65  rsor should have
2aea0 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
2aeb0 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20  reference .     
2aec0 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c   ** to an overfl
2aed0 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ow page belongin
2aee0 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74  g to a cell that
2aef0 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65   is being delete
2af00 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  d/updated..     
2af10 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20   ** So if there 
2af20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e  exists more than
2af30 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
2af40 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65  o this page, the
2af50 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  n it .      ** m
2af60 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  ust not really b
2af70 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
2af80 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ge and the datab
2af90 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
2afa0 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49  upt. .      ** I
2afb0 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20  t is helpful to 
2afc0 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f  detect this befo
2afd0 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50  re calling freeP
2afe0 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20  age2(), as .    
2aff0 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29    ** freePage2()
2b000 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61   may zero the pa
2b010 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73  ge contents if s
2b020 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
2b030 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e  e is.      ** en
2b040 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27  abled. If this '
2b050 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68  overflow' page h
2b060 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70  appens to be a p
2b070 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  age that the.   
2b080 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20     ** caller is 
2b090 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
2b0a0 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f  h or using in so
2b0b0 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68  me other way, th
2b0c0 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  is.      ** can 
2b0d0 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a  be problematic..
2b0e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2b0f0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2b100 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
2b110 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
2b120 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f  reePage2(pBt, pO
2b130 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a  vfl, ovflPgno);.
2b140 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
2b150 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
2b160 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2b170 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
2b180 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2b190 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2b1a0 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
2b1b0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
2b1c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2b1d0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
2b1e0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
2b1f0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
2b200 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
2b210 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
2b220 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
2b230 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
2b240 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
2b250 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
2b260 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
2b270 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
2b280 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
2b290 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
2b2a0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
2b2b0 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
2b2c0 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
2b2d0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
2b2e0 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
2b2f0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
2b300 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
2b310 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
2b320 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
2b330 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
2b340 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
2b350 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
2b360 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
2b370 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
2b380 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
2b390 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
2b3a0 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
2b3b0 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
2b3c0 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
2b3d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2b3e0 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
2b3f0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
2b400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2b410 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
2b420 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
2b430 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2b440 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
2b450 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
2b460 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
2b470 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2b480 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
2b490 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
2b4a0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2b4b0 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
2b4c0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
2b4d0 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4f0 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
2b500 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
2b510 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
2b520 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
2b530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b540 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
2b550 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2b560 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
2b570 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
2b580 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
2b590 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
2b5a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
2b5b0 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
2b5c0 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
2b5d0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2b5e0 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
2b5f0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
2b600 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
2b610 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2b620 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
2b630 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
2b640 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
2b650 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
2b660 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2b670 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2b680 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
2b690 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
2b6a0 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
2b6b0 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
2b6c0 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
2b6d0 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
2b6e0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
2b6f0 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
2b700 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
2b710 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
2b720 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
2b730 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
2b740 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2b750 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2b760 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2b770 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2b780 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2b790 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
2b7a0 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
2b7b0 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
2b7c0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2b7d0 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
2b7e0 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
2b7f0 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
2b800 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
2b810 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
2b820 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
2b830 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
2b840 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
2b850 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
2b860 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
2b870 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
2b880 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
2b890 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61  nKey);.  btreePa
2b8a0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
2b8b0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
2b8c0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2b8d0 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
2b8e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
2b8f0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
2b900 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2b910 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61  nData==(u32)(nDa
2b920 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a  ta+nZero) );.  .
2b930 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2b940 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
2b950 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
2b960 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
2b970 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
2b980 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
2b990 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
2b9a0 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
2b9b0 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
2b9c0 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30  if( NEVER(nKey>0
2b9d0 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65  x7fffffff || pKe
2b9e0 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72  y==0) ){.      r
2b9f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2ba00 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2ba10 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
2ba20 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
2ba30 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
2ba40 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
2ba50 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
2ba60 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
2ba70 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
2ba80 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
2ba90 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
2baa0 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
2bab0 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
2bac0 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
2bad0 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
2bae0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
2baf0 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
2bb00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2bb10 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2bb20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
2bb30 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
2bb40 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
2bb50 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
2bb60 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
2bb70 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2bb80 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
2bb90 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
2bba0 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
2bbb0 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
2bbc0 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
2bbd0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
2bbe0 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
2bbf0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2bc00 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
2bc10 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2bc20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2bc30 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2bc40 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
2bc50 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
2bc60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bc70 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2bc80 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2bc90 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
2bca0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
2bcb0 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
2bcc0 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
2bcd0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
2bce0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
2bcf0 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
2bd00 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
2bd10 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
2bd20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
2bd30 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
2bd40 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
2bd50 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
2bd60 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
2bd70 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
2bd80 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
2bd90 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
2bda0 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
2bdb0 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
2bdc0 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
2bdd0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
2bde0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
2bdf0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
2be00 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
2be10 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
2be20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
2be30 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73   the uninitialis
2be40 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
2be50 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
2be60 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
2be70 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
2be80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2be90 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2bea0 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
2beb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bec0 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
2bed0 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
2bee0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
2bef0 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
2bf00 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
2bf10 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
2bf20 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
2bf30 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
2bf40 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2bf50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
2bf60 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
2bf70 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2bf80 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2bf90 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2bfa0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
2bfb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2bfc0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2bfd0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
2bfe0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
2bff0 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
2c000 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
2c010 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
2c020 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
2c030 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
2c040 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
2c050 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
2c060 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
2c070 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
2c080 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2c090 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
2c0a0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
2c0b0 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
2c0c0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
2c0d0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
2c0e0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
2c0f0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
2c100 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
2c110 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2c120 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
2c130 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
2c140 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
2c150 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
2c160 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2c170 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2c180 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2c190 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
2c1a0 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
2c1b0 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
2c1c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2c1d0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
2c1e0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
2c1f0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
2c200 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
2c210 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
2c220 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
2c230 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
2c240 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
2c250 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
2c260 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2c270 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
2c280 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
2c290 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
2c2a0 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
2c2b0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
2c2c0 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
2c2d0 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
2c2e0 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
2c2f0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
2c300 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
2c310 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
2c320 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
2c330 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
2c340 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
2c350 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
2c360 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2c370 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
2c380 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2c390 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
2c3a0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
2c3b0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
2c3c0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
2c3d0 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
2c3e0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2c3f0 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
2c400 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
2c410 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
2c420 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
2c430 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
2c440 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2c450 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2c460 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2c470 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2c480 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
2c490 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
2c4a0 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
2c4b0 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
2c4c0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
2c4d0 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
2c4e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c4f0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
2c500 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
2c510 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
2c520 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
2c530 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
2c540 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
2c550 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
2c560 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
2c570 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
2c580 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
2c590 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
2c5a0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
2c5b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2c5c0 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
2c5d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2c5e0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
2c5f0 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
2c600 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
2c610 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
2c620 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
2c630 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
2c640 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
2c650 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
2c660 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
2c670 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2c680 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
2c690 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
2c6a0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2c6b0 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
2c6c0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
2c6d0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
2c6e0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
2c6f0 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
2c700 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2c710 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
2c720 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
2c730 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2c740 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
2c750 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  z, int *pRC){.  
2c760 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20  u32 pc;         
2c770 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
2c780 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
2c790 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
2c7a0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2c7b0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
2c7c0 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
2c7d0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
2c7e0 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
2c7f0 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
2c800 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e  ta[] */.  u8 *en
2c810 64 50 74 72 3b 20 20 20 20 20 2f 2a 20 45 6e 64  dPtr;     /* End
2c820 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
2c830 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
2c840 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
2c850 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2c860 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
2c870 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
2c880 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
2c890 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
2c8a0 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2c8b0 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2c8c0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
2c8d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2c8e0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
2c8f0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
2c900 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2c910 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2c920 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2c930 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2c940 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2c950 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2c960 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
2c970 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2c980 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
2c990 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
2c9a0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
2c9b0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
2c9c0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2c9d0 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
2c9e0 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
2c9f0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
2ca00 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
2ca10 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
2ca20 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
2ca30 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32  ( pc < (u32)get2
2ca40 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2ca50 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
2ca60 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2ca70 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
2ca80 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2ca90 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
2caa0 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
2cab0 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
2cac0 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
2cad0 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
2cae0 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
2caf0 20 20 7d 0a 20 20 65 6e 64 50 74 72 20 3d 20 26    }.  endPtr = &
2cb00 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
2cb10 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  2*pPage->nCell -
2cb20 20 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28   2];.  assert( (
2cb30 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
2cb40 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29 3b 20  T(ptr)&1)==0 ); 
2cb50 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77 61 79   /* ptr is alway
2cb60 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 2-byte aligned
2cb70 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 74 72   */.  while( ptr
2cb80 3c 65 6e 64 50 74 72 20 29 7b 0a 20 20 20 20 2a  <endPtr ){.    *
2cb90 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28 75 31  (u16*)ptr = *(u1
2cba0 36 2a 29 26 70 74 72 5b 32 5d 3b 0a 20 20 20 20  6*)&ptr[2];.    
2cbb0 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  ptr += 2;.  }.  
2cbc0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
2cbd0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2cbe0 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
2cbf0 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
2cc00 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a  >nFree += 2;.}..
2cc10 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
2cc20 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
2cc30 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
2cc40 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
2cc50 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
2cc60 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
2cc70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
2cc80 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
2cc90 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
2cca0 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
2ccb0 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
2ccc0 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
2ccd0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
2cce0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2ccf0 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
2cd00 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
2cd10 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
2cd20 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
2cd30 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
2cd40 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
2cd50 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
2cd60 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
2cd70 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
2cd80 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
2cd90 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
2cda0 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
2cdb0 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
2cdc0 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
2cdd0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
2cde0 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
2cdf0 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
2ce00 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2ce10 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
2ce20 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
2ce30 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2ce40 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
2ce50 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
2ce60 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
2ce70 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
2ce80 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
2ce90 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
2cea0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
2ceb0 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
2cec0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
2ced0 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
2cee0 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
2cef0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
2cf00 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
2cf10 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
2cf20 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
2cf30 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
2cf40 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2cf50 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
2cf60 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
2cf70 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
2cf80 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
2cf90 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
2cfa0 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
2cfb0 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
2cfc0 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
2cfd0 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2cfe0 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
2cff0 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
2d000 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
2d010 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
2d020 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
2d030 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
2d040 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
2d050 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
2d060 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
2d070 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66  hild,      /* If
2d080 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
2d090 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
2d0a0 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
2d0b0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20   */.  int *pRC  
2d0c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
2d0d0 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e  and write return
2d0e0 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20   code from here 
2d0f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20  */.){.  int idx 
2d100 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65  = 0;      /* Whe
2d110 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
2d120 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
2d130 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2d140 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
2d150 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2d160 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
2d170 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
2d180 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
2d190 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
2d1a0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2d1b0 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
2d1c0 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
2d1d0 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
2d1e0 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
2d1f0 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65  rted */.  int ce
2d200 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
2d210 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
2d220 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
2d230 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2d240 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
2d250 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
2d260 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
2d270 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
2d280 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
2d290 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
2d2a0 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
2d2b0 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65  ata[] */.  u8 *e
2d2c0 6e 64 50 74 72 3b 20 20 20 20 20 20 20 2f 2a 20  ndPtr;       /* 
2d2d0 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  End of the loop 
2d2e0 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20  */..  int nSkip 
2d2f0 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20  = (iChild ? 4 : 
2d300 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20  0);..  if( *pRC 
2d310 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
2d320 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
2d330 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
2d340 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
2d350 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d360 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
2d370 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20  (pPage->pBt) && 
2d380 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2d390 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
2d3a0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2d3b0 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
2d3c0 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  ize(pPage->aOvfl
2d3d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2d3e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2d3f0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2d400 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
2d410 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
2d420 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
2d430 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
2d440 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
2d450 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
2d460 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
2d470 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
2d480 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
2d490 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
2d4a0 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
2d4b0 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
2d4c0 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
2d4d0 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
2d4e0 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
2d4f0 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
2d500 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
2d510 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
2d520 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
2d530 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
2d540 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
2d550 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
2d560 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
2d570 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2d580 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2d590 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d   pCell) || (sz==
2d5a0 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29  8 && iChild>0) )
2d5b0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
2d5c0 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
2d5d0 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
2d5e0 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
2d5f0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2d600 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
2d610 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
2d620 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
2d630 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
2d640 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2d650 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2d660 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
2d670 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
2d680 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
2d690 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
2d6a0 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
2d6b0 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f  ge->aOvfl)/sizeo
2d6c0 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
2d6d0 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ])) );.    pPage
2d6e0 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
2d6f0 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
2d700 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
2d710 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65  x = (u16)i;.  }e
2d720 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
2d730 3d 20 62 74 72 65 65 4d 61 6b 65 50 61 67 65 57  = btreeMakePageW
2d740 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 29 3b  riteable(pPage);
2d750 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d770 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
2d780 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
2d790 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2d7a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2d7b0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2d7c0 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
2d7d0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2d7e0 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20     cellOffset = 
2d7f0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
2d800 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c  t;.    end = cel
2d810 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
2d820 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e  e->nCell;.    in
2d830 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  s = cellOffset +
2d840 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61   2*i;.    rc = a
2d850 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
2d860 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20  ge, sz, &idx);. 
2d870 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52     if( rc ){ *pR
2d880 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20  C = rc; return; 
2d890 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c  }.    /* The all
2d8a0 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75  ocateSpace() rou
2d8b0 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20  tine guarantees 
2d8c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  the following tw
2d8d0 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  o properties.   
2d8e0 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e   ** if it return
2d8f0 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20  s success */.   
2d900 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
2d910 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  end+2 );.    ass
2d920 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28  ert( idx+sz <= (
2d930 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
2d940 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2d950 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
2d960 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
2d970 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20  ee -= (u16)(2 + 
2d980 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  sz);.    memcpy(
2d990 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d  &data[idx+nSkip]
2d9a0 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
2d9b0 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66  z-nSkip);.    if
2d9c0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
2d9d0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
2d9e0 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a  [idx], iChild);.
2d9f0 20 20 20 20 7d 0a 20 20 20 20 70 74 72 20 3d 20      }.    ptr = 
2da00 26 64 61 74 61 5b 65 6e 64 5d 3b 0a 20 20 20 20  &data[end];.    
2da10 65 6e 64 50 74 72 20 3d 20 26 64 61 74 61 5b 69  endPtr = &data[i
2da20 6e 73 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ns];.    assert(
2da30 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
2da40 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29  INT(ptr)&1)==0 )
2da50 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77  ;  /* ptr is alw
2da60 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e  ays 2-byte align
2da70 65 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  ed */.    while(
2da80 20 70 74 72 3e 65 6e 64 50 74 72 20 29 7b 0a 20   ptr>endPtr ){. 
2da90 20 20 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20       *(u16*)ptr 
2daa0 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b 2d 32  = *(u16*)&ptr[-2
2dab0 5d 3b 0a 20 20 20 20 20 20 70 74 72 20 2d 3d 20  ];.      ptr -= 
2dac0 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  2;.    }.    put
2dad0 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
2dae0 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
2daf0 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
2db00 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
2db10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
2db20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2db30 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2db40 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
2db50 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2db60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
2db70 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
2db80 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
2db90 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
2dba0 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
2dbb0 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
2dbc0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
2dbd0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
2dbe0 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
2dbf0 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  /.      ptrmapPu
2dc00 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
2dc10 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20  pCell, pRC);.   
2dc20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
2dc30 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73  ./*.** Add a lis
2dc40 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20  t of cells to a 
2dc50 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
2dc60 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
2dc70 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68  lly empty..** Th
2dc80 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72  e cells are guar
2dc90 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e  anteed to fit on
2dca0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
2dcb0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62  atic void assemb
2dcc0 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  lePage(.  MemPag
2dcd0 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54  e *pPage,   /* T
2dce0 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73  he page to be as
2dcf0 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e  semblied */.  in
2dd00 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
2dd10 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
2dd20 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
2dd30 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2dd40 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
2dd50 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f    /* Pointers to
2dd60 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a   cell bodies */.
2dd70 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20    u16 *aSize    
2dd80 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
2dd90 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a  the cells */.){.
2dda0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2ddb0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2ddc0 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ter */.  u8 *pCe
2ddd0 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64  llptr;     /* Ad
2dde0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
2ddf0 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
2de00 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
2de10 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2de20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
2de30 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
2de40 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2de50 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
2de60 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61  /* Pointer to da
2de70 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a  ta for pPage */.
2de80 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
2de90 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
2dea0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  et;           /*
2deb0 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
2dec0 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  r on pPage */.  
2ded0 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c  const int nUsabl
2dee0 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
2def0 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55  usableSize; /* U
2df00 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61  sable size of pa
2df10 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
2df20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2df30 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
2df40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2df50 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2df60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2df70 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26  ert( nCell>=0 &&
2df80 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f   nCell<=(int)MX_
2df90 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2dfa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
2dfb0 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61  (int)MX_CELL(pPa
2dfc0 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29  ge->pBt)<=10921)
2dfd0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2dfe0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2dff0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2e000 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ge) );..  /* Che
2e010 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
2e020 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a   has just been z
2e030 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67  eroed by zeroPag
2e040 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e() */.  assert(
2e050 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
2e060 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65   );.  assert( ge
2e070 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
2e080 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73  ata[hdr+5])==nUs
2e090 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c  able );..  pCell
2e0a0 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43  ptr = &pPage->aC
2e0b0 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b  ellIdx[nCell*2];
2e0c0 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55  .  cellbody = nU
2e0d0 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e  sable;.  for(i=n
2e0e0 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Cell-1; i>=0; i-
2e0f0 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 20 3d  -){.    u16 sz =
2e100 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70   aSize[i];.    p
2e110 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20  Cellptr -= 2;.  
2e120 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a    cellbody -= sz
2e130 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
2e140 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64  Cellptr, cellbod
2e150 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  y);.    memcpy(&
2e160 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20  data[cellbody], 
2e170 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a  apCell[i], sz);.
2e180 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26    }.  put2byte(&
2e190 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
2e1a0 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
2e1b0 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65  &data[hdr+5], ce
2e1c0 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
2e1d0 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c  ->nFree -= (nCel
2e1e0 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20  l*2 + nUsable - 
2e1f0 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
2e200 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36  ge->nCell = (u16
2e210 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nCell;.}../*.**
2e220 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
2e230 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
2e240 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
2e250 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
2e260 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
2e270 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
2e280 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
2e290 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
2e2a0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
2e2b0 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
2e2c0 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
2e2d0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
2e2e0 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
2e2f0 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
2e300 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
2e310 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
2e320 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
2e330 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
2e340 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
2e350 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
2e360 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
2e370 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
2e380 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
2e390 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
2e3a0 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
2e3b0 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
2e3c0 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
2e3d0 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
2e3e0 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
2e3f0 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
2e400 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
2e410 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
2e420 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
2e430 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
2e440 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
2e450 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
2e460 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
2e470 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
2e480 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
2e490 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e4a0 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
2e4b0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
2e4c0 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
2e4d0 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
2e4e0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
2e4f0 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
2e500 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a  he balance */...
2e510 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e520 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
2e530 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
2e540 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
2e550 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
2e560 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
2e570 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
2e580 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
2e590 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
2e5a0 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
2e5b0 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
2e5c0 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
2e5d0 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
2e5e0 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
2e5f0 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
2e600 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
2e610 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
2e620 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c  of trying to bal
2e630 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
2e640 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
2e650 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
2e660 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
2e670 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
2e680 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
2e690 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
2e6a0 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
2e6b0 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
2e6c0 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
2e6d0 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
2e6e0 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
2e6f0 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
2e700 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
2e710 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
2e720 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
2e730 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
2e740 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
2e750 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
2e760 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
2e770 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
2e780 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
2e790 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
2e7a0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
2e7b0 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
2e7c0 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
2e7d0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
2e7e0 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
2e7f0 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
2e800 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
2e810 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
2e820 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
2e830 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  he page..**.** T
2e840 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
2e850 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
2e860 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f  e a temporary co
2e870 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  py of the divide
2e880 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77  r.** cell that w
2e890 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2e8a0 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75  into pParent. Su
2e8b0 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  ch a cell consis
2e8c0 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74  ts of a 4.** byt
2e8d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
2e8e0 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69  llowed by a vari
2e8f0 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
2e900 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a  ger. In other.**
2e910 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20   words, at most 
2e920 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20  13 bytes. Hence 
2e930 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
2e940 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20  r must be at.** 
2e950 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69  least 13 bytes i
2e960 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
2e970 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
2e980 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ick(MemPage *pPa
2e990 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  rent, MemPage *p
2e9a0 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65  Page, u8 *pSpace
2e9b0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63  ){.  BtShared *c
2e9c0 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65  onst pBt = pPage
2e9d0 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54  ->pBt;    /* B-T
2e9e0 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a  ree Database */.
2e9f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
2ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea10 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
2ea20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
2ea30 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2ea60 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn Code */.  Pgn
2ea70 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20  o pgnoNew;      
2ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea90 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2eaa0 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61   of pNew */..  a
2eab0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2eac0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2ead0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2eae0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2eaf0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2eb00 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
2eb10 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
2eb20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2eb30 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  w==1 );..  /* Th
2eb40 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  is error conditi
2eb50 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  on is now caught
2eb60 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
2eb70 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
2eb80 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
2eb90 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75  >nCell<=0 ) retu
2eba0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2ebb0 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c  T_BKPT;..  /* Al
2ebc0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
2ebd0 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c  e. This page wil
2ebe0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67  l become the rig
2ebf0 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20  ht-sibling of . 
2ec00 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20   ** pPage. Make 
2ec10 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2ec20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61  writable, so tha
2ec30 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
2ec40 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20  r cell.  ** may 
2ec50 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20  be inserted. If 
2ec60 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61  both these opera
2ec70 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73  tions are succes
2ec80 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20  sful, proceed.. 
2ec90 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
2eca0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2ecb0 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
2ecc0 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28  w, 0, 0);..  if(
2ecd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ece0 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20  {..    u8 *pOut 
2ecf0 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20  = &pSpace[4];.  
2ed00 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50    u8 *pCell = pP
2ed10 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43  age->aOvfl[0].pC
2ed20 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43  ell;.    u16 szC
2ed30 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
2ed40 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
2ed50 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a  .    u8 *pStop;.
2ed60 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2ed70 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2ed80 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  able(pNew->pDbPa
2ed90 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge) );.    asser
2eda0 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  t( pPage->aData[
2edb0 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c  0]==(PTF_INTKEY|
2edc0 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
2edd0 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65  _LEAF) );.    ze
2ede0 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46  roPage(pNew, PTF
2edf0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
2ee00 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a  DATA|PTF_LEAF);.
2ee10 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
2ee20 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
2ee30 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20  , &szCell);..   
2ee40 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2ee50 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
2ee60 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
2ee70 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
2ee80 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
2ee90 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
2eea0 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
2eeb0 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
2eec0 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
2eed0 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
2eee0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65  rflow page. If e
2eef0 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20  ither of these. 
2ef00 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73     ** operations
2ef10 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75   fails, the retu
2ef20 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20  rn code is set, 
2ef30 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  but the contents
2ef40 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
2ef50 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73  arent page are s
2ef60 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64  till manipulated
2ef70 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c   by thh code bel
2ef80 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  ow..    ** That 
2ef90 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70  is Ok, at this p
2efa0 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20  oint the parent 
2efb0 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65  page is guarante
2efc0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
2efd0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2efe0 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
2eff0 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61  ror code will ca
2f000 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c  use a.    ** rol
2f010 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61  lback, undoing a
2f020 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
2f030 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
2f040 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
2f050 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2f060 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
2f070 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
2f080 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2f090 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72  Parent->pgno, &r
2f0a0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  c);.      if( sz
2f0b0 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  Cell>pNew->minLo
2f0c0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  cal ){.        p
2f0d0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
2f0e0 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63  pNew, pCell, &rc
2f0f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2f100 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
2f110 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
2f120 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
2f130 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
2f140 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
2f150 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
2f160 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
2f170 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
2f180 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
2f190 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
2f1a0 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
2f1b0 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
2f1c0 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
2f1d0 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
2f1e0 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
2f1f0 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
2f200 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
2f210 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
2f220 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
2f230 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
2f240 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
2f250 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
2f260 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
2f270 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
2f280 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
2f290 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
2f2a0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
2f2b0 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
2f2c0 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
2f2d0 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
2f2e0 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
2f2f0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2f300 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
2f310 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
2f320 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
2f330 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
2f340 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
2f350 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
2f360 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
2f370 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
2f380 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
2f390 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
2f3a0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
2f3b0 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
2f3c0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
2f3d0 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
2f3e0 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
2f3f0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2f400 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
2f410 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
2f420 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
2f430 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
2f440 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
2f450 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
2f460 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
2f470 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
2f480 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
2f490 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
2f4a0 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
2f4b0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
2f4c0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
2f4d0 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
2f4e0 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
2f4f0 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e  arent, pParent->
2f500 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28  nCell, pSpace, (
2f510 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65  int)(pOut-pSpace
2f520 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2f530 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f    0, pPage->pgno
2f540 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20  , &rc);..    /* 
2f550 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  Set the right-ch
2f560 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70  ild pointer of p
2f570 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20  Parent to point 
2f580 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
2f590 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
2f5a0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2f5b0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2f5c0 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
2f5d0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
2f5e0 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
2f5f0 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
2f600 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
2f610 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
2f620 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2f630 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2f640 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
2f650 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a  NCE */..#if 0./*
2f660 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2f670 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  n does not contr
2f680 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74  ibute anything t
2f690 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
2f6a0 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74  of SQLite..** it
2f6b0 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63   is sometimes ac
2f6c0 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72  tivated temporar
2f6d0 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67  ily while debugg
2f6e0 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73  ing code respons
2f6f0 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74  ible .** for set
2f700 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70  ting pointer-map
2f710 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
2f720 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68  tic int ptrmapCh
2f730 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65  eckPages(MemPage
2f740 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e   **apPage, int n
2f750 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Page){.  int i, 
2f760 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  j;.  for(i=0; i<
2f770 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
2f780 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20   Pgno n;.    u8 
2f790 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
2f7a0 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69  pPage = apPage[i
2f7b0 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ];.    BtShared 
2f7c0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2f7d0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
2f7e0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2f7f0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
2f800 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b  pPage->nCell; j+
2f810 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e  +){.      CellIn
2f820 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75  fo info;.      u
2f830 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20  8 *z;.     .    
2f840 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70    z = findCell(p
2f850 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Page, j);.      
2f860 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
2f870 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66  r(pPage, z, &inf
2f880 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  o);.      if( in
2f890 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
2f8a0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66          Pgno ovf
2f8b0 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b  l = get4byte(&z[
2f8c0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
2f8d0 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
2f8e0 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  Get(pBt, ovfl, &
2f8f0 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
2f900 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
2f910 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
2f920 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b  MAP_OVERFLOW1 );
2f930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f940 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2f950 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
2f960 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
2f970 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  (z);.        ptr
2f980 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
2f990 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
2f9a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
2f9b0 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
2f9c0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
2f9d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f9e0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2f9f0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
2fa00 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
2fa10 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2fa20 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2fa30 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72  t+8]);.      ptr
2fa40 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
2fa50 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
2fa60 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
2fa70 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
2fa80 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
2fa90 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2faa0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
2fab0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2fac0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  on is used to co
2fad0 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
2fae0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
2faf0 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e  de stored .** on
2fb00 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
2fb10 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65  age pTo. If page
2fb20 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61   pFrom was not a
2fb30 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e   leaf page, then
2fb40 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
2fb50 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
2fb60 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20  each child page 
2fb70 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74  are updated so t
2fb80 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e  hat the.** paren
2fb90 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e  t page stored in
2fba0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2fbb0 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66   is page pTo. If
2fbc0 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64   pFrom contained
2fbd0 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69  .** any cells wi
2fbe0 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  th overflow page
2fbf0 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20   pointers, then 
2fc00 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2fc10 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  g pointer.** map
2fc20 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73   entries are als
2fc30 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  o updated so tha
2fc40 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
2fc50 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a  e is page pTo..*
2fc60 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73  *.** If pFrom is
2fc70 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79   currently carry
2fc80 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ing any overflow
2fc90 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20   cells (entries 
2fca0 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67  in the.** MemPag
2fcb0 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29  e.aOvfl[] array)
2fcc0 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63  , they are not c
2fcd0 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a  opied to pTo. .*
2fce0 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
2fcf0 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20  rning, page pTo 
2fd00 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  is reinitialized
2fd10 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74   using btreeInit
2fd20 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Page()..**.** Th
2fd30 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66  e performance of
2fd40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2fd50 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20  s not critical. 
2fd60 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  It is only used 
2fd70 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e  by .** the balan
2fd80 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61  ce_shallower() a
2fd90 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nd balance_deepe
2fda0 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20  r() procedures, 
2fdb0 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68  neither of.** wh
2fdc0 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f  ich are called o
2fdd0 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61  ften under norma
2fde0 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e  l circumstances.
2fdf0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2fe00 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
2fe10 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20  MemPage *pFrom, 
2fe20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e  MemPage *pTo, in
2fe30 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
2fe40 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
2fe50 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
2fe60 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70   * const pBt = p
2fe70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75  From->pBt;.    u
2fe80 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20  8 * const aFrom 
2fe90 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a  = pFrom->aData;.
2fea0 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61      u8 * const a
2feb0 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b  To = pTo->aData;
2fec0 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  .    int const i
2fed0 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d  FromHdr = pFrom-
2fee0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
2fef0 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72  int const iToHdr
2ff00 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d   = ((pTo->pgno==
2ff10 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20  1) ? 100 : 0);. 
2ff20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
2ff30 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a  nt iData;.  .  .
2ff40 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
2ff50 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  m->isInit );.   
2ff60 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2ff70 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b  nFree>=iToHdr );
2ff80 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
2ff90 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
2ffa0 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e  omHdr+5]) <= (in
2ffb0 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
2ffc0 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43  e );.  .    /* C
2ffd0 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e  opy the b-tree n
2ffe0 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ode content from
2fff0 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
30000 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20  age pTo. */.    
30010 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74 65  iData = get2byte
30020 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72  (&aFrom[iFromHdr
30030 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +5]);.    memcpy
30040 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61  (&aTo[iData], &a
30050 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74  From[iData], pBt
30060 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61  ->usableSize-iDa
30070 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ta);.    memcpy(
30080 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61  &aTo[iToHdr], &a
30090 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20  From[iFromHdr], 
300a0 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65  pFrom->cellOffse
300b0 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65  t + 2*pFrom->nCe
300c0 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ll);.  .    /* R
300d0 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
300e0 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65   pTo so that the
300f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
30100 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
30110 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20  re.    ** match 
30120 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68  the new data. Th
30130 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
30140 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75   of pTo can actu
30150 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0a  ally fail under.
30160 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62      ** fairly ob
30170 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e  scure circumstan
30180 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  ces, even though
30190 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66   it is a copy of
301a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   initialized .  
301b0 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e    ** page pFrom.
301c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d  .    */.    pTo-
301d0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
301e0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
301f0 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69 66  age(pTo);.    if
30200 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30210 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
30220 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
30230 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
30240 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
30250 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
30260 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
30270 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
30280 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ries.    ** for 
30290 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76  any b-tree or ov
302a0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
302b0 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69  t pTo now contai
302c0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ns the pointers 
302d0 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  to..    */.    i
302e0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
302f0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
30300 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
30310 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pTo);.    }.  }.
30320 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
30330 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
30340 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  tes cells on the
30350 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63   iParentIdx'th c
30360 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a  hild of pParent.
30370 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74  ** (hereafter "t
30380 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70  he page") and up
30390 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73   to 2 siblings s
303a0 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
303b0 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a   have about the.
303c0 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  ** same amount o
303d0 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73  f free space. Us
303e0 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73  ually a single s
303f0 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72  ibling on either
30400 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20   side of the.** 
30410 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e  page are used in
30420 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20   the balancing, 
30430 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c  though both sibl
30440 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
30450 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65  from one.** side
30460 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
30470 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73  the first or las
30480 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
30490 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61  arent. If the pa
304a0 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72  ge .** has fewer
304b0 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73   than 2 siblings
304c0 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
304d0 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
304e0 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a  n if the page.**
304f0 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20   is a root page 
30500 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20  or a child of a 
30510 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20  root page) then 
30520 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
30530 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63  blings.** partic
30540 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
30550 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ancing..**.** Th
30560 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  e number of sibl
30570 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
30580 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
30590 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
305a0 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74   by .** one or t
305b0 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
305c0 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
305d0 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
305e0 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a  t over full. .**
305f0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
30600 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
30610 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
30620 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
30630 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  the page.** migh
30640 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
30650 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50  e stored in MemP
30660 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69  age.aData[]. Thi
30670 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
30680 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
30690 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f  verfull. This ro
306a0 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
306b0 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c  at all cells all
306c0 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  ocated.** to the
306d0 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
306e0 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20  blings fit into 
306f0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20  MemPage.aData[] 
30700 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
30710 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
30720 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
30730 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  ng the page and 
30740 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65  its siblings, ce
30750 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e  lls may be.** in
30760 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72  serted into or r
30770 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
30780 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  parent page (pPa
30790 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a  rent). Doing so.
307a0 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ** may cause the
307b0 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20   parent page to 
307c0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
307d0 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66  or underfull. If
307e0 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73   this.** happens
307f0 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
30800 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
30810 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f  e caller to invo
30820 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  ke the correct.*
30830 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  * balancing rout
30840 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20  ine to fix this 
30850 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65  problem (see the
30860 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69   balance() routi
30870 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ne). .**.** If t
30880 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
30890 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
308a0 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
308b0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
308c0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
308d0 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69  state. So if thi
308e0 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
308f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
30900 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
30910 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
30920 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
30930 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
30940 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69  n, aOvflSpace, i
30950 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
30960 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20 65  .** buffer big e
30970 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e  nough to hold on
30980 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65  e page. If while
30990 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73   inserting cells
309a0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
309b0 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e  .** page (pParen
309c0 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  t) the parent pa
309d0 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
309e0 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72  ull, this buffer
309f0 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73   is.** used to s
30a00 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 27  tore the parent'
30a10 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  s overflow cells
30a20 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66  . Because this f
30a30 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a  unction inserts.
30a40 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  ** a maximum of 
30a50 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c  four divider cel
30a60 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
30a70 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65  nt page, and the
30a80 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65   maximum.** size
30a90 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65   of a cell store
30aa0 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65  d within an inte
30ab0 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77  rnal node is alw
30ac0 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f  ays less than 1/
30ad0 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  4.** of the page
30ae0 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c  -size, the aOvfl
30af0 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69  Space[] buffer i
30b00 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
30b10 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
30b20 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66  gh for all overf
30b30 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  low cells..**.**
30b40 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69   If aOvflSpace i
30b50 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20  s set to a null 
30b60 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
30b70 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
30b80 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
30b90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
30ba0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a  alance_nonroot(.
30bb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
30bc0 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
30bd0 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
30be0 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69   of siblings bei
30bf0 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
30c00 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c   int iParentIdx,
30c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68   /* Index of "th
30c30 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65  e page" in pPare
30c40 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66  nt */.  u8 *aOvf
30c50 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  lSpace,         
30c60 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d          /* page-
30c70 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  size bytes of sp
30c80 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f  ace for parent o
30c90 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  vfl */.  int isR
30ca0 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  oot             
30cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
30cc0 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61   if pParent is a
30cd0 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b   root-page */.){
30ce0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
30cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30d00 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
30d10 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
30d20 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
30d30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
30d40 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
30d50 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
30d60 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
30d70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
30d80 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
30d90 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
30da0 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  rom. */.  int nN
30db0 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
30dc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30dd0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
30de0 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ew[] */.  int nO
30df0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
30e00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30e10 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
30e20 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ld[] */.  int i,
30e30 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
30e40 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
30e50 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
30e60 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
30e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
30e80 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
30e90 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
30ea0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  [] */.  int rc =
30eb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
30ec0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
30ed0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  rn code */.  u16
30ee0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
30ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
30f00 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
30f10 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
30f20 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
30f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30f40 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
30f50 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
30f60 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
30f70 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
30f80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
30f90 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
30fa0 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
30fb0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
30fc0 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
30fd0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
30fe0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
30ff0 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
31000 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
31010 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
31020 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
31030 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
31040 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
31050 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
31060 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
31070 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
31080 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53   */.  int iOvflS
31090 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pace = 0;       
310a0 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
310b0 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c  ed byte of aOvfl
310c0 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Space[] */.  int
310d0 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20   szScratch;     
310e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
310f0 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d  e of scratch mem
31100 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f  ory requested */
31110 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c  .  MemPage *apOl
31120 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
31130 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
31140 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20  to two siblings 
31150 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
31160 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
31170 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
31180 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
31190 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
311a0 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
311b0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
311c0 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
311d0 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
311e0 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70  ncing */.  u8 *p
311f0 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  Right;          
31200 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
31210 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66  ion in parent of
31220 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70   right-sibling p
31230 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
31240 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20  apDiv[NB-1];    
31250 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
31260 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
31270 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
31280 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
31290 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
312a0 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
312b0 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
312c0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
312d0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
312e0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
312f0 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
31300 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
31310 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
31320 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
31330 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
31340 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
31350 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
31360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31370 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
31380 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
31390 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
313a0 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
313b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
313c0 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
313d0 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
313e0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
313f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31400 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74     /* Temp var t
31410 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e  o store a page n
31420 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70  umber in */..  p
31430 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42  Bt = pParent->pB
31440 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
31450 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
31460 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
31470 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31480 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
31490 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
314a0 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54  e) );..#if 0.  T
314b0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
314c0 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68  begin page %d ch
314d0 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  ild of %d\n", pP
314e0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65  age->pgno, pPare
314f0 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64  nt->pgno));.#end
31500 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  if..  /* At this
31510 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d   point pParent m
31520 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  ay have at most 
31530 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  one overflow cel
31540 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74  l. And if.  ** t
31550 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  his overflow cel
31560 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74  l is present, it
31570 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c   must be the cel
31580 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64  l with .  ** ind
31590 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54  ex iParentIdx. T
315a0 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d  his scenario com
315b0 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68  es about when th
315c0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
315d0 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69   is called (indi
315e0 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c  rectly) from sql
315f0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
31600 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
31610 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  ( pParent->nOver
31620 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65  flow==0 || pPare
31630 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  nt->nOverflow==1
31640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
31650 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
31660 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
31670 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50  aOvfl[0].idx==iP
31680 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69  arentIdx );..  i
31690 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29  f( !aOvflSpace )
316a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
316b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
316c0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69    /* Find the si
316d0 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62  bling pages to b
316e0 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63  alance. Also loc
316f0 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  ate the cells in
31700 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74   pParent .  ** t
31710 68 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73  hat divide the s
31720 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65  iblings. An atte
31730 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
31740 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
31750 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  on .  ** either 
31760 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d  side of pPage. M
31770 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
31780 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
31790 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a  side, however, .
317a0 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72    ** if there ar
317b0 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20  e fewer than NN 
317c0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20  siblings on the 
317d0 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70  other side. If p
317e0 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20  Parent.  ** has 
317f0 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c  NB or fewer chil
31800 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68  dren then all ch
31810 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e  ildren of pParen
31820 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20  t are taken.  . 
31830 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
31840 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68  op also drops th
31850 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  e divider cells 
31860 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
31870 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  page. This.  ** 
31880 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64  way, the remaind
31890 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  er of the functi
318a0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  on does not have
318b0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e   to deal with an
318c0 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  y.  ** overflow 
318d0 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72  cells in the par
318e0 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20  ent page, since 
318f0 69 66 20 61 6e 79 20 65 78 69 73 74 65 64 20 74  if any existed t
31900 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61  hey will.  ** ha
31910 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
31920 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20  removed..  */.  
31930 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  i = pParent->nOv
31940 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74  erflow + pParent
31950 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69  ->nCell;.  if( i
31960 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <2 ){.    nxDiv 
31970 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20  = 0;.    nOld = 
31980 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  i+1;.  }else{.  
31990 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20    nOld = 3;.    
319a0 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
319b0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
319c0 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69       .      nxDi
319d0 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  v = 0;.    }else
319e0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
319f0 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69  =i ){.      nxDi
31a00 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c  v = i-2;.    }el
31a10 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20  se{.      nxDiv 
31a20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a  = iParentIdx-1;.
31a30 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b      }.    i = 2;
31a40 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78  .  }.  if( (i+nx
31a50 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
31a60 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74  erflow)==pParent
31a70 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
31a80 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74  Right = &pParent
31a90 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
31aa0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20  >hdrOffset+8];. 
31ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67   }else{.    pRig
31ac0 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ht = findCell(pP
31ad0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
31ae0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
31af0 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d  w);.  }.  pgno =
31b00 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74   get4byte(pRight
31b10 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
31b20 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
31b30 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
31b40 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a  no, &apOld[i]);.
31b50 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
31b60 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
31b70 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
31b80 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
31b90 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
31ba0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
31bb0 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
31bc0 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
31bd0 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
31be0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
31bf0 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b  (i--)==0 ) break
31c00 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44  ;..    if( i+nxD
31c10 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f 76  iv==pParent->aOv
31c20 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70 50 61  fl[0].idx && pPa
31c30 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
31c40 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  ){.      apDiv[i
31c50 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76  ] = pParent->aOv
31c60 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20  fl[0].pCell;.   
31c70 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
31c80 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  te(apDiv[i]);.  
31c90 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63      szNew[i] = c
31ca0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
31cb0 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20  nt, apDiv[i]);. 
31cc0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f       pParent->nO
31cd0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
31ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70   }else{.      ap
31cf0 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  Div[i] = findCel
31d00 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
31d10 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
31d20 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67  rflow);.      pg
31d30 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  no = get4byte(ap
31d40 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  Div[i]);.      s
31d50 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  zNew[i] = cellSi
31d60 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
31d70 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20  pDiv[i]);..     
31d80 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c   /* Drop the cel
31d90 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  l from the paren
31da0 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d  t page. apDiv[i]
31db0 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   still points to
31dc0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65  .      ** the ce
31dd0 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  ll within the pa
31de0 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  rent, even thoug
31df0 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 72  h it has been dr
31e00 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  opped..      ** 
31e10 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63  This is safe bec
31e20 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20  ause dropping a 
31e30 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72  cell only overwr
31e40 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a 20  ites the first. 
31e50 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74       ** four byt
31e60 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68  es of it, and th
31e70 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
31e80 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69   not need the fi
31e90 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75  rst.      ** fou
31ea0 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 64  r bytes of the d
31eb0 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20  ivider cell. So 
31ec0 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73  the pointer is s
31ed0 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20  afe to use.     
31ee0 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a   ** later on.  .
31ef0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
31f00 2a 20 42 75 74 20 6e 6f 74 20 69 66 20 77 65 20  * But not if we 
31f10 61 72 65 20 69 6e 20 73 65 63 75 72 65 2d 64 65  are in secure-de
31f20 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 73 65  lete mode. In se
31f30 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
31f40 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  ,.      ** the d
31f50 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e  ropCell() routin
31f60 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  e will overwrite
31f70 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
31f80 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20   with zeroes..  
31f90 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
31fa0 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79  ase, temporarily
31fb0 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69   copy the cell i
31fc0 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61  nto the aOvflSpa
31fd0 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75  ce[].      ** bu
31fe0 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65  ffer. It will be
31ff0 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69   copied out agai
32000 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  n as soon as the
32010 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72   aSpace[] buffer
32020 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c  .      ** is all
32030 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  ocated.  */.    
32040 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72    if( pBt->secur
32050 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  eDelete ){.     
32060 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20     int iOff;..  
32070 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53 51 4c        iOff = SQL
32080 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61  ITE_PTR_TO_INT(a
32090 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54  pDiv[i]) - SQLIT
320a0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61  E_PTR_TO_INT(pPa
320b0 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20  rent->aData);.  
320c0 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b        if( (iOff+
320d0 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70  szNew[i])>(int)p
320e0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
320f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
32100 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
32110 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
32120 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
32130 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65   (i+1)*sizeof(Me
32140 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
32150 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
32160 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
32170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32180 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c     memcpy(&aOvfl
32190 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44  Space[iOff], apD
321a0 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29  iv[i], szNew[i])
321b0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 44 69  ;.          apDi
321c0 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61  v[i] = &aOvflSpa
321d0 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72  ce[apDiv[i]-pPar
321e0 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20  ent->aData];.   
321f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32200 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
32210 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
32220 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
32230 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63  w, szNew[i], &rc
32240 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
32250 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c  /* Make nMaxCell
32260 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  s a multiple of 
32270 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  4 in order to pr
32280 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20  eserve 8-byte.  
32290 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a  ** alignment */.
322a0 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e    nMaxCells = (n
322b0 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33  MaxCells + 3)&~3
322c0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
322d0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
322e0 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
322f0 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74  s.  */.  k = pBt
32300 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55  ->pageSize + ROU
32310 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
32320 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63  ge));.  szScratc
32330 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43  h =.       nMaxC
32340 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29  ells*sizeof(u8*)
32350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32360 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c         /* apCell
32370 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43   */.     + nMaxC
32380 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29  ells*sizeof(u16)
32390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323a0 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c         /* szCell
323b0 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e   */.     + pBt->
323c0 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20  pageSize        
323d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323e0 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65         /* aSpace
323f0 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f  1 */.     + k*nO
32400 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
32410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32420 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
32430 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29 20  copies (apCopy) 
32440 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  */.  apCell = sq
32450 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c  lite3ScratchMall
32460 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b  oc( szScratch );
32470 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d   .  if( apCell==
32480 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
32490 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
324a0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
324b0 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65  anup;.  }.  szCe
324c0 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65  ll = (u16*)&apCe
324d0 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
324e0 20 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29   aSpace1 = (u8*)
324f0 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &szCell[nMaxCell
32500 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  s];.  assert( EI
32510 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
32520 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a  NT(aSpace1) );..
32530 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70    /*.  ** Load p
32540 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63  ointers to all c
32550 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20  ells on sibling 
32560 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69  pages and the di
32570 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
32580 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
32590 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20  apCell[] array. 
325a0 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
325b0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
325c0 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63  s.  ** into spac
325d0 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
325e0 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65  aSpace1[] and re
325f0 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69 76  move the the div
32600 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20  ider Cells.  ** 
32610 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20  from pParent..  
32620 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  **.  ** If the s
32630 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c  iblings are on l
32640 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20  eaf pages, then 
32650 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  the child pointe
32660 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64  rs of the.  ** d
32670 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65  ivider cells are
32680 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74   stripped from t
32690 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  he cells before 
326a0 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a  they are copied.
326b0 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65    ** into aSpace
326c0 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61  1[].  In this wa
326d0 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
326e0 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74  apCell[] are wit
326f0 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20  hout.  ** child 
32700 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69  pointers.  If si
32710 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
32720 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20  eaves, then all 
32730 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43  cell in.  ** apC
32740 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68  ell[] include ch
32750 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45  ild pointers.  E
32760 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63  ither way, all c
32770 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
32780 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e  .  ** are alike.
32790 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43  .  **.  ** leafC
327a0 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66  orrection:  4 if
327b0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
327c0 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73  .  0 if pPage is
327d0 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a   not a leaf..  *
327e0 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61  *       leafData
327f0 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f  :  1 if pPage ho
32800 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64  lds key+data and
32810 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f   pParent holds o
32820 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20  nly keys..  */. 
32830 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20   leafCorrection 
32840 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66  = apOld[0]->leaf
32850 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
32860 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61   apOld[0]->hasDa
32870 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ta;.  for(i=0; i
32880 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
32890 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20   int limit;.    
328a0 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  .    /* Before d
328b0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
328c0 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20  se, take a copy 
328d0 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69 67  of the i'th orig
328e0 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20  inal sibling.   
328f0 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
32900 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
32910 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
32920 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
32930 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  er.    ** that t
32940 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
32950 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
32960 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
32970 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  be in the.    **
32980 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
32990 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  g overwritten.  
329a0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
329b0 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d  pOld = apCopy[i]
329c0 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53   = (MemPage*)&aS
329d0 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53  pace1[pBt->pageS
329e0 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20  ize + k*i];.    
329f0 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f  memcpy(pOld, apO
32a00 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65  ld[i], sizeof(Me
32a10 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c  mPage));.    pOl
32a20 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64  d->aData = (void
32a30 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20  *)&pOld[1];.    
32a40 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61  memcpy(pOld->aDa
32a50 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44  ta, apOld[i]->aD
32a60 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  ata, pBt->pageSi
32a70 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20  ze);..    limit 
32a80 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f  = pOld->nCell+pO
32a90 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
32aa0 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76     if( pOld->nOv
32ab0 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
32ac0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
32ad0 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
32ae0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
32af0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
32b00 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
32b10 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
32b20 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
32b30 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
32b40 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
32b50 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
32b60 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
32b70 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
32b80 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
32b90 20 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20      u8 *aData = 
32ba0 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20  pOld->aData;.   
32bb0 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20     u16 maskPage 
32bc0 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65  = pOld->maskPage
32bd0 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c  ;.      u16 cell
32be0 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63  Offset = pOld->c
32bf0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ellOffset;.     
32c00 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
32c10 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
32c20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
32c30 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
32c40 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
32c50 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28 61  ] = findCellv2(a
32c60 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20  Data, maskPage, 
32c70 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a  cellOffset, j);.
32c80 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
32c90 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
32ca0 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
32cb0 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
32cc0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
32cd0 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20 0a   }.    }       .
32ce0 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
32cf0 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a   && !leafData){.
32d00 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28        u16 sz = (
32d10 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20  u16)szNew[i];.  
32d20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
32d30 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
32d40 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
32d50 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
32d60 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
32d70 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31  pTemp = &aSpace1
32d80 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20  [iSpace1];.     
32d90 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a   iSpace1 += sz;.
32da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
32db0 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  <=pBt->maxLocal+
32dc0 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  23 );.      asse
32dd0 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28  rt( iSpace1 <= (
32de0 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  int)pBt->pageSiz
32df0 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e );.      memcp
32e00 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
32e10 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70  ], sz);.      ap
32e20 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54  Cell[nCell] = pT
32e30 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69  emp+leafCorrecti
32e40 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  on;.      assert
32e50 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
32e60 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65  ==0 || leafCorre
32e70 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
32e80 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
32e90 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  = szCell[nCell] 
32ea0 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  - leafCorrection
32eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c  ;.      if( !pOl
32ec0 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  d->leaf ){.     
32ed0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
32ee0 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a  orrection==0 );.
32ef0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32f00 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d  pOld->hdrOffset=
32f10 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 );.        /*
32f20 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
32f30 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
32f40 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
32f50 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
32f60 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66     ** pointer of
32f70 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
32f80 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  l */.        mem
32f90 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  cpy(apCell[nCell
32fa0 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b  ], &pOld->aData[
32fb0 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65  8], 4);.      }e
32fc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
32fd0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
32fe0 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
32ff0 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
33000 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
33010 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
33020 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61  ow any cells sma
33030 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65  ller than 4 byte
33040 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
33050 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
33060 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
33070 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c     }.      nCell
33080 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
33090 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20   /*.  ** Figure 
330a0 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  out the number o
330b0 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74  f pages needed t
330c0 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c  o hold all nCell
330d0 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f   cells..  ** Sto
330e0 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69  re this number i
330f0 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d  n "k".  Also com
33100 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69  pute szNew[] whi
33110 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a  ch is the total.
33120 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c    ** size of all
33130 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d   cells on the i-
33140 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e  th page and cntN
33150 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
33160 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20  e index.  ** in 
33170 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20  apCell[] of the 
33180 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65  cell that divide
33190 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61  s page i from pa
331a0 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63  ge i+1.  .  ** c
331b0 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20  ntNew[k] should 
331c0 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a  equal nCell..  *
331d0 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f  *.  ** Values co
331e0 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62  mputed by this b
331f0 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lock:.  **.  ** 
33200 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65            k: The
33210 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
33220 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20   sibling pages. 
33230 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a   **    szNew[i]:
33240 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20   Spaced used on 
33250 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
33260 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e   page..  **   cn
33270 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69  tNew[i]: Index i
33280 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73  n apCell[] and s
33290 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20  zCell[] for the 
332a0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20  first cell to.  
332b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
332c0 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
332d0 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
332e0 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53  ge..  ** usableS
332f0 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20  pace: Number of 
33300 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
33310 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68  vailable on each
33320 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a   sibling..  ** .
33330 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61    */.  usableSpa
33340 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ce = pBt->usable
33350 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66  Size - 12 + leaf
33360 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f  Correction;.  fo
33370 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30  r(subtotal=k=i=0
33380 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
33390 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
333a0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
333b0 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65  subtotal += szCe
333c0 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69  ll[i] + 2;.    i
333d0 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73  f( subtotal > us
333e0 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20  ableSpace ){.   
333f0 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75     szNew[k] = su
33400 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b  btotal - szCell[
33410 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77  i];.      cntNew
33420 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69  [k] = i;.      i
33430 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69  f( leafData ){ i
33440 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74  --; }.      subt
33450 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
33460 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  k++;.      if( k
33470 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51  >NB+1 ){ rc = SQ
33480 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33490 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f  T; goto balance_
334a0 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d  cleanup; }.    }
334b0 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20  .  }.  szNew[k] 
334c0 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e  = subtotal;.  cn
334d0 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b  tNew[k] = nCell;
334e0 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  .  k++;..  /*.  
334f0 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63  ** The packing c
33500 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70  omputed by the p
33510 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73  revious block is
33520 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74   biased toward t
33530 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a  he siblings.  **
33540 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64   on the left sid
33550 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62  e.  The left sib
33560 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73  lings are always
33570 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68   nearly full, wh
33580 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67  ile the.  ** rig
33590 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
335a0 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20  might be nearly 
335b0 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f  empty.  This blo
335c0 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d  ck of code attem
335d0 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75  pts.  ** to adju
335e0 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f  st the packing o
335f0 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65  f siblings to ge
33600 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e  t a better balan
33610 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
33620 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
33630 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70   more than an op
33640 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
33650 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d   packing above m
33660 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20  ight.  ** be so 
33670 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61  out of balance a
33680 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e  s to be illegal.
33690 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
336a0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
336b0 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  ** sibling might
336c0 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   be completely e
336d0 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75  mpty.  This adju
336e0 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70  stment is not op
336f0 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66  tional..  */.  f
33700 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69  or(i=k-1; i>0; i
33710 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52  --){.    int szR
33720 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b  ight = szNew[i];
33730 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62    /* Size of sib
33740 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68  ling on the righ
33750 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  t */.    int szL
33760 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d  eft = szNew[i-1]
33770 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62  ; /* Size of sib
33780 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74  ling on the left
33790 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20   */.    int r;  
337a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
337b0 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f  ndex of right-mo
337c0 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20  st cell in left 
337d0 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69  sibling */.    i
337e0 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
337f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
33800 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65  irst cell to the
33810 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73   left of right s
33820 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  ibling */..    r
33830 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
33840 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20   1;.    d = r + 
33850 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
33860 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78    assert( d<nMax
33870 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
33880 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73  ert( r<nMaxCells
33890 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   );.    while( s
338a0 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52  zRight==0 || szR
338b0 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32  ight+szCell[d]+2
338c0 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c  <=szLeft-(szCell
338d0 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20  [r]+2) ){.      
338e0 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
338f0 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
33900 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
33910 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
33920 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
33930 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
33940 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
33950 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
33960 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
33970 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
33980 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
33990 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
339a0 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
339b0 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
339c0 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
339d0 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20  0])>0) or pPage 
339e0 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  is.  ** a virtua
339f0 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
33a00 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
33a10 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
33a20 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
33a30 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
33a40 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
33a50 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
33a60 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
33a70 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
33a80 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
33a90 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
33aa0 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20  nCell==0) );..  
33ab0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
33ac0 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20   old: %d %d %d  
33ad0 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d  ",.    apOld[0]-
33ae0 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64  >pgno, .    nOld
33af0 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e  >=2 ? apOld[1]->
33b00 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f  pgno : 0,.    nO
33b10 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d  ld>=3 ? apOld[2]
33b20 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b  ->pgno : 0.  ));
33b30 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
33b40 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73  cate k new pages
33b50 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67  .  Reuse old pag
33b60 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  es where possibl
33b70 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70  e..  */.  if( ap
33b80 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20  Old[0]->pgno<=1 
33b90 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
33ba0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33bb0 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
33bc0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
33bd0 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f   pageFlags = apO
33be0 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b  ld[0]->aData[0];
33bf0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b  .  for(i=0; i<k;
33c00 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
33c10 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66  ge *pNew;.    if
33c20 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
33c30 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69    pNew = apNew[i
33c40 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20  ] = apOld[i];.  
33c50 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
33c60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ;.      rc = btr
33c70 65 65 4d 61 6b 65 50 61 67 65 57 72 69 74 65 61  eeMakePageWritea
33c80 62 6c 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ble(pNew);.     
33c90 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
33ca0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
33cb0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
33cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
33cd0 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
33ce0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
33cf0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
33d00 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67  &pNew, &pgno, pg
33d10 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  no, 0);.      if
33d20 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
33d30 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
33d40 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
33d50 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  ew;.      nNew++
33d60 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;..      /* Set 
33d70 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
33d80 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65  entry for the ne
33d90 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
33da0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
33db0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
33dc0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
33dd0 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  Bt, pNew->pgno, 
33de0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
33df0 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
33e00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
33e10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33e20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
33e30 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
33e40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33e50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
33e60 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70  * Free any old p
33e70 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
33e80 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77  ot reused as new
33e90 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77   pages..  */.  w
33ea0 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a  hile( i<nOld ){.
33eb0 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f      freePage(apO
33ec0 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ld[i], &rc);.   
33ed0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
33ee0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
33ef0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
33f00 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61  apOld[i]);.    a
33f10 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
33f20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a   i++;.  }..  /*.
33f30 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77    ** Put the new
33f40 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
33f50 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ing order.  This
33f60 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b   helps to.  ** k
33f70 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74  eep entries in t
33f80 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20  he disk file in 
33f90 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20  order so that a 
33fa0 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  scan.  ** of the
33fb0 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65   table is a line
33fc0 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
33fd0 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a  the file.  That.
33fe0 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c    ** in turn hel
33ff0 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ps the operating
34000 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76   system to deliv
34010 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72  er pages.  ** fr
34020 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65  om the disk more
34030 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20   rapidly..  **. 
34040 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e   ** An O(n^2) in
34050 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67  sertion sort alg
34060 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20  orithm is used, 
34070 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e  but since.  ** n
34080 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
34090 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20  han NB (a small 
340a0 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20  constant), that 
340b0 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20  should.  ** not 
340c0 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  be a problem..  
340d0 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d  **.  ** When NB=
340e0 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74  =3, this one opt
340f0 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20  imization makes 
34100 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
34110 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74  * about 25% fast
34120 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73  er for large ins
34130 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65  ertions and dele
34140 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tions..  */.  fo
34150 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b  r(i=0; i<k-1; i+
34160 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56  +){.    int minV
34170 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e   = apNew[i]->pgn
34180 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  o;.    int minI 
34190 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
341a0 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
341b0 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a       if( apNew[j
341c0 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65  ]->pgno<(unsigne
341d0 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20  d)minV ){.      
341e0 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20    minI = j;.    
341f0 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77      minV = apNew
34200 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  [j]->pgno;.     
34210 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
34220 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20   minI>i ){.     
34230 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
34240 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
34250 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
34260 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
34270 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
34280 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
34290 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77   }.  TRACE(("new
342a0 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
342b0 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
342c0 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e  (%d)\n",.    apN
342d0 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e  ew[0]->pgno, szN
342e0 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
342f0 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70  =2 ? apNew[1]->p
34300 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  gno : 0, nNew>=2
34310 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
34320 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61  .    nNew>=3 ? a
34330 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[2]->pgno : 
34340 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
34350 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
34360 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33  New>=4 ? apNew[3
34370 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
34380 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
34390 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
343a0 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e   ? apNew[4]->pgn
343b0 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  o : 0, nNew>=5 ?
343c0 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
343d0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
343e0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
343f0 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
34400 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62  Page) );.  put4b
34410 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65  yte(pRight, apNe
34420 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29  w[nNew-1]->pgno)
34430 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
34440 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
34450 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
34460 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
34470 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
34480 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
34490 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
344a0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
344b0 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
344c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
344d0 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
344e0 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
344f0 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
34500 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
34510 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
34520 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
34530 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f  ells );.    zero
34540 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
34550 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d  lags);.    assem
34560 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e  blePage(pNew, cn
34570 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65  tNew[i]-j, &apCe
34580 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a  ll[j], &szCell[j
34590 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
345a0 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  pNew->nCell>0 ||
345b0 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74   (nNew==1 && cnt
345c0 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20  New[0]==0) );.  
345d0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
345e0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
345f0 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
34600 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
34610 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
34620 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
34630 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
34640 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
34650 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
34660 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
34670 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
34680 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
34690 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c  sert( i<nNew-1 |
346a0 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  | j==nCell );.  
346b0 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b    if( j<nCell ){
346c0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
346d0 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
346e0 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
346f0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
34700 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
34710 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
34720 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
34730 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
34740 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
34750 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f       pTemp = &aO
34760 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70  vflSpace[iOvflSp
34770 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ace];.      if( 
34780 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
34790 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
347a0 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
347b0 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
347c0 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61  }else if( leafDa
347d0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
347e0 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
347f0 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
34800 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
34810 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
34820 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
34830 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
34840 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
34850 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
34860 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
34870 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
34880 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
34890 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
348a0 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
348b0 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
348c0 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
348d0 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
348e0 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
348f0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
34900 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
34910 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72  j--;.        btr
34920 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
34930 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
34940 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
34950 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
34960 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20         sz = 4 + 
34970 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
34980 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b  [4], info.nKey);
34990 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
349a0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
349b0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
349c0 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 4;.        /* 
349d0 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
349e0 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
349f0 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
34a00 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
34a10 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
34a20 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
34a30 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
34a40 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
34a50 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
34a60 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
34a70 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
34a80 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
34a90 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
34aa0 28 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43  (see btreeParseC
34ab0 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65  ellPtr(), 4 byte
34ac0 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  s is the minimum
34ad0 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20   size of.       
34ae0 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42   ** any cell). B
34af0 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  ut it is importa
34b00 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63  nt to pass the c
34b10 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a  orrect size to .
34b20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
34b30 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61  tCell(), so repa
34b40 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77  rse the cell now
34b50 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
34b60 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
34b70 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72  t this can never
34b80 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51   happen in an SQ
34b90 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20  Lite data file, 
34ba0 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  as all.        *
34bb0 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c  * cells are at l
34bc0 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74  east 4 bytes. It
34bd0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e   only happens in
34be0 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20   b-trees used.  
34bf0 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c        ** to eval
34c00 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54  uate "IN (SELECT
34c10 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c   ...)" and simil
34c20 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  ar clauses..    
34c30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
34c40 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20  f( szCell[j]==4 
34c50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
34c60 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69  ert(leafCorrecti
34c70 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20  on==4);.        
34c80 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
34c90 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  tr(pParent, pCel
34ca0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
34cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66      }.      iOvf
34cc0 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  lSpace += sz;.  
34cd0 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
34ce0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33  pBt->maxLocal+23
34cf0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
34d00 28 20 69 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20  ( iOvflSpace <= 
34d10 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69  (int)pBt->pageSi
34d20 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65  ze );.      inse
34d30 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
34d40 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
34d50 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70  , pTemp, pNew->p
34d60 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
34d70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34d80 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
34d90 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
34da0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34db0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
34dc0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
34dd0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b  e) );..      j++
34de0 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
34df0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
34e00 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
34e10 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
34e20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
34e30 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
34e40 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
34e50 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
34e60 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
34e70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
34e80 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
34e90 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
34ea0 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
34eb0 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20  ild, 4);.  }..  
34ec0 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50  if( isRoot && pP
34ed0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  arent->nCell==0 
34ee0 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  && pParent->hdrO
34ef0 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d  ffset<=apNew[0]-
34f00 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a  >nFree ){.    /*
34f10 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
34f20 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77  f the b-tree now
34f30 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
34f40 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62  ls. The only sib
34f50 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65  ling.    ** page
34f60 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
34f70 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ild of the paren
34f80 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  t. Copy the cont
34f90 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
34fa0 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e  ** child page in
34fb0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64  to the parent, d
34fc0 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76  ecreasing the ov
34fd0 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20  erall height of 
34fe0 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65  the.    ** b-tre
34ff0 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f  e structure by o
35000 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63  ne. This is desc
35010 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61  ribed as the "ba
35020 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22  lance-shallower"
35030 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f  .    ** sub-algo
35040 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f  rithm in some do
35050 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20  cumentation..   
35060 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
35070 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
35080 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74  cuum database, t
35090 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e  he call to copyN
350a0 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20  odeContent() .  
350b0 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f    ** sets all po
350c0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
350d0 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
350e0 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  to database imag
350f0 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
35100 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f  for which the po
35110 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  inter is stored 
35120 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65  within the conte
35130 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e  nt being copied.
35140 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
35150 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74  he second assert
35160 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
35170 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70  that the child p
35180 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e  age is defragmen
35190 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d  ted.    ** (it m
351a0 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61  ust be, as it wa
351b0 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75  s just reconstru
351c0 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d  cted using assem
351d0 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73  blePage()). This
351e0 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72  .    ** is impor
351f0 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65  tant if the pare
35200 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  nt page happens 
35210 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20  to be page 1 of 
35220 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
35230 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20   ** image.  */. 
35240 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d     assert( nNew=
35250 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
35260 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  ( apNew[0]->nFre
35270 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67  e == .        (g
35280 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30  et2byte(&apNew[0
35290 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e  ]->aData[5])-apN
352a0 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65  ew[0]->cellOffse
352b0 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c  t-apNew[0]->nCel
352c0 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20  l*2) .    );.   
352d0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
352e0 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65  (apNew[0], pPare
352f0 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72  nt, &rc);.    fr
35300 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c  eePage(apNew[0],
35310 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69   &rc);.  }else i
35320 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
35330 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68  ){.    /* Fix th
35340 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
35350 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
35360 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72  e cells that wer
35370 65 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64  e shifted around
35380 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  . .    ** There 
35390 61 72 65 20 73 65 76 65 72 61 6c 20 64 69 66 66  are several diff
353a0 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70  erent types of p
353b0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
353c0 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  es that need to.
353d0 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
353e0 77 69 74 68 20 62 79 20 74 68 69 73 20 72 6f 75  with by this rou
353f0 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68  tine. Some of th
35400 65 73 65 20 68 61 76 65 20 62 65 65 6e 20 73 65  ese have been se
35410 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20  t already, but. 
35420 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20     ** many have 
35430 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  not. The followi
35440 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a  ng is a summary:
35450 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
35460 20 31 29 20 54 68 65 20 65 6e 74 72 69 65 73 20   1) The entries 
35470 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
35480 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
35490 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a  s that were not.
354a0 20 20 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c      **      sibl
354b0 69 6e 67 73 20 77 68 65 6e 20 74 68 69 73 20 66  ings when this f
354c0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
354d0 65 64 2e 20 54 68 65 73 65 20 68 61 76 65 20 61  ed. These have a
354e0 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20  lready.    **   
354f0 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20     been set. We 
35500 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f  don't need to wo
35510 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69  rry about old si
35520 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65  blings that were
35530 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76  .    **      mov
35540 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
35550 69 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61  ist - the freePa
35560 67 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61  ge() code has ta
35570 6b 65 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  ken care.    ** 
35580 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20       of those.. 
35590 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32     **.    **   2
355a0 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  ) The pointer-ma
355b0 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  p entries associ
355c0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
355d0 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  rst overflow.   
355e0 20 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e   **      page in
355f0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68   any overflow ch
35600 61 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77  ains used by new
35610 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20   divider cells. 
35620 54 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20  These .    **   
35630 20 20 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72     have also alr
35640 65 61 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20  eady been taken 
35650 63 61 72 65 20 6f 66 20 62 79 20 74 68 65 20 69  care of by the i
35660 6e 73 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65  nsertCell() code
35670 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
35680 20 20 33 29 20 49 66 20 74 68 65 20 73 69 62 6c    3) If the sibl
35690 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
356a0 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74  t leaves, then t
356b0 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f  he child pages o
356c0 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65  f.    **      ce
356d0 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68  lls stored on th
356e0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
356f0 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
35700 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  pdated..    **. 
35710 20 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68     **   4) If th
35720 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
35730 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c  are not internal
35740 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74   intkey nodes, t
35750 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20  hen any.    **  
35760 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
35770 65 73 20 75 73 65 64 20 62 79 20 74 68 65 73 65  es used by these
35780 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20   cells may need 
35790 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20 20  to be updated.  
357a0 20 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72    **      (inter
357b0 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
357c0 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70   never contain p
357d0 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66  ointers to overf
357e0 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20  low pages)..    
357f0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49  **.    **   5) I
35800 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
35810 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ges are not leav
35820 65 73 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69  es, then the poi
35830 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
35840 20 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72       entries for
35850 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
35860 20 70 61 67 65 73 20 6f 66 20 65 61 63 68 20 73   pages of each s
35870 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a  ibling may need.
35880 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62      **      to b
35890 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a  e updated..    *
358a0 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31  *.    ** Cases 1
358b0 20 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74   and 2 are dealt
358c0 20 77 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f   with above by o
358d0 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e  ther code. The n
358e0 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
358f0 20 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65   deals with case
35900 73 20 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68  s 3 and 4 and th
35910 65 20 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74  e one after that
35920 2c 20 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a  , case 5. Since.
35930 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61      ** setting a
35940 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
35950 72 79 20 69 73 20 61 20 72 65 6c 61 74 69 76 65  ry is a relative
35960 6c 79 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  ly expensive ope
35970 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20  ration, this.   
35980 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65   ** code only se
35990 74 73 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  ts pointer map e
359a0 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64  ntries for child
359b0 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
359c0 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20  es that have.   
359d0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76   ** actually mov
359e0 65 64 20 62 65 74 77 65 65 6e 20 70 61 67 65 73  ed between pages
359f0 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  .  */.    MemPag
35a00 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
35a10 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  0];.    MemPage 
35a20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30  *pOld = apCopy[0
35a30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72  ];.    int nOver
35a40 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
35a50 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20  erflow;.    int 
35a60 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d  iNextOld = pOld-
35a70 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c  >nCell + nOverfl
35a80 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65  ow;.    int iOve
35a90 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c  rflow = (nOverfl
35aa0 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  ow ? pOld->aOvfl
35ab0 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29 3b 0a 20  [0].idx : -1);. 
35ac0 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20     j = 0;       
35ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ae0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
35af0 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20 70   'old' sibling p
35b00 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30  age */.    k = 0
35b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35b30 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27 20 73   Current 'new' s
35b40 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
35b50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
35b60 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
35b70 20 69 6e 74 20 69 73 44 69 76 69 64 65 72 20 3d   int isDivider =
35b80 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
35b90 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a   i==iNextOld ){.
35ba0 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
35bb0 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
35bc0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
35bd0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ing the last cel
35be0 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20  l on old.       
35bf0 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65   ** sibling page
35c00 20 6a 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69   j. If the sibli
35c10 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66  ngs are not leaf
35c20 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20   pages of an.   
35c30 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62       ** intkey b
35c40 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c  -tree, then cell
35c50 20 69 20 77 61 73 20 61 20 64 69 76 69 64 65 72   i was a divider
35c60 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   cell. */.      
35c70 20 20 61 73 73 65 72 74 28 20 6a 2b 31 20 3c 20    assert( j+1 < 
35c80 41 72 72 61 79 53 69 7a 65 28 61 70 43 6f 70 79  ArraySize(apCopy
35c90 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 6c  ) );.        pOl
35ca0 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b  d = apCopy[++j];
35cb0 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c  .        iNextOl
35cc0 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74  d = i + !leafDat
35cd0 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20  a + pOld->nCell 
35ce0 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  + pOld->nOverflo
35cf0 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  w;.        if( p
35d00 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  Old->nOverflow )
35d10 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65  {.          nOve
35d20 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f  rflow = pOld->nO
35d30 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20  verflow;.       
35d40 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69     iOverflow = i
35d50 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70   + !leafData + p
35d60 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
35d70 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  x;.        }.   
35d80 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d       isDivider =
35d90 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20   !leafData;  .  
35da0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
35db0 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ert(nOverflow>0 
35dc0 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29  || iOverflow<i )
35dd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ;.      assert(n
35de0 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f  Overflow<2 || pO
35df0 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
35e00 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d  ==pOld->aOvfl[1]
35e10 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61  .idx-1);.      a
35e20 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c  ssert(nOverflow<
35e30 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  3 || pOld->aOvfl
35e40 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61  [1].idx==pOld->a
35e50 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a  Ovfl[2].idx-1);.
35e60 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76        if( i==iOv
35e70 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
35e80 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b    isDivider = 1;
35e90 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d  .        if( (--
35ea0 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a  nOverflow)>0 ){.
35eb0 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66            iOverf
35ec0 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  low++;.        }
35ed0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
35ee0 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d  if( i==cntNew[k]
35ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
35f00 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c  ell i is the cel
35f10 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  l immediately fo
35f20 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
35f30 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20   cell on new.   
35f40 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20       ** sibling 
35f50 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73  page k. If the s
35f60 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
35f70 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e  leaf pages of an
35f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b  .        ** intk
35f90 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20  ey b-tree, then 
35fa0 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69  cell i is a divi
35fb0 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20  der cell.  */.  
35fc0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
35fd0 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20  ew[++k];.       
35fe0 20 69 66 28 20 21 6c 65 61 66 44 61 74 61 20 29   if( !leafData )
35ff0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
36000 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
36010 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20   j<nOld );.     
36020 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20   assert( k<nNew 
36030 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
36040 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69  the cell was ori
36050 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20  ginally divider 
36060 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74  cell (and is not
36070 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a   now) or.      *
36080 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  * an overflow ce
36090 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65  ll, or if the ce
360a0 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f  ll was located o
360b0 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 69  n a different si
360c0 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  bling.      ** p
360d0 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20 62  age before the b
360e0 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74  alancing, then t
360f0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
36100 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
36110 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20  d.      ** with 
36120 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  any child or ove
36130 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64  rflow pages need
36140 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20   to be updated. 
36150 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
36160 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d  Divider || pOld-
36170 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
36180 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  o ){.        if(
36190 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e   !leafCorrection
361a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74   ){.          pt
361b0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74  rmapPut(pBt, get
361c0 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29  4byte(apCell[i])
361d0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
361e0 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  pNew->pgno, &rc)
361f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36200 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69      if( szCell[i
36210 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  ]>pNew->minLocal
36220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74   ){.          pt
36230 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
36240 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  New, apCell[i], 
36250 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  &rc);.        }.
36260 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
36270 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72     if( !leafCorr
36280 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ection ){.      
36290 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
362a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
362b0 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62 79 74  32 key = get4byt
362c0 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61  e(&apNew[i]->aDa
362d0 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
362e0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6b  ptrmapPut(pBt, k
362f0 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ey, PTRMAP_BTREE
36300 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  , apNew[i]->pgno
36310 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  , &rc);.      }.
36320 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20      }..#if 0.   
36330 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68   /* The ptrmapCh
36340 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61  eckPages() conta
36350 69 6e 73 20 61 73 73 65 72 74 28 29 20 73 74 61  ins assert() sta
36360 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72  tements that ver
36370 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ify that.    ** 
36380 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  all pointer map 
36390 70 61 67 65 73 20 61 72 65 20 73 65 74 20 63 6f  pages are set co
363a0 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73  rrectly. This is
363b0 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a   helpful while .
363c0 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67      ** debugging
363d0 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
363e0 79 20 64 69 73 61 62 6c 65 64 20 62 65 63 61 75  y disabled becau
363f0 73 65 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  se a corrupt dat
36400 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a  abase may.    **
36410 20 63 61 75 73 65 20 61 6e 20 61 73 73 65 72 74   cause an assert
36420 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  () statement to 
36430 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74  fail.  */.    pt
36440 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 61  rmapCheckPages(a
36450 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  pNew, nNew);.   
36460 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
36470 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  s(&pParent, 1);.
36480 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73  #endif.  }..  as
36490 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
364a0 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45  sInit );.  TRACE
364b0 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
364c0 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77  shed: old=%d new
364d0 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c  =%d cells=%d\n",
364e0 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c  .          nOld,
364f0 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a   nNew, nCell));.
36500 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
36510 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
36520 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
36530 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
36540 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
36550 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69  apCell);.  for(i
36560 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
36570 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
36580 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d  e(apOld[i]);.  }
36590 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
365a0 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ew; i++){.    re
365b0 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b  leasePage(apNew[
365c0 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  i]);.  }..  retu
365d0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
365e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
365f0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
36600 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  e root page of a
36610 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
36620 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c  e is.** overfull
36630 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   (has one or mor
36640 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
36650 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63  )..**.** A new c
36660 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c  hild page is all
36670 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 63  ocated and the c
36680 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
36690 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70  urrent root.** p
366a0 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  age, including o
366b0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61  verflow cells, a
366c0 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  re copied into t
366d0 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f  he child. The ro
366e0 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68  ot.** page is th
366f0 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74  en overwritten t
36700 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70  o make it an emp
36710 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68 65  ty page with the
36720 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a   right-child .**
36730 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e   pointer pointin
36740 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  g to the new pag
36750 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
36760 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70  returning, all p
36770 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
36780 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  es corresponding
36790 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68   to pages .** th
367a0 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  at the new child
367b0 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69  -page now contai
367c0 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ns pointers to a
367d0 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a  re updated. The.
367e0 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70  ** entry corresp
367f0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  onding to the ne
36800 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f  w right-child po
36810 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  inter of the roo
36820 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73  t.** page is als
36830 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  o updated..**.**
36840 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
36850 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20  *ppChild is set 
36860 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66  to contain a ref
36870 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68  erence to the ch
36880 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64  ild .** page and
36890 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
368a0 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
368b0 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  case the caller 
368c0 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74  is required.** t
368d0 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
368e0 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64  ge() on *ppChild
368f0 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49   exactly once. I
36900 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
36910 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  s,.** an error c
36920 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
36930 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20  and *ppChild is 
36940 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61  set to 0..*/.sta
36950 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
36960 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a  deeper(MemPage *
36970 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a  pRoot, MemPage *
36980 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74  *ppChild){.  int
36990 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
369a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
369b0 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
369c0 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
369d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  /.  MemPage *pCh
369e0 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ild = 0;        
369f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
36a00 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
36a10 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
36a20 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Child = 0;      
36a30 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
36a40 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
36a50 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
36a60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
36a70 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f  pRoot->pBt;    /
36a80 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a  * The BTree */..
36a90 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
36aa0 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a  >nOverflow>0 );.
36ab0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36ac0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
36ad0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
36ae0 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68  * Make pRoot, th
36af0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
36b00 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61  he b-tree, writa
36b10 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20  ble. Allocate a 
36b20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74  new .  ** page t
36b30 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
36b40 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68  the new right-ch
36b50 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f  ild of pPage. Co
36b60 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  py the contents.
36b70 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65    ** of the node
36b80 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74   stored on pRoot
36b90 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68   into the new ch
36ba0 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ild page..  */. 
36bb0 20 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65 50   rc = btreeMakeP
36bc0 61 67 65 57 72 69 74 65 61 62 6c 65 28 70 52 6f  ageWriteable(pRo
36bd0 6f 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ot);.  if( rc==S
36be0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36bf0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
36c00 65 65 50 61 67 65 28 70 42 74 2c 26 70 43 68 69  eePage(pBt,&pChi
36c10 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52  ld,&pgnoChild,pR
36c20 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20  oot->pgno,0);.  
36c30 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e    copyNodeConten
36c40 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c  t(pRoot, pChild,
36c50 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 49   &rc);.    if( I
36c60 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
36c70 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
36c80 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50  Bt, pgnoChild, P
36c90 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f  TRMAP_BTREE, pRo
36ca0 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ot->pgno, &rc);.
36cb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
36cc0 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69  rc ){.    *ppChi
36cd0 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  ld = 0;.    rele
36ce0 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
36cf0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
36d00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
36d10 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
36d20 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44  eable(pChild->pD
36d30 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
36d40 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
36d50 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f  Iswriteable(pRoo
36d60 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
36d70 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
36d80 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e  >nCell==pRoot->n
36d90 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45  Cell );..  TRACE
36da0 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79  (("BALANCE: copy
36db0 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64   root %d into %d
36dc0 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  \n", pRoot->pgno
36dd0 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
36de0 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  ;..  /* Copy the
36df0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
36e00 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43  from pRoot to pC
36e10 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  hild */.  memcpy
36e20 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20  (pChild->aOvfl, 
36e30 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52  pRoot->aOvfl, pR
36e40 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73  oot->nOverflow*s
36e50 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76  izeof(pRoot->aOv
36e60 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c  fl[0]));.  pChil
36e70 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  d->nOverflow = p
36e80 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  Root->nOverflow;
36e90 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
36ea0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f  contents of pRoo
36eb0 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20  t. Then install 
36ec0 70 43 68 69 6c 64 20 61 73 20 74 68 65 20 72 69  pChild as the ri
36ed0 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20  ght-child. */.  
36ee0 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
36ef0 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
36f00 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20   & ~PTF_LEAF);. 
36f10 20 70 75 74 34 62 79 74 65 28 26 70 52 6f 6f 74   put4byte(&pRoot
36f20 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
36f30 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
36f40 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43  oChild);..  *ppC
36f50 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20  hild = pChild;. 
36f60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36f70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
36f80 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20 63  page that pCur c
36f90 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
36fa0 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  to has just been
36fb0 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20   modified in.** 
36fc0 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66  some way. This f
36fd0 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20  unction figures 
36fe0 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69  out if this modi
36ff0 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74  fication means t
37000 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73  he.** tree needs
37010 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c   to be balanced,
37020 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73   and if so calls
37030 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
37040 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72   balancing .** r
37050 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e  outine. Balancin
37060 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a  g routines are:.
37070 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  **.**   balance_
37080 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c  quick().**   bal
37090 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a 2a 2a  ance_deeper().**
370a0 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f     balance_nonro
370b0 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ot().*/.static i
370c0 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72  nt balance(BtCur
370d0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
370e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
370f0 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d  ;.  const int nM
37100 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e  in = pCur->pBt->
37110 75 73 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f  usableSize * 2 /
37120 20 33 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63   3;.  u8 aBalanc
37130 65 51 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b  eQuickSpace[13];
37140 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30  .  u8 *pFree = 0
37150 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69  ;..  TESTONLY( i
37160 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
37170 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20  _called = 0 );. 
37180 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62   TESTONLY( int b
37190 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61  alance_deeper_ca
371a0 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64  lled = 0 );..  d
371b0 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  o {.    int iPag
371c0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
371d0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
371e0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
371f0 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20  ge[iPage];..    
37200 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a  if( iPage==0 ){.
37210 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
37220 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
37230 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f        /* The roo
37240 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
37250 74 72 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  tree is overfull
37260 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63  . In this case c
37270 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20  all the.        
37280 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ** balance_deepe
37290 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r() function to 
372a0 63 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69  create a new chi
372b0 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  ld for the root-
372c0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
372d0 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63 75 72  and copy the cur
372e0 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
372f0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
37300 6f 20 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20  o it. The.      
37310 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74    ** next iterat
37320 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
37330 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  op will balance 
37340 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  the child page..
37350 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20          */ .    
37360 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c      assert( (bal
37370 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c  ance_deeper_call
37380 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ed++)==0 );.    
37390 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
373a0 5f 64 65 65 70 65 72 28 70 50 61 67 65 2c 20 26  _deeper(pPage, &
373b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29  pCur->apPage[1])
373c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
373d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
373e0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
373f0 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Page = 1;.      
37400 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
37410 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
37420 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d    pCur->aiIdx[1]
37430 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
37440 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
37450 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c  Page[1]->nOverfl
37460 6f 77 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ow );.        }.
37470 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
37480 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
37490 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
374a0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
374b0 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  ow==0 && pPage->
374c0 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20  nFree<=nMin ){. 
374d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
374e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d  }else{.      Mem
374f0 50 61 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61  Page * const pPa
37500 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  rent = pCur->apP
37510 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20  age[iPage-1];.  
37520 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49      int const iI
37530 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
37540 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20  [iPage-1];..    
37550 20 20 72 63 20 3d 20 62 74 72 65 65 4d 61 6b 65    rc = btreeMake
37560 50 61 67 65 57 72 69 74 65 61 62 6c 65 28 70 50  PageWriteable(pP
37570 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  arent);.      if
37580 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37590 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
375a0 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
375b0 4e 43 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  NCE.        if( 
375c0 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 0a 20  pPage->hasData. 
375d0 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
375e0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20  ->nOverflow==1. 
375f0 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
37600 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
37610 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20  pPage->nCell.   
37620 20 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74        && pParent
37630 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20  ->pgno!=1.      
37640 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e     && pParent->n
37650 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20  Cell==iIdx.     
37660 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
37670 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f  /* Call balance_
37680 71 75 69 63 6b 28 29 20 74 6f 20 63 72 65 61 74  quick() to creat
37690 65 20 61 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  e a new sibling 
376a0 6f 66 20 70 50 61 67 65 20 6f 6e 20 77 68 69 63  of pPage on whic
376b0 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  h.          ** t
376c0 6f 20 73 74 6f 72 65 20 74 68 65 20 6f 76 65 72  o store the over
376d0 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e  flow cell. balan
376e0 63 65 5f 71 75 69 63 6b 28 29 20 69 6e 73 65 72  ce_quick() inser
376f0 74 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20  ts a new cell.  
37700 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20          ** into 
37710 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d  pParent, which m
37720 61 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74  ay cause pParent
37730 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20 74 68   overflow. If th
37740 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
37750 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6e 65 78  happens, the nex
37760 74 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20  t interation of 
37770 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
37780 20 62 61 6c 61 6e 63 65 20 70 50 61 72 65 6e 74   balance pParent
37790 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75   .          ** u
377a0 73 65 20 65 69 74 68 65 72 20 62 61 6c 61 6e 63  se either balanc
377b0 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62  e_nonroot() or b
377c0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 2e  alance_deeper().
377d0 20 55 6e 74 69 6c 20 74 68 69 73 0a 20 20 20 20   Until this.    
377e0 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73        ** happens
377f0 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  , the overflow c
37800 65 6c 6c 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ell is stored in
37810 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69   the aBalanceQui
37820 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20  ckSpace[].      
37830 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 0a      ** buffer. .
37840 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
37850 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 70 75         ** The pu
37860 72 70 6f 73 65 20 6f 66 20 74 68 65 20 66 6f 6c  rpose of the fol
37870 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
37880 69 73 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74  is to check that
37890 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20 20 20   only a.        
378a0 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c    ** single call
378b0 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75 69 63   to balance_quic
378c0 6b 28 29 20 69 73 20 6d 61 64 65 20 66 6f 72 20  k() is made for 
378d0 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69  each call to thi
378e0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  s.          ** f
378f0 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
37900 20 77 65 72 65 20 6e 6f 74 20 76 65 72 69 66 69   were not verifi
37910 65 64 2c 20 61 20 73 75 62 74 6c 65 20 62 75 67  ed, a subtle bug
37920 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75 73 65   involving reuse
37930 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
37940 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69   the aBalanceQui
37950 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68 74 20  ckSpace[] might 
37960 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20 20 20  sneak in..      
37970 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
37980 20 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63   assert( (balanc
37990 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b  e_quick_called++
379a0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
379b0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 71    rc = balance_q
379c0 75 69 63 6b 28 70 50 61 72 65 6e 74 2c 20 70 50  uick(pParent, pP
379d0 61 67 65 2c 20 61 42 61 6c 61 6e 63 65 51 75 69  age, aBalanceQui
379e0 63 6b 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  ckSpace);.      
379f0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
37a00 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
37a10 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
37a20 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  se, call balance
37a30 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 72 65  _nonroot() to re
37a40 64 69 73 74 72 69 62 75 74 65 20 63 65 6c 6c 73  distribute cells
37a50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
37a60 74 77 65 65 6e 20 70 50 61 67 65 20 61 6e 64 20  tween pPage and 
37a70 75 70 20 74 6f 20 32 20 6f 66 20 69 74 73 20 73  up to 2 of its s
37a80 69 62 6c 69 6e 67 20 70 61 67 65 73 2e 20 54 68  ibling pages. Th
37a90 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20 20 20  is involves.    
37aa0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 69        ** modifyi
37ab0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
37ac0 6f 66 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63  of pParent, whic
37ad0 68 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72  h may cause pPar
37ae0 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 20 20 20  ent to.         
37af0 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   ** become overf
37b00 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
37b10 2e 20 54 68 65 20 6e 65 78 74 20 69 74 65 72 61  . The next itera
37b20 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
37b30 6f 6f 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  oop.          **
37b40 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68   will balance th
37b50 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
37b60 20 63 6f 72 72 65 63 74 20 74 68 69 73 2e 0a 20   correct this.. 
37b70 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20           ** .   
37b80 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
37b90 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63   parent page bec
37ba0 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74  omes overfull, t
37bb0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
37bc0 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20 20 20   or cells.      
37bd0 20 20 20 20 2a 2a 20 61 72 65 20 73 74 6f 72 65      ** are store
37be0 64 20 69 6e 20 74 68 65 20 70 53 70 61 63 65 20  d in the pSpace 
37bf0 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
37c00 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 6c   immediately bel
37c10 6f 77 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ow. .          *
37c20 2a 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 69  * A subsequent i
37c30 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
37c40 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61  do-loop will dea
37c50 6c 20 77 69 74 68 20 74 68 69 73 20 62 79 0a 20  l with this by. 
37c60 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c           ** call
37c70 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  ing balance_nonr
37c80 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63 65 5f 64  oot() (balance_d
37c90 65 65 70 65 72 28 29 20 6d 61 79 20 62 65 20 63  eeper() may be c
37ca0 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20 20 20  alled first,.   
37cb0 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20 69 74         ** but it
37cc0 20 64 6f 65 73 6e 27 74 20 64 65 61 6c 20 77 69   doesn't deal wi
37cd0 74 68 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  th overflow cell
37ce0 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73 20 74  s - just moves t
37cf0 68 65 6d 20 74 6f 20 61 0a 20 20 20 20 20 20 20  hem to a.       
37d00 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20     ** different 
37d10 70 61 67 65 29 2e 20 4f 6e 63 65 20 74 68 69 73  page). Once this
37d20 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
37d30 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   to balance_nonr
37d40 6f 6f 74 28 29 20 0a 20 20 20 20 20 20 20 20 20  oot() .         
37d50 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65 74 65   ** has complete
37d60 64 2c 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  d, it is safe to
37d70 20 72 65 6c 65 61 73 65 20 74 68 65 20 70 53 70   release the pSp
37d80 61 63 65 20 62 75 66 66 65 72 20 75 73 65 64 20  ace buffer used 
37d90 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  by.          ** 
37da0 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 61 6c  the previous cal
37db0 6c 2c 20 61 73 20 74 68 65 20 6f 76 65 72 66 6c  l, as the overfl
37dc0 6f 77 20 63 65 6c 6c 20 64 61 74 61 20 77 69 6c  ow cell data wil
37dd0 6c 20 68 61 76 65 20 62 65 65 6e 20 0a 20 20 20  l have been .   
37de0 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
37df0 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
37e00 20 62 6f 64 79 20 6f 66 20 61 20 64 61 74 61 62   body of a datab
37e10 61 73 65 20 70 61 67 65 20 6f 72 20 69 6e 74 6f  ase page or into
37e20 20 74 68 65 20 6e 65 77 0a 20 20 20 20 20 20 20   the new.       
37e30 20 20 20 2a 2a 20 70 53 70 61 63 65 20 62 75 66     ** pSpace buf
37e40 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68  fer passed to th
37e50 65 20 6c 61 74 74 65 72 20 63 61 6c 6c 20 74 6f  e latter call to
37e60 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
37e70 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ()..          */
37e80 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 70  .          u8 *p
37e90 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
37ea0 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e  ageMalloc(pCur->
37eb0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
37ec0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
37ed0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
37ee0 50 61 72 65 6e 74 2c 20 69 49 64 78 2c 20 70 53  Parent, iIdx, pS
37ef0 70 61 63 65 2c 20 69 50 61 67 65 3d 3d 31 29 3b  pace, iPage==1);
37f00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
37f10 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
37f20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 65 65 20      /* If pFree 
37f30 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
37f40 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70 53  points to the pS
37f50 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65 64  pace buffer used
37f60 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
37f70 20 62 79 20 61 20 70 72 65 76 69 6f 75 73 20 63   by a previous c
37f80 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e  all to balance_n
37f90 6f 6e 72 6f 6f 74 28 29 2e 20 49 74 73 20 63 6f  onroot(). Its co
37fa0 6e 74 65 6e 74 73 20 61 72 65 0a 20 20 20 20 20  ntents are.     
37fb0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 77 20 73 74         ** now st
37fc0 6f 72 65 64 20 65 69 74 68 65 72 20 6f 6e 20 72  ored either on r
37fd0 65 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  eal database pag
37fe0 65 73 20 6f 72 20 77 69 74 68 69 6e 20 74 68 65  es or within the
37ff0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
38000 20 6e 65 77 20 70 53 70 61 63 65 20 62 75 66 66   new pSpace buff
38010 65 72 2c 20 73 6f 20 69 74 20 6d 61 79 20 62 65  er, so it may be
38020 20 73 61 66 65 6c 79 20 66 72 65 65 64 20 68 65   safely freed he
38030 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re. */.         
38040 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
38050 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20  ee(pFree);.     
38060 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
38070 20 20 2f 2a 20 54 68 65 20 70 53 70 61 63 65 20    /* The pSpace 
38080 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65 20 66  buffer will be f
38090 72 65 65 64 20 61 66 74 65 72 20 74 68 65 20 6e  reed after the n
380a0 65 78 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  ext call to.    
380b0 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65        ** balance
380c0 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72 20 6a  _nonroot(), or j
380d0 75 73 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  ust before this 
380e0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
380f0 2c 20 77 68 69 63 68 65 76 65 72 0a 20 20 20 20  , whichever.    
38100 20 20 20 20 20 20 2a 2a 20 63 6f 6d 65 73 20 66        ** comes f
38110 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  irst. */.       
38120 20 20 20 70 46 72 65 65 20 3d 20 70 53 70 61 63     pFree = pSpac
38130 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
38140 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67     }..      pPag
38150 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
38160 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
38170 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
38180 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 62 61  f the do-loop ba
38190 6c 61 6e 63 65 73 20 74 68 65 20 70 61 72 65 6e  lances the paren
381a0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  t page. */.     
381b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
381c0 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ge);.      pCur-
381d0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >iPage--;.    }.
381e0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
381f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66  LITE_OK );..  if
38200 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
38210 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
38220 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
38230 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
38240 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
38250 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42  ecord into the B
38260 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69  Tree.  The key i
38270 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79  s given by (pKey
38280 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68  ,nKey).** and th
38290 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20  e data is given 
382a0 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29  by (pData,nData)
382b0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  .  The cursor is
382c0 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a   used only to.**
382d0 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62   define what tab
382e0 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68  le the record sh
382f0 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
38300 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73   into.  The curs
38310 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
38320 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
38330 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  om location..**.
38340 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59  ** For an INTKEY
38350 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65   table, only the
38360 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74   nKey value of t
38370 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20  he key is used. 
38380 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f   pKey is.** igno
38390 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f  red.  For a ZERO
383a0 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20  DATA table, the 
383b0 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20  pData and nData 
383c0 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64  are both ignored
383d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
383e0 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65  eekResult parame
383f0 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
38400 20 74 68 65 6e 20 61 20 73 75 63 63 65 73 73 66   then a successf
38410 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f  ul call to.** Mo
38420 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
38430 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20 70 43  o seek cursor pC
38440 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65  ur to (pKey, nKe
38450 79 29 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  y) has already.*
38460 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d 65 64  * been performed
38470 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69 73 20  . seekResult is 
38480 74 68 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  the search resul
38490 74 20 72 65 74 75 72 6e 65 64 20 28 61 20 6e 65  t returned (a ne
384a0 67 61 74 69 76 65 0a 2a 2a 20