/ Hex Artifact Content
Login

Artifact 78c0d989c32e5baac471f0463e83cda5006c7e71ded39d633b5fc001a301a26e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 61  e for implementa
01a0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 2d 74  tions of the r-t
01b0: 72 65 65 20 61 6e 64 20 72 2a 2d 74 72 65 65 0a  ree and r*-tree.
01c0: 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 73 20 70 61  ** algorithms pa
01d0: 63 6b 61 67 65 64 20 61 73 20 61 6e 20 53 51 4c  ckaged as an SQL
01e0: 69 74 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ite virtual tabl
01f0: 65 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  e module..*/../*
0200: 0a 2a 2a 20 44 61 74 61 62 61 73 65 20 46 6f 72  .** Database For
0210: 6d 61 74 20 6f 66 20 52 2d 54 72 65 65 20 54 61  mat of R-Tree Ta
0220: 62 6c 65 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  bles.** --------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 54  --------.**.** T
0250: 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
0260: 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 76  e for a single v
0270: 69 72 74 75 61 6c 20 72 2d 74 72 65 65 20 74 61  irtual r-tree ta
0280: 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ble is stored in
0290: 20 74 68 72 65 65 20 0a 2a 2a 20 6e 61 74 69 76   three .** nativ
02a0: 65 20 53 51 4c 69 74 65 20 74 61 62 6c 65 73 20  e SQLite tables 
02b0: 64 65 63 6c 61 72 65 64 20 61 73 20 66 6f 6c 6c  declared as foll
02c0: 6f 77 73 2e 20 49 6e 20 65 61 63 68 20 63 61 73  ows. In each cas
02d0: 65 2c 20 74 68 65 20 27 25 27 20 63 68 61 72 61  e, the '%' chara
02e0: 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 74  cter.** in the t
02f0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 70  able name is rep
0300: 6c 61 63 65 64 20 77 69 74 68 20 74 68 65 20 75  laced with the u
0310: 73 65 72 2d 73 75 70 70 6c 69 65 64 20 6e 61 6d  ser-supplied nam
0320: 65 20 6f 66 20 74 68 65 20 72 2d 74 72 65 65 0a  e of the r-tree.
0330: 2a 2a 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ** table..**.** 
0340: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25    CREATE TABLE %
0350: 5f 6e 6f 64 65 28 6e 6f 64 65 6e 6f 20 49 4e 54  _node(nodeno INT
0360: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
0370: 2c 20 64 61 74 61 20 42 4c 4f 42 29 0a 2a 2a 20  , data BLOB).** 
0380: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25    CREATE TABLE %
0390: 5f 70 61 72 65 6e 74 28 6e 6f 64 65 6e 6f 20 49  _parent(nodeno I
03a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
03b0: 45 59 2c 20 70 61 72 65 6e 74 6e 6f 64 65 20 49  EY, parentnode I
03c0: 4e 54 45 47 45 52 29 0a 2a 2a 20 20 20 43 52 45  NTEGER).**   CRE
03d0: 41 54 45 20 54 41 42 4c 45 20 25 5f 72 6f 77 69  ATE TABLE %_rowi
03e0: 64 28 72 6f 77 69 64 20 49 4e 54 45 47 45 52 20  d(rowid INTEGER 
03f0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 6e 6f 64  PRIMARY KEY, nod
0400: 65 6e 6f 20 49 4e 54 45 47 45 52 2c 20 2e 2e 2e  eno INTEGER, ...
0410: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ).**.** The data
0420: 20 66 6f 72 20 65 61 63 68 20 6e 6f 64 65 20 6f   for each node o
0430: 66 20 74 68 65 20 72 2d 74 72 65 65 20 73 74 72  f the r-tree str
0440: 75 63 74 75 72 65 20 69 73 20 73 74 6f 72 65 64  ucture is stored
0450: 20 69 6e 20 74 68 65 20 25 5f 6e 6f 64 65 0a 2a   in the %_node.*
0460: 2a 20 74 61 62 6c 65 2e 20 46 6f 72 20 65 61 63  * table. For eac
0470: 68 20 6e 6f 64 65 20 74 68 61 74 20 69 73 20 6e  h node that is n
0480: 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ot the root node
0490: 20 6f 66 20 74 68 65 20 72 2d 74 72 65 65 2c 20   of the r-tree, 
04a0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 65  there is.** an e
04b0: 6e 74 72 79 20 69 6e 20 74 68 65 20 25 5f 70 61  ntry in the %_pa
04c0: 72 65 6e 74 20 74 61 62 6c 65 20 61 73 73 6f 63  rent table assoc
04d0: 69 61 74 69 6e 67 20 74 68 65 20 6e 6f 64 65 20  iating the node 
04e0: 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 2e  with its parent.
04f0: 0a 2a 2a 20 41 6e 64 20 66 6f 72 20 65 61 63 68  .** And for each
0500: 20 72 6f 77 20 6f 66 20 64 61 74 61 20 69 6e 20   row of data in 
0510: 74 68 65 20 74 61 62 6c 65 2c 20 74 68 65 72 65  the table, there
0520: 20 69 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20   is an entry in 
0530: 74 68 65 20 25 5f 72 6f 77 69 64 0a 2a 2a 20 74  the %_rowid.** t
0540: 61 62 6c 65 20 74 68 61 74 20 6d 61 70 73 20 66  able that maps f
0550: 72 6f 6d 20 74 68 65 20 65 6e 74 72 69 65 73 20  rom the entries 
0560: 72 6f 77 69 64 20 74 6f 20 74 68 65 20 69 64 20  rowid to the id 
0570: 6f 66 20 74 68 65 20 6e 6f 64 65 20 74 68 61 74  of the node that
0580: 20 69 74 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64   it.** is stored
0590: 20 6f 6e 2e 20 20 49 66 20 74 68 65 20 72 2d 74   on.  If the r-t
05a0: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 61 75 78  ree contains aux
05b0: 69 6c 69 61 72 79 20 63 6f 6c 75 6d 6e 73 2c 20  iliary columns, 
05c0: 74 68 6f 73 65 20 61 72 65 20 73 74 6f 72 65 64  those are stored
05d0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  .** on the end o
05e0: 66 20 74 68 65 20 25 5f 72 6f 77 69 64 20 74 61  f the %_rowid ta
05f0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ble..**.** The r
0600: 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 61 6e 20 72  oot node of an r
0610: 2d 74 72 65 65 20 61 6c 77 61 79 73 20 65 78 69  -tree always exi
0620: 73 74 73 2c 20 65 76 65 6e 20 69 66 20 74 68 65  sts, even if the
0630: 20 72 2d 74 72 65 65 20 74 61 62 6c 65 20 69 73   r-tree table is
0640: 0a 2a 2a 20 65 6d 70 74 79 2e 20 54 68 65 20 6e  .** empty. The n
0650: 6f 64 65 6e 6f 20 6f 66 20 74 68 65 20 72 6f 6f  odeno of the roo
0660: 74 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  t node is always
0670: 20 31 2e 20 41 6c 6c 20 6f 74 68 65 72 20 6e 6f   1. All other no
0680: 64 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61  des in the.** ta
0690: 62 6c 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ble must be the 
06a0: 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65  same size as the
06b0: 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 54 68 65 20   root node. The 
06c0: 63 6f 6e 74 65 6e 74 20 6f 66 20 65 61 63 68 20  content of each 
06d0: 6e 6f 64 65 0a 2a 2a 20 69 73 20 66 6f 72 6d 61  node.** is forma
06e0: 74 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  tted as follows:
06f0: 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 49 66 20 74  .**.**   1. If t
0700: 68 65 20 6e 6f 64 65 20 69 73 20 74 68 65 20 72  he node is the r
0710: 6f 6f 74 20 6e 6f 64 65 20 28 6e 6f 64 65 20 31  oot node (node 1
0720: 29 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  ), then the firs
0730: 74 20 32 20 62 79 74 65 73 0a 2a 2a 20 20 20 20  t 2 bytes.**    
0740: 20 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 63 6f    of the node co
0750: 6e 74 61 69 6e 20 74 68 65 20 74 72 65 65 20 64  ntain the tree d
0760: 65 70 74 68 20 61 73 20 61 20 62 69 67 2d 65 6e  epth as a big-en
0770: 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  dian integer..**
0780: 20 20 20 20 20 20 46 6f 72 20 6e 6f 6e 2d 72 6f        For non-ro
0790: 6f 74 20 6e 6f 64 65 73 2c 20 74 68 65 20 66 69  ot nodes, the fi
07a0: 72 73 74 20 32 20 62 79 74 65 73 20 61 72 65 20  rst 2 bytes are 
07b0: 6c 65 66 74 20 75 6e 75 73 65 64 2e 0a 2a 2a 0a  left unused..**.
07c0: 2a 2a 20 20 20 32 2e 20 54 68 65 20 6e 65 78 74  **   2. The next
07d0: 20 32 20 62 79 74 65 73 20 63 6f 6e 74 61 69 6e   2 bytes contain
07e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
07f0: 6e 74 72 69 65 73 20 63 75 72 72 65 6e 74 6c 79  ntries currently
0800: 20 0a 2a 2a 20 20 20 20 20 20 73 74 6f 72 65 64   .**      stored
0810: 20 69 6e 20 74 68 65 20 6e 6f 64 65 2e 0a 2a 2a   in the node..**
0820: 0a 2a 2a 20 20 20 33 2e 20 54 68 65 20 72 65 6d  .**   3. The rem
0830: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6e 6f  ainder of the no
0840: 64 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  de contains the 
0850: 6e 6f 64 65 20 65 6e 74 72 69 65 73 2e 20 45 61  node entries. Ea
0860: 63 68 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20  ch entry.**     
0870: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0880: 69 6e 67 6c 65 20 38 2d 62 79 74 65 20 69 6e 74  ingle 8-byte int
0890: 65 67 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  eger followed by
08a0: 20 61 6e 20 65 76 65 6e 20 6e 75 6d 62 65 72 0a   an even number.
08b0: 2a 2a 20 20 20 20 20 20 6f 66 20 34 2d 62 79 74  **      of 4-byt
08c0: 65 20 63 6f 6f 72 64 69 6e 61 74 65 73 2e 20 46  e coordinates. F
08d0: 6f 72 20 6c 65 61 66 20 6e 6f 64 65 73 20 74 68  or leaf nodes th
08e0: 65 20 69 6e 74 65 67 65 72 20 69 73 20 74 68 65  e integer is the
08f0: 20 72 6f 77 69 64 0a 2a 2a 20 20 20 20 20 20 6f   rowid.**      o
0900: 66 20 61 20 72 65 63 6f 72 64 2e 20 46 6f 72 20  f a record. For 
0910: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 69  internal nodes i
0920: 74 20 69 73 20 74 68 65 20 6e 6f 64 65 20 6e 75  t is the node nu
0930: 6d 62 65 72 20 6f 66 20 61 0a 2a 2a 20 20 20 20  mber of a.**    
0940: 20 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 2a 2f    child page..*/
0950: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
0960: 51 4c 49 54 45 5f 43 4f 52 45 29 20 5c 0a 20 20  QLITE_CORE) \.  
0970: 7c 7c 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49  || (defined(SQLI
0980: 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 29  TE_ENABLE_RTREE)
0990: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
09a0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
09b0: 54 41 42 4c 45 29 29 0a 0a 23 69 66 6e 64 65 66  TABLE))..#ifndef
09c0: 20 53 51 4c 49 54 45 5f 43 4f 52 45 0a 20 20 23   SQLITE_CORE.  #
09d0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
09e0: 65 78 74 2e 68 22 0a 20 20 53 51 4c 49 54 45 5f  ext.h".  SQLITE_
09f0: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a  EXTENSION_INIT1.
0a00: 23 65 6c 73 65 0a 20 20 23 69 6e 63 6c 75 64 65  #else.  #include
0a10: 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 65 6e   "sqlite3.h".#en
0a20: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
0a30: 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e  ITE_AMALGAMATION
0a40: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0a50: 65 33 72 74 72 65 65 2e 68 22 0a 74 79 70 65 64  e3rtree.h".typed
0a60: 65 66 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ef sqlite3_int64
0a70: 20 69 36 34 3b 0a 74 79 70 65 64 65 66 20 73 71   i64;.typedef sq
0a80: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 36 34  lite3_uint64 u64
0a90: 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ;.typedef unsign
0aa0: 65 64 20 63 68 61 72 20 75 38 3b 0a 74 79 70 65  ed char u8;.type
0ab0: 64 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f  def unsigned sho
0ac0: 72 74 20 75 31 36 3b 0a 74 79 70 65 64 65 66 20  rt u16;.typedef 
0ad0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 33 32  unsigned int u32
0ae0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ;.#if !defined(N
0af0: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
0b00: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
0b10: 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 42 55 47  .# define NDEBUG
0b20: 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   1.#endif.#if de
0b30: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
0b40: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
0b50: 44 45 42 55 47 29 0a 23 20 75 6e 64 65 66 20 4e  DEBUG).# undef N
0b60: 44 45 42 55 47 0a 23 65 6e 64 69 66 0a 23 65 6e  DEBUG.#endif.#en
0b70: 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73  dif..#include <s
0b80: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
0b90: 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63  e <stdio.h>.#inc
0ba0: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
0bb0: 0a 2f 2a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ./*  The followi
0bc0: 6e 67 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  ng macro is used
0bd0: 20 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d   to suppress com
0be0: 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 2e 0a  piler warnings..
0bf0: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45  */.#ifndef UNUSE
0c00: 44 5f 50 41 52 41 4d 45 54 45 52 0a 23 20 64 65  D_PARAMETER.# de
0c10: 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41  fine UNUSED_PARA
0c20: 4d 45 54 45 52 28 78 29 20 28 76 6f 69 64 29 28  METER(x) (void)(
0c30: 78 29 0a 23 65 6e 64 69 66 0a 0a 74 79 70 65 64  x).#endif..typed
0c40: 65 66 20 73 74 72 75 63 74 20 52 74 72 65 65 20  ef struct Rtree 
0c50: 52 74 72 65 65 3b 0a 74 79 70 65 64 65 66 20 73  Rtree;.typedef s
0c60: 74 72 75 63 74 20 52 74 72 65 65 43 75 72 73 6f  truct RtreeCurso
0c70: 72 20 52 74 72 65 65 43 75 72 73 6f 72 3b 0a 74  r RtreeCursor;.t
0c80: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 74  ypedef struct Rt
0c90: 72 65 65 4e 6f 64 65 20 52 74 72 65 65 4e 6f 64  reeNode RtreeNod
0ca0: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
0cb0: 74 20 52 74 72 65 65 43 65 6c 6c 20 52 74 72 65  t RtreeCell Rtre
0cc0: 65 43 65 6c 6c 3b 0a 74 79 70 65 64 65 66 20 73  eCell;.typedef s
0cd0: 74 72 75 63 74 20 52 74 72 65 65 43 6f 6e 73 74  truct RtreeConst
0ce0: 72 61 69 6e 74 20 52 74 72 65 65 43 6f 6e 73 74  raint RtreeConst
0cf0: 72 61 69 6e 74 3b 0a 74 79 70 65 64 65 66 20 73  raint;.typedef s
0d00: 74 72 75 63 74 20 52 74 72 65 65 4d 61 74 63 68  truct RtreeMatch
0d10: 41 72 67 20 52 74 72 65 65 4d 61 74 63 68 41 72  Arg RtreeMatchAr
0d20: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
0d30: 74 20 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62  t RtreeGeomCallb
0d40: 61 63 6b 20 52 74 72 65 65 47 65 6f 6d 43 61 6c  ack RtreeGeomCal
0d50: 6c 62 61 63 6b 3b 0a 74 79 70 65 64 65 66 20 75  lback;.typedef u
0d60: 6e 69 6f 6e 20 52 74 72 65 65 43 6f 6f 72 64 20  nion RtreeCoord 
0d70: 52 74 72 65 65 43 6f 6f 72 64 3b 0a 74 79 70 65  RtreeCoord;.type
0d80: 64 65 66 20 73 74 72 75 63 74 20 52 74 72 65 65  def struct Rtree
0d90: 53 65 61 72 63 68 50 6f 69 6e 74 20 52 74 72 65  SearchPoint Rtre
0da0: 65 53 65 61 72 63 68 50 6f 69 6e 74 3b 0a 0a 2f  eSearchPoint;../
0db0: 2a 20 54 68 65 20 72 74 72 65 65 20 6d 61 79 20  * The rtree may 
0dc0: 68 61 76 65 20 62 65 74 77 65 65 6e 20 31 20 61  have between 1 a
0dd0: 6e 64 20 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d  nd RTREE_MAX_DIM
0de0: 45 4e 53 49 4f 4e 53 20 64 69 6d 65 6e 73 69 6f  ENSIONS dimensio
0df0: 6e 73 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52  ns. */.#define R
0e00: 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49  TREE_MAX_DIMENSI
0e10: 4f 4e 53 20 35 0a 0a 2f 2a 20 4d 61 78 69 6d 75  ONS 5../* Maximu
0e20: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 75 78 69  m number of auxi
0e30: 6c 69 61 72 79 20 63 6f 6c 75 6d 6e 73 20 2a 2f  liary columns */
0e40: 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4d  .#define RTREE_M
0e50: 41 58 5f 41 55 58 5f 43 4f 4c 55 4d 4e 20 31 30  AX_AUX_COLUMN 10
0e60: 30 0a 0a 2f 2a 20 53 69 7a 65 20 6f 66 20 68 61  0../* Size of ha
0e70: 73 68 20 74 61 62 6c 65 20 52 74 72 65 65 2e 61  sh table Rtree.a
0e80: 48 61 73 68 2e 20 54 68 69 73 20 68 61 73 68 20  Hash. This hash 
0e90: 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 65 78 70  table is not exp
0ea0: 65 63 74 65 64 20 74 6f 0a 2a 2a 20 65 76 65 72  ected to.** ever
0eb0: 20 63 6f 6e 74 61 69 6e 20 76 65 72 79 20 6d 61   contain very ma
0ec0: 6e 79 20 65 6e 74 72 69 65 73 2c 20 73 6f 20 61  ny entries, so a
0ed0: 20 66 69 78 65 64 20 6e 75 6d 62 65 72 20 6f 66   fixed number of
0ee0: 20 62 75 63 6b 65 74 73 20 69 73 20 0a 2a 2a 20   buckets is .** 
0ef0: 75 73 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  used..*/.#define
0f00: 20 48 41 53 48 53 49 5a 45 20 39 37 0a 0a 2f 2a   HASHSIZE 97../*
0f10: 20 54 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   The xBestIndex 
0f20: 6d 65 74 68 6f 64 20 6f 66 20 74 68 69 73 20 76  method of this v
0f30: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 72 65 71  irtual table req
0f40: 75 69 72 65 73 20 61 6e 20 65 73 74 69 6d 61 74  uires an estimat
0f50: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  e of.** the numb
0f60: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
0f70: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
0f80: 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65  to calculate the
0f90: 20 63 6f 73 74 73 20 6f 66 0a 2a 2a 20 76 61 72   costs of.** var
0fa0: 69 6f 75 73 20 73 74 72 61 74 65 67 69 65 73 2e  ious strategies.
0fb0: 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   If possible, th
0fc0: 69 73 20 65 73 74 69 6d 61 74 65 20 69 73 20 6c  is estimate is l
0fd0: 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  oaded from the.*
0fe0: 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  * sqlite_stat1 t
0ff0: 61 62 6c 65 20 28 77 69 74 68 20 52 54 52 45 45  able (with RTREE
1000: 5f 4d 49 4e 5f 52 4f 57 45 53 54 20 61 73 20 61  _MIN_ROWEST as a
1010: 20 68 61 72 64 2d 63 6f 64 65 64 20 6d 69 6e 69   hard-coded mini
1020: 6d 75 6d 29 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  mum)..** Otherwi
1030: 73 65 2c 20 69 66 20 6e 6f 20 73 71 6c 69 74 65  se, if no sqlite
1040: 5f 73 74 61 74 31 20 65 6e 74 72 79 20 69 73 20  _stat1 entry is 
1050: 61 76 61 69 6c 61 62 6c 65 2c 20 75 73 65 20 0a  available, use .
1060: 2a 2a 20 52 54 52 45 45 5f 44 45 46 41 55 4c 54  ** RTREE_DEFAULT
1070: 5f 52 4f 57 45 53 54 2e 0a 2a 2f 0a 23 64 65 66  _ROWEST..*/.#def
1080: 69 6e 65 20 52 54 52 45 45 5f 44 45 46 41 55 4c  ine RTREE_DEFAUL
1090: 54 5f 52 4f 57 45 53 54 20 31 30 34 38 35 37 36  T_ROWEST 1048576
10a0: 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4d  .#define RTREE_M
10b0: 49 4e 5f 52 4f 57 45 53 54 20 20 20 20 20 20 20  IN_ROWEST       
10c0: 20 20 31 30 30 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e    100../* .** An
10d0: 20 72 74 72 65 65 20 76 69 72 74 75 61 6c 2d 74   rtree virtual-t
10e0: 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  able object..*/.
10f0: 73 74 72 75 63 74 20 52 74 72 65 65 20 7b 0a 20  struct Rtree {. 
1100: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61   sqlite3_vtab ba
1110: 73 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se;          /* 
1120: 42 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73  Base class.  Mus
1130: 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  t be first */.  
1140: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
1150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
1160: 6f 73 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ost database con
1170: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
1180: 20 69 4e 6f 64 65 53 69 7a 65 3b 20 20 20 20 20   iNodeSize;     
1190: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
11a0: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
11b0: 68 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 6e 6f  h node in the no
11c0: 64 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 38  de table */.  u8
11d0: 20 6e 44 69 6d 3b 20 20 20 20 20 20 20 20 20 20   nDim;          
11e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11f0: 62 65 72 20 6f 66 20 64 69 6d 65 6e 73 69 6f 6e  ber of dimension
1200: 73 20 2a 2f 0a 20 20 75 38 20 6e 44 69 6d 32 3b  s */.  u8 nDim2;
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 20 2f 2a 20 54 77 69 63 65 20 74 68 65 20     /* Twice the 
1230: 6e 75 6d 62 65 72 20 6f 66 20 64 69 6d 65 6e 73  number of dimens
1240: 69 6f 6e 73 20 2a 2f 0a 20 20 75 38 20 65 43 6f  ions */.  u8 eCo
1250: 6f 72 64 54 79 70 65 3b 20 20 20 20 20 20 20 20  ordType;        
1260: 20 20 20 20 20 20 2f 2a 20 52 54 52 45 45 5f 43        /* RTREE_C
1270: 4f 4f 52 44 5f 52 45 41 4c 33 32 20 6f 72 20 52  OORD_REAL32 or R
1280: 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32  TREE_COORD_INT32
1290: 20 2a 2f 0a 20 20 75 38 20 6e 42 79 74 65 73 50   */.  u8 nBytesP
12a0: 65 72 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  erCell;         
12b0: 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 73 75    /* Bytes consu
12c0: 6d 65 64 20 70 65 72 20 63 65 6c 6c 20 2a 2f 0a  med per cell */.
12d0: 20 20 75 38 20 69 6e 57 72 54 72 61 6e 73 3b 20    u8 inWrTrans; 
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12f0: 20 54 72 75 65 20 69 66 20 69 6e 73 69 64 65 20   True if inside 
1300: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1310: 6e 20 2a 2f 0a 20 20 75 38 20 6e 41 75 78 3b 20  n */.  u8 nAux; 
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 20 20 20 2f 2a 20 23 20 6f 66 20 61 75 78 69 6c     /* # of auxil
1340: 69 61 72 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  iary columns in 
1350: 25 5f 72 6f 77 69 64 20 2a 2f 0a 20 20 75 38 20  %_rowid */.  u8 
1360: 6e 41 75 78 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20  nAuxNotNull;    
1370: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1380: 65 72 20 6f 66 20 69 6e 69 74 69 61 6c 20 6e 6f  er of initial no
1390: 74 2d 6e 75 6c 6c 20 61 75 78 20 63 6f 6c 75 6d  t-null aux colum
13a0: 6e 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ns */.#ifdef SQL
13b0: 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 62  ITE_DEBUG.  u8 b
13c0: 43 6f 72 72 75 70 74 3b 20 20 20 20 20 20 20 20  Corrupt;        
13d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 64 6f          /* Shado
13e0: 77 20 74 61 62 6c 65 20 63 6f 72 72 75 70 74 69  w table corrupti
13f0: 6f 6e 20 64 65 74 65 63 74 65 64 20 2a 2f 0a 23  on detected */.#
1400: 65 6e 64 69 66 0a 20 20 69 6e 74 20 69 44 65 70  endif.  int iDep
1410: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1420: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 64      /* Current d
1430: 65 70 74 68 20 6f 66 20 74 68 65 20 72 2d 74 72  epth of the r-tr
1440: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
1450: 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20    char *zDb;    
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1470: 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73   Name of databas
1480: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 2d 74  e containing r-t
1490: 72 65 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  ree table */.  c
14a0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
14b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
14c0: 6d 65 20 6f 66 20 72 2d 74 72 65 65 20 74 61 62  me of r-tree tab
14d0: 6c 65 20 2a 2f 20 0a 20 20 75 33 32 20 6e 42 75  le */ .  u32 nBu
14e0: 73 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sy;             
14f0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1500: 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20  number of users 
1510: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
1520: 65 20 2a 2f 0a 20 20 69 36 34 20 6e 52 6f 77 45  e */.  i64 nRowE
1530: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1540: 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
1550: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1560: 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  n this table */.
1570: 20 20 75 33 32 20 6e 43 75 72 73 6f 72 3b 20 20    u32 nCursor;  
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1590: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 65 6e 20   Number of open 
15a0: 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 75 33 32  cursors */.  u32
15b0: 20 6e 4e 6f 64 65 52 65 66 3b 20 20 20 20 20 20   nNodeRef;      
15c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15d0: 65 72 20 52 74 72 65 65 4e 6f 64 65 73 20 77 69  er RtreeNodes wi
15e0: 74 68 20 70 6f 73 69 74 69 76 65 20 6e 52 65 66  th positive nRef
15f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65 61   */.  char *zRea
1600: 64 41 75 78 53 71 6c 3b 20 20 20 20 20 20 20 20  dAuxSql;        
1610: 20 20 2f 2a 20 53 51 4c 20 66 6f 72 20 73 74 61    /* SQL for sta
1620: 74 65 6d 65 6e 74 20 74 6f 20 72 65 61 64 20 61  tement to read a
1630: 75 78 20 64 61 74 61 20 2a 2f 0a 0a 20 20 2f 2a  ux data */..  /*
1640: 20 4c 69 73 74 20 6f 66 20 6e 6f 64 65 73 20 72   List of nodes r
1650: 65 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 20  emoved during a 
1660: 43 6f 6e 64 65 6e 73 65 54 72 65 65 20 6f 70 65  CondenseTree ope
1670: 72 61 74 69 6f 6e 2e 20 4c 69 73 74 20 69 73 0a  ration. List is.
1680: 20 20 2a 2a 20 6c 69 6e 6b 65 64 20 74 6f 67 65    ** linked toge
1690: 74 68 65 72 20 76 69 61 20 74 68 65 20 70 6f 69  ther via the poi
16a0: 6e 74 65 72 20 6e 6f 72 6d 61 6c 6c 79 20 75 73  nter normally us
16b0: 65 64 20 66 6f 72 20 68 61 73 68 20 63 68 61 69  ed for hash chai
16c0: 6e 73 20 2d 0a 20 20 2a 2a 20 52 74 72 65 65 4e  ns -.  ** RtreeN
16d0: 6f 64 65 2e 70 4e 65 78 74 2e 20 52 74 72 65 65  ode.pNext. Rtree
16e0: 4e 6f 64 65 2e 69 4e 6f 64 65 20 73 74 6f 72 65  Node.iNode store
16f0: 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74  s the depth of t
1700: 68 65 20 73 75 62 2d 74 72 65 65 20 0a 20 20 2a  he sub-tree .  *
1710: 2a 20 68 65 61 64 65 64 20 62 79 20 74 68 65 20  * headed by the 
1720: 6e 6f 64 65 20 28 6c 65 61 66 20 6e 6f 64 65 73  node (leaf nodes
1730: 20 68 61 76 65 20 52 74 72 65 65 4e 6f 64 65 2e   have RtreeNode.
1740: 69 4e 6f 64 65 3d 3d 30 29 2e 0a 20 20 2a 2f 0a  iNode==0)..  */.
1750: 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 44 65    RtreeNode *pDe
1760: 6c 65 74 65 64 3b 0a 20 20 69 6e 74 20 69 52 65  leted;.  int iRe
1770: 69 6e 73 65 72 74 48 65 69 67 68 74 3b 20 20 20  insertHeight;   
1780: 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f       /* Height o
1790: 66 20 73 75 62 2d 74 72 65 65 73 20 52 65 69 6e  f sub-trees Rein
17a0: 73 65 72 74 28 29 20 68 61 73 20 72 75 6e 20 6f  sert() has run o
17b0: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 42 6c 6f 62 20  n */..  /* Blob 
17c0: 49 2f 4f 20 6f 6e 20 78 78 78 5f 6e 6f 64 65 20  I/O on xxx_node 
17d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  */.  sqlite3_blo
17e0: 62 20 2a 70 4e 6f 64 65 42 6c 6f 62 3b 0a 0a 20  b *pNodeBlob;.. 
17f0: 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73 20 74   /* Statements t
1800: 6f 20 72 65 61 64 2f 77 72 69 74 65 2f 64 65 6c  o read/write/del
1810: 65 74 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f  ete a record fro
1820: 6d 20 78 78 78 5f 6e 6f 64 65 20 2a 2f 0a 20 20  m xxx_node */.  
1830: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57  sqlite3_stmt *pW
1840: 72 69 74 65 4e 6f 64 65 3b 0a 20 20 73 71 6c 69  riteNode;.  sqli
1850: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
1860: 65 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 53 74 61  eNode;..  /* Sta
1870: 74 65 6d 65 6e 74 73 20 74 6f 20 72 65 61 64 2f  tements to read/
1880: 77 72 69 74 65 2f 64 65 6c 65 74 65 20 61 20 72  write/delete a r
1890: 65 63 6f 72 64 20 66 72 6f 6d 20 78 78 78 5f 72  ecord from xxx_r
18a0: 6f 77 69 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  owid */.  sqlite
18b0: 33 5f 73 74 6d 74 20 2a 70 52 65 61 64 52 6f 77  3_stmt *pReadRow
18c0: 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  id;.  sqlite3_st
18d0: 6d 74 20 2a 70 57 72 69 74 65 52 6f 77 69 64 3b  mt *pWriteRowid;
18e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
18f0: 2a 70 44 65 6c 65 74 65 52 6f 77 69 64 3b 0a 0a  *pDeleteRowid;..
1900: 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73 20    /* Statements 
1910: 74 6f 20 72 65 61 64 2f 77 72 69 74 65 2f 64 65  to read/write/de
1920: 6c 65 74 65 20 61 20 72 65 63 6f 72 64 20 66 72  lete a record fr
1930: 6f 6d 20 78 78 78 5f 70 61 72 65 6e 74 20 2a 2f  om xxx_parent */
1940: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1950: 2a 70 52 65 61 64 50 61 72 65 6e 74 3b 0a 20 20  *pReadParent;.  
1960: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57  sqlite3_stmt *pW
1970: 72 69 74 65 50 61 72 65 6e 74 3b 0a 20 20 73 71  riteParent;.  sq
1980: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
1990: 65 74 65 50 61 72 65 6e 74 3b 0a 0a 20 20 2f 2a  eteParent;..  /*
19a0: 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 77   Statement for w
19b0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 22 61  riting to the "a
19c0: 75 78 3a 22 20 66 69 65 6c 64 73 2c 20 69 66 20  ux:" fields, if 
19d0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 2a 2f  there are any */
19e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
19f0: 2a 70 57 72 69 74 65 41 75 78 3b 0a 0a 20 20 52  *pWriteAux;..  R
1a00: 74 72 65 65 4e 6f 64 65 20 2a 61 48 61 73 68 5b  treeNode *aHash[
1a10: 48 41 53 48 53 49 5a 45 5d 3b 20 2f 2a 20 48 61  HASHSIZE]; /* Ha
1a20: 73 68 20 74 61 62 6c 65 20 6f 66 20 69 6e 2d 6d  sh table of in-m
1a30: 65 6d 6f 72 79 20 6e 6f 64 65 73 2e 20 2a 2f 20  emory nodes. */ 
1a40: 0a 7d 3b 0a 0a 2f 2a 20 50 6f 73 73 69 62 6c 65  .};../* Possible
1a50: 20 76 61 6c 75 65 73 20 66 6f 72 20 52 74 72 65   values for Rtre
1a60: 65 2e 65 43 6f 6f 72 64 54 79 70 65 3a 20 2a 2f  e.eCoordType: */
1a70: 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 43  .#define RTREE_C
1a80: 4f 4f 52 44 5f 52 45 41 4c 33 32 20 30 0a 23 64  OORD_REAL32 0.#d
1a90: 65 66 69 6e 65 20 52 54 52 45 45 5f 43 4f 4f 52  efine RTREE_COOR
1aa0: 44 5f 49 4e 54 33 32 20 20 31 0a 0a 2f 2a 0a 2a  D_INT32  1../*.*
1ab0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 52 54 52 45  * If SQLITE_RTRE
1ac0: 45 5f 49 4e 54 5f 4f 4e 4c 59 20 69 73 20 64 65  E_INT_ONLY is de
1ad0: 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 69 73  fined, then this
1ae0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77   virtual table w
1af0: 69 6c 6c 0a 2a 2a 20 6f 6e 6c 79 20 64 65 61 6c  ill.** only deal
1b00: 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 63 6f   with integer co
1b10: 6f 72 64 69 6e 61 74 65 73 2e 20 20 4e 6f 20 66  ordinates.  No f
1b20: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6f 70  loating point op
1b30: 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 77 69 6c 6c  erations.** will
1b40: 20 62 65 20 64 6f 6e 65 2e 0a 2a 2f 0a 23 69 66   be done..*/.#if
1b50: 64 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45  def SQLITE_RTREE
1b60: 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 74 79 70 65  _INT_ONLY.  type
1b70: 64 65 66 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  def sqlite3_int6
1b80: 34 20 52 74 72 65 65 44 56 61 6c 75 65 3b 20 20  4 RtreeDValue;  
1b90: 20 20 20 20 20 2f 2a 20 48 69 67 68 20 61 63 63       /* High acc
1ba0: 75 72 61 63 79 20 63 6f 6f 72 64 69 6e 61 74 65  uracy coordinate
1bb0: 20 2a 2f 0a 20 20 74 79 70 65 64 65 66 20 69 6e   */.  typedef in
1bc0: 74 20 52 74 72 65 65 56 61 6c 75 65 3b 20 20 20  t RtreeValue;   
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1be0: 2a 20 4c 6f 77 20 61 63 63 75 72 61 63 79 20 63  * Low accuracy c
1bf0: 6f 6f 72 64 69 6e 61 74 65 20 2a 2f 0a 23 20 64  oordinate */.# d
1c00: 65 66 69 6e 65 20 52 54 52 45 45 5f 5a 45 52 4f  efine RTREE_ZERO
1c10: 20 30 0a 23 65 6c 73 65 0a 20 20 74 79 70 65 64   0.#else.  typed
1c20: 65 66 20 64 6f 75 62 6c 65 20 52 74 72 65 65 44  ef double RtreeD
1c30: 56 61 6c 75 65 3b 20 20 20 20 20 20 20 20 20 20  Value;          
1c40: 20 20 20 20 2f 2a 20 48 69 67 68 20 61 63 63 75      /* High accu
1c50: 72 61 63 79 20 63 6f 6f 72 64 69 6e 61 74 65 20  racy coordinate 
1c60: 2a 2f 0a 20 20 74 79 70 65 64 65 66 20 66 6c 6f  */.  typedef flo
1c70: 61 74 20 52 74 72 65 65 56 61 6c 75 65 3b 20 20  at RtreeValue;  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c90: 20 4c 6f 77 20 61 63 63 75 72 61 63 79 20 63 6f   Low accuracy co
1ca0: 6f 72 64 69 6e 61 74 65 20 2a 2f 0a 23 20 64 65  ordinate */.# de
1cb0: 66 69 6e 65 20 52 54 52 45 45 5f 5a 45 52 4f 20  fine RTREE_ZERO 
1cc0: 30 2e 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  0.0.#endif../*.*
1cd0: 2a 20 53 65 74 20 74 68 65 20 52 74 72 65 65 2e  * Set the Rtree.
1ce0: 62 43 6f 72 72 75 70 74 20 66 6c 61 67 0a 2a 2f  bCorrupt flag.*/
1cf0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1d00: 45 42 55 47 0a 23 20 64 65 66 69 6e 65 20 52 54  EBUG.# define RT
1d10: 52 45 45 5f 49 53 5f 43 4f 52 52 55 50 54 28 58  REE_IS_CORRUPT(X
1d20: 29 20 28 28 58 29 2d 3e 62 43 6f 72 72 75 70 74  ) ((X)->bCorrupt
1d30: 20 3d 20 31 29 0a 23 65 6c 73 65 0a 23 20 64 65   = 1).#else.# de
1d40: 66 69 6e 65 20 52 54 52 45 45 5f 49 53 5f 43 4f  fine RTREE_IS_CO
1d50: 52 52 55 50 54 28 58 29 0a 23 65 6e 64 69 66 0a  RRUPT(X).#endif.
1d60: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e  ./*.** When doin
1d70: 67 20 61 20 73 65 61 72 63 68 20 6f 66 20 61 6e  g a search of an
1d80: 20 72 2d 74 72 65 65 2c 20 69 6e 73 74 61 6e 63   r-tree, instanc
1d90: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
1da0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  ing structure.**
1db0: 20 72 65 63 6f 72 64 20 69 6e 74 65 72 6d 65 64   record intermed
1dc0: 69 61 74 65 20 72 65 73 75 6c 74 73 20 66 72 6f  iate results fro
1dd0: 6d 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e  m the tree walk.
1de0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 64 20 69 73  .**.** The id is
1df0: 20 61 6c 77 61 79 73 20 61 20 6e 6f 64 65 2d 69   always a node-i
1e00: 64 2e 20 20 46 6f 72 20 69 4c 65 76 65 6c 3e 3d  d.  For iLevel>=
1e10: 31 20 74 68 65 20 69 64 20 69 73 20 74 68 65 20  1 the id is the 
1e20: 6e 6f 64 65 2d 69 64 20 6f 66 0a 2a 2a 20 74 68  node-id of.** th
1e30: 65 20 6e 6f 64 65 20 74 68 61 74 20 74 68 65 20  e node that the 
1e40: 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  RtreeSearchPoint
1e50: 20 72 65 70 72 65 73 65 6e 74 73 2e 20 20 57 68   represents.  Wh
1e60: 65 6e 20 69 4c 65 76 65 6c 3d 3d 30 2c 20 68 6f  en iLevel==0, ho
1e70: 77 65 76 65 72 2c 0a 2a 2a 20 74 68 65 20 69 64  wever,.** the id
1e80: 20 69 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e   is of the paren
1e90: 74 20 6e 6f 64 65 20 61 6e 64 20 74 68 65 20 63  t node and the c
1ea0: 65 6c 6c 20 74 68 61 74 20 52 74 72 65 65 53 65  ell that RtreeSe
1eb0: 61 72 63 68 50 6f 69 6e 74 0a 2a 2a 20 72 65 70  archPoint.** rep
1ec0: 72 65 73 65 6e 74 73 20 69 73 20 74 68 65 20 69  resents is the i
1ed0: 43 65 6c 6c 2d 74 68 20 65 6e 74 72 79 20 69 6e  Cell-th entry in
1ee0: 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65   the parent node
1ef0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74 72 65  ..*/.struct Rtre
1f00: 65 53 65 61 72 63 68 50 6f 69 6e 74 20 7b 0a 20  eSearchPoint {. 
1f10: 20 52 74 72 65 65 44 56 61 6c 75 65 20 72 53 63   RtreeDValue rSc
1f20: 6f 72 65 3b 20 20 20 20 2f 2a 20 54 68 65 20 73  ore;    /* The s
1f30: 63 6f 72 65 20 66 6f 72 20 74 68 69 73 20 6e 6f  core for this no
1f40: 64 65 2e 20 20 53 6d 61 6c 6c 65 73 74 20 67 6f  de.  Smallest go
1f50: 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 73  es first. */.  s
1f60: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 64 3b  qlite3_int64 id;
1f70: 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 49 44        /* Node ID
1f80: 20 2a 2f 0a 20 20 75 38 20 69 4c 65 76 65 6c 3b   */.  u8 iLevel;
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa0: 30 3d 65 6e 74 72 69 65 73 2e 20 20 31 3d 6c 65  0=entries.  1=le
1fb0: 61 66 20 6e 6f 64 65 2e 20 20 32 2b 20 66 6f 72  af node.  2+ for
1fc0: 20 68 69 67 68 65 72 20 2a 2f 0a 20 20 75 38 20   higher */.  u8 
1fd0: 65 57 69 74 68 69 6e 3b 20 20 20 20 20 20 20 20  eWithin;        
1fe0: 20 20 20 20 2f 2a 20 50 41 52 54 4c 59 5f 57 49      /* PARTLY_WI
1ff0: 54 48 49 4e 20 6f 72 20 46 55 4c 4c 59 5f 57 49  THIN or FULLY_WI
2000: 54 48 49 4e 20 2a 2f 0a 20 20 75 38 20 69 43 65  THIN */.  u8 iCe
2010: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2020: 20 2f 2a 20 43 65 6c 6c 20 69 6e 64 65 78 20 77   /* Cell index w
2030: 69 74 68 69 6e 20 74 68 65 20 6e 6f 64 65 20 2a  ithin the node *
2040: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
2050: 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  minimum number o
2060: 66 20 63 65 6c 6c 73 20 61 6c 6c 6f 77 65 64 20  f cells allowed 
2070: 66 6f 72 20 61 20 6e 6f 64 65 20 69 73 20 61 20  for a node is a 
2080: 74 68 69 72 64 20 6f 66 20 74 68 65 20 0a 2a 2a  third of the .**
2090: 20 6d 61 78 69 6d 75 6d 2e 20 49 6e 20 47 75 74   maximum. In Gut
20a0: 6d 61 6e 27 73 20 6e 6f 74 61 74 69 6f 6e 3a 0a  man's notation:.
20b0: 2a 2a 0a 2a 2a 20 20 20 20 20 6d 20 3d 20 4d 2f  **.**     m = M/
20c0: 33 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 52 2a  3.**.** If an R*
20d0: 2d 74 72 65 65 20 22 52 65 69 6e 73 65 72 74 22  -tree "Reinsert"
20e0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 72 65   operation is re
20f0: 71 75 69 72 65 64 2c 20 74 68 65 20 73 61 6d 65  quired, the same
2100: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
2110: 6c 6c 73 20 61 72 65 20 72 65 6d 6f 76 65 64 20  lls are removed 
2120: 66 72 6f 6d 20 74 68 65 20 6f 76 65 72 66 75 6c  from the overful
2130: 6c 20 6e 6f 64 65 20 61 6e 64 20 72 65 69 6e 73  l node and reins
2140: 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 74  erted into the t
2150: 72 65 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ree..*/.#define 
2160: 52 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70  RTREE_MINCELLS(p
2170: 29 20 28 28 28 28 70 29 2d 3e 69 4e 6f 64 65 53  ) ((((p)->iNodeS
2180: 69 7a 65 2d 34 29 2f 28 70 29 2d 3e 6e 42 79 74  ize-4)/(p)->nByt
2190: 65 73 50 65 72 43 65 6c 6c 29 2f 33 29 0a 23 64  esPerCell)/3).#d
21a0: 65 66 69 6e 65 20 52 54 52 45 45 5f 52 45 49 4e  efine RTREE_REIN
21b0: 53 45 52 54 28 70 29 20 52 54 52 45 45 5f 4d 49  SERT(p) RTREE_MI
21c0: 4e 43 45 4c 4c 53 28 70 29 0a 23 64 65 66 69 6e  NCELLS(p).#defin
21d0: 65 20 52 54 52 45 45 5f 4d 41 58 43 45 4c 4c 53  e RTREE_MAXCELLS
21e0: 20 35 31 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73   51../*.** The s
21f0: 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  mallest possible
2200: 20 6e 6f 64 65 2d 73 69 7a 65 20 69 73 20 28 35   node-size is (5
2210: 31 32 2d 36 34 29 3d 3d 34 34 38 20 62 79 74 65  12-64)==448 byte
2220: 73 2e 20 41 6e 64 20 74 68 65 20 6c 61 72 67 65  s. And the large
2230: 73 74 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20  st.** supported 
2240: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 38 20  cell size is 48 
2250: 62 79 74 65 73 20 28 38 20 62 79 74 65 20 72 6f  bytes (8 byte ro
2260: 77 69 64 20 2b 20 74 65 6e 20 34 20 62 79 74 65  wid + ten 4 byte
2270: 20 63 6f 6f 72 64 69 6e 61 74 65 73 29 2e 0a 2a   coordinates)..*
2280: 2a 20 54 68 65 72 65 66 6f 72 65 20 61 6c 6c 20  * Therefore all 
2290: 6e 6f 6e 2d 72 6f 6f 74 20 6e 6f 64 65 73 20 6d  non-root nodes m
22a0: 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c  ust contain at l
22b0: 65 61 73 74 20 33 20 65 6e 74 72 69 65 73 2e 20  east 3 entries. 
22c0: 53 69 6e 63 65 20 0a 2a 2a 20 33 5e 34 30 20 69  Since .** 3^40 i
22d0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 32  s greater than 2
22e0: 5e 36 34 2c 20 61 6e 20 72 2d 74 72 65 65 20 73  ^64, an r-tree s
22f0: 74 72 75 63 74 75 72 65 20 61 6c 77 61 79 73 20  tructure always 
2300: 68 61 73 20 61 20 64 65 70 74 68 20 6f 66 0a 2a  has a depth of.*
2310: 2a 20 34 30 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f  * 40 or less..*/
2320: 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4d  .#define RTREE_M
2330: 41 58 5f 44 45 50 54 48 20 34 30 0a 0a 0a 2f 2a  AX_DEPTH 40.../*
2340: 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e  .** Number of en
2350: 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 75 72  tries in the cur
2360: 73 6f 72 20 52 74 72 65 65 4e 6f 64 65 20 63 61  sor RtreeNode ca
2370: 63 68 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  che.  The first 
2380: 65 6e 74 72 79 20 69 73 0a 2a 2a 20 75 73 65 64  entry is.** used
2390: 20 74 6f 20 63 61 63 68 65 20 74 68 65 20 52 74   to cache the Rt
23a0: 72 65 65 4e 6f 64 65 20 66 6f 72 20 52 74 72 65  reeNode for Rtre
23b0: 65 43 75 72 73 6f 72 2e 73 50 6f 69 6e 74 2e 20  eCursor.sPoint. 
23c0: 20 54 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 2a   The remaining.*
23d0: 2a 20 65 6e 74 72 69 65 73 20 63 61 63 68 65 20  * entries cache 
23e0: 74 68 65 20 52 74 72 65 65 4e 6f 64 65 20 66 6f  the RtreeNode fo
23f0: 72 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d  r the first elem
2400: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 72 69 6f  ents of the prio
2410: 72 69 74 79 20 71 75 65 75 65 2e 0a 2a 2f 0a 23  rity queue..*/.#
2420: 64 65 66 69 6e 65 20 52 54 52 45 45 5f 43 41 43  define RTREE_CAC
2430: 48 45 5f 53 5a 20 20 35 0a 0a 2f 2a 20 0a 2a 2a  HE_SZ  5../* .**
2440: 20 41 6e 20 72 74 72 65 65 20 63 75 72 73 6f 72   An rtree cursor
2450: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75   object..*/.stru
2460: 63 74 20 52 74 72 65 65 43 75 72 73 6f 72 20 7b  ct RtreeCursor {
2470: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
2480: 63 75 72 73 6f 72 20 62 61 73 65 3b 20 20 20 20  cursor base;    
2490: 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61       /* Base cla
24a0: 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72  ss.  Must be fir
24b0: 73 74 20 2a 2f 0a 20 20 75 38 20 61 74 45 4f 46  st */.  u8 atEOF
24c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
24e0: 65 20 69 66 20 61 74 20 65 6e 64 20 6f 66 20 73  e if at end of s
24f0: 65 61 72 63 68 20 2a 2f 0a 20 20 75 38 20 62 50  earch */.  u8 bP
2500: 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  oint;           
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2520: 54 72 75 65 20 69 66 20 73 50 6f 69 6e 74 20 69  True if sPoint i
2530: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20  s valid */.  u8 
2540: 62 41 75 78 56 61 6c 69 64 3b 20 20 20 20 20 20  bAuxValid;      
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2560: 2a 20 54 72 75 65 20 69 66 20 70 52 65 61 64 41  * True if pReadA
2570: 75 78 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ux is valid */. 
2580: 20 69 6e 74 20 69 53 74 72 61 74 65 67 79 3b 20   int iStrategy; 
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 64     /* Copy of id
25b0: 78 4e 75 6d 20 73 65 61 72 63 68 20 70 61 72 61  xNum search para
25c0: 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  meter */.  int n
25d0: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20  Constraint;     
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25f0: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
2600: 73 20 69 6e 20 61 43 6f 6e 73 74 72 61 69 6e 74  s in aConstraint
2610: 20 2a 2f 0a 20 20 52 74 72 65 65 43 6f 6e 73 74   */.  RtreeConst
2620: 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69  raint *aConstrai
2630: 6e 74 3b 20 20 20 20 20 2f 2a 20 53 65 61 72 63  nt;     /* Searc
2640: 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 2a  h constraints. *
2650: 2f 0a 20 20 69 6e 74 20 6e 50 6f 69 6e 74 41 6c  /.  int nPointAl
2660: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
2670: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2680: 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f 63 61 74  of slots allocat
2690: 65 64 20 66 6f 72 20 61 50 6f 69 6e 74 5b 5d 20  ed for aPoint[] 
26a0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 69 6e 74 3b  */.  int nPoint;
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26d0: 20 6f 66 20 73 6c 6f 74 73 20 75 73 65 64 20 69   of slots used i
26e0: 6e 20 61 50 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  n aPoint[] */.  
26f0: 69 6e 74 20 6d 78 4c 65 76 65 6c 3b 20 20 20 20  int mxLevel;    
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 2f 2a 20 69 4c 65 76 65 6c 20 76 61 6c 75    /* iLevel valu
2720: 65 20 66 6f 72 20 72 6f 6f 74 20 6f 66 20 74 68  e for root of th
2730: 65 20 74 72 65 65 20 2a 2f 0a 20 20 52 74 72 65  e tree */.  Rtre
2740: 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 61 50  eSearchPoint *aP
2750: 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  oint;         /*
2760: 20 50 72 69 6f 72 69 74 79 20 71 75 65 75 65 20   Priority queue 
2770: 66 6f 72 20 73 65 61 72 63 68 20 70 6f 69 6e 74  for search point
2780: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  s */.  sqlite3_s
2790: 74 6d 74 20 2a 70 52 65 61 64 41 75 78 3b 20 20  tmt *pReadAux;  
27a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
27b0: 65 6d 65 6e 74 20 74 6f 20 72 65 61 64 20 61 75  ement to read au
27c0: 78 2d 64 61 74 61 20 2a 2f 0a 20 20 52 74 72 65  x-data */.  Rtre
27d0: 65 53 65 61 72 63 68 50 6f 69 6e 74 20 73 50 6f  eSearchPoint sPo
27e0: 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  int;          /*
27f0: 20 43 61 63 68 65 64 20 6e 65 78 74 20 73 65 61   Cached next sea
2800: 72 63 68 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 52  rch point */.  R
2810: 74 72 65 65 4e 6f 64 65 20 2a 61 4e 6f 64 65 5b  treeNode *aNode[
2820: 52 54 52 45 45 5f 43 41 43 48 45 5f 53 5a 5d 3b  RTREE_CACHE_SZ];
2830: 20 2f 2a 20 52 74 72 65 65 20 6e 6f 64 65 20 63   /* Rtree node c
2840: 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 61 6e  ache */.  u32 an
2850: 51 75 65 75 65 5b 52 54 52 45 45 5f 4d 41 58 5f  Queue[RTREE_MAX_
2860: 44 45 50 54 48 2b 31 5d 3b 20 20 20 2f 2a 20 4e  DEPTH+1];   /* N
2870: 75 6d 62 65 72 20 6f 66 20 71 75 65 75 65 64 20  umber of queued 
2880: 65 6e 74 72 69 65 73 20 62 79 20 69 4c 65 76 65  entries by iLeve
2890: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75  l */.};../* Retu
28a0: 72 6e 20 74 68 65 20 52 74 72 65 65 20 6f 66 20  rn the Rtree of 
28b0: 61 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 2f  a RtreeCursor */
28c0: 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4f  .#define RTREE_O
28d0: 46 5f 43 55 52 53 4f 52 28 58 29 20 20 20 28 28  F_CURSOR(X)   ((
28e0: 52 74 72 65 65 2a 29 28 28 58 29 2d 3e 62 61 73  Rtree*)((X)->bas
28f0: 65 2e 70 56 74 61 62 29 29 0a 0a 2f 2a 0a 2a 2a  e.pVtab))../*.**
2900: 20 41 20 63 6f 6f 72 64 69 6e 61 74 65 20 63 61   A coordinate ca
2910: 6e 20 62 65 20 65 69 74 68 65 72 20 61 20 66 6c  n be either a fl
2920: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d  oating point num
2930: 62 65 72 20 6f 72 20 61 20 69 6e 74 65 67 65 72  ber or a integer
2940: 2e 20 20 41 6c 6c 0a 2a 2a 20 63 6f 6f 72 64 69  .  All.** coordi
2950: 6e 61 74 65 73 20 77 69 74 68 69 6e 20 61 20 73  nates within a s
2960: 69 6e 67 6c 65 20 52 2d 54 72 65 65 20 61 72 65  ingle R-Tree are
2970: 20 61 6c 77 61 79 73 20 6f 66 20 74 68 65 20 73   always of the s
2980: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a 75 6e 69  ame time..*/.uni
2990: 6f 6e 20 52 74 72 65 65 43 6f 6f 72 64 20 7b 0a  on RtreeCoord {.
29a0: 20 20 52 74 72 65 65 56 61 6c 75 65 20 66 3b 20    RtreeValue f; 
29b0: 20 20 20 20 20 2f 2a 20 46 6c 6f 61 74 69 6e 67       /* Floating
29c0: 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a   point value */.
29d0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
29e0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
29f0: 76 61 6c 75 65 20 2a 2f 0a 20 20 75 33 32 20 75  value */.  u32 u
2a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2a10: 20 55 6e 73 69 67 6e 65 64 20 66 6f 72 20 62 79   Unsigned for by
2a20: 74 65 2d 6f 72 64 65 72 20 63 6f 6e 76 65 72 73  te-order convers
2a30: 69 6f 6e 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ions */.};../*.*
2a40: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
2a50: 73 20 61 6e 20 52 74 72 65 65 43 6f 6f 72 64 2e  s an RtreeCoord.
2a60: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
2a70: 65 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  e stored within 
2a80: 74 68 65 20 52 74 72 65 65 43 6f 6f 72 64 0a 2a  the RtreeCoord.*
2a90: 2a 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 61  * formatted as a
2aa0: 20 52 74 72 65 65 44 56 61 6c 75 65 20 28 64 6f   RtreeDValue (do
2ab0: 75 62 6c 65 20 6f 72 20 69 6e 74 36 34 29 2e 20  uble or int64). 
2ac0: 54 68 69 73 20 6d 61 63 72 6f 20 61 73 73 75 6d  This macro assum
2ad0: 65 73 20 74 68 61 74 20 6c 6f 63 61 6c 0a 2a 2a  es that local.**
2ae0: 20 76 61 72 69 61 62 6c 65 20 70 52 74 72 65 65   variable pRtree
2af0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 52   points to the R
2b00: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
2b10: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2b20: 68 65 0a 2a 2a 20 52 74 72 65 65 43 6f 6f 72 64  he.** RtreeCoord
2b30: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2b40: 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c  TE_RTREE_INT_ONL
2b50: 59 0a 23 20 64 65 66 69 6e 65 20 44 43 4f 4f 52  Y.# define DCOOR
2b60: 44 28 63 6f 6f 72 64 29 20 28 28 52 74 72 65 65  D(coord) ((Rtree
2b70: 44 56 61 6c 75 65 29 63 6f 6f 72 64 2e 69 29 0a  DValue)coord.i).
2b80: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44  #else.# define D
2b90: 43 4f 4f 52 44 28 63 6f 6f 72 64 29 20 28 20 20  COORD(coord) (  
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 28           \.    (
2bc0: 70 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79  pRtree->eCoordTy
2bd0: 70 65 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44 5f  pe==RTREE_COORD_
2be0: 52 45 41 4c 33 32 29 20 3f 20 20 20 20 20 20 5c  REAL32) ?      \
2bf0: 0a 20 20 20 20 20 20 28 28 64 6f 75 62 6c 65 29  .      ((double)
2c00: 63 6f 6f 72 64 2e 66 29 20 3a 20 20 20 20 20 20  coord.f) :      
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 20 20 20 5c 0a 20 20 20 20 20 20 28 28 64       \.      ((d
2c30: 6f 75 62 6c 65 29 63 6f 6f 72 64 2e 69 29 20 20  ouble)coord.i)  
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 29             \.  )
2c60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
2c70: 20 73 65 61 72 63 68 20 63 6f 6e 73 74 72 61 69   search constrai
2c80: 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74  nt..*/.struct Rt
2c90: 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 7b 0a  reeConstraint {.
2ca0: 20 20 69 6e 74 20 69 43 6f 6f 72 64 3b 20 20 20    int iCoord;   
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2cd0: 6e 73 74 72 61 69 6e 65 64 20 63 6f 6f 72 64 69  nstrained coordi
2ce0: 6e 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  nate */.  int op
2cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2d10: 73 74 72 61 69 6e 69 6e 67 20 6f 70 65 72 61 74  straining operat
2d20: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b  ion */.  union {
2d30: 0a 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65  .    RtreeDValue
2d40: 20 72 56 61 6c 75 65 3b 20 20 20 20 20 20 20 20   rValue;        
2d50: 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69       /* Constrai
2d60: 6e 74 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  nt value. */.   
2d70: 20 69 6e 74 20 28 2a 78 47 65 6f 6d 29 28 73 71   int (*xGeom)(sq
2d80: 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d  lite3_rtree_geom
2d90: 65 74 72 79 2a 2c 69 6e 74 2c 52 74 72 65 65 44  etry*,int,RtreeD
2da0: 56 61 6c 75 65 2a 2c 69 6e 74 2a 29 3b 0a 20 20  Value*,int*);.  
2db0: 20 20 69 6e 74 20 28 2a 78 51 75 65 72 79 46 75    int (*xQueryFu
2dc0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 72 74 72 65  nc)(sqlite3_rtre
2dd0: 65 5f 71 75 65 72 79 5f 69 6e 66 6f 2a 29 3b 0a  e_query_info*);.
2de0: 20 20 7d 20 75 3b 0a 20 20 73 71 6c 69 74 65 33    } u;.  sqlite3
2df0: 5f 72 74 72 65 65 5f 71 75 65 72 79 5f 69 6e 66  _rtree_query_inf
2e00: 6f 20 2a 70 49 6e 66 6f 3b 20 20 2f 2a 20 78 47  o *pInfo;  /* xG
2e10: 65 6f 6d 20 61 6e 64 20 78 51 75 65 72 79 46 75  eom and xQueryFu
2e20: 6e 63 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 7d  nc argument */.}
2e30: 3b 0a 0a 2f 2a 20 50 6f 73 73 69 62 6c 65 20 76  ;../* Possible v
2e40: 61 6c 75 65 73 20 66 6f 72 20 52 74 72 65 65 43  alues for RtreeC
2e50: 6f 6e 73 74 72 61 69 6e 74 2e 6f 70 20 2a 2f 0a  onstraint.op */.
2e60: 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 45 51  #define RTREE_EQ
2e70: 20 20 20 20 30 78 34 31 20 20 2f 2a 20 41 20 2a      0x41  /* A *
2e80: 2f 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f  /.#define RTREE_
2e90: 4c 45 20 20 20 20 30 78 34 32 20 20 2f 2a 20 42  LE    0x42  /* B
2ea0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52 45   */.#define RTRE
2eb0: 45 5f 4c 54 20 20 20 20 30 78 34 33 20 20 2f 2a  E_LT    0x43  /*
2ec0: 20 43 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54   C */.#define RT
2ed0: 52 45 45 5f 47 45 20 20 20 20 30 78 34 34 20 20  REE_GE    0x44  
2ee0: 2f 2a 20 44 20 2a 2f 0a 23 64 65 66 69 6e 65 20  /* D */.#define 
2ef0: 52 54 52 45 45 5f 47 54 20 20 20 20 30 78 34 35  RTREE_GT    0x45
2f00: 20 20 2f 2a 20 45 20 2a 2f 0a 23 64 65 66 69 6e    /* E */.#defin
2f10: 65 20 52 54 52 45 45 5f 4d 41 54 43 48 20 30 78  e RTREE_MATCH 0x
2f20: 34 36 20 20 2f 2a 20 46 3a 20 4f 6c 64 2d 73 74  46  /* F: Old-st
2f30: 79 6c 65 20 73 71 6c 69 74 65 33 5f 72 74 72 65  yle sqlite3_rtre
2f40: 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62  e_geometry_callb
2f50: 61 63 6b 28 29 20 2a 2f 0a 23 64 65 66 69 6e 65  ack() */.#define
2f60: 20 52 54 52 45 45 5f 51 55 45 52 59 20 30 78 34   RTREE_QUERY 0x4
2f70: 37 20 20 2f 2a 20 47 3a 20 4e 65 77 2d 73 74 79  7  /* G: New-sty
2f80: 6c 65 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65  le sqlite3_rtree
2f90: 5f 71 75 65 72 79 5f 63 61 6c 6c 62 61 63 6b 28  _query_callback(
2fa0: 29 20 2a 2f 0a 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e  ) */.../* .** An
2fb0: 20 72 74 72 65 65 20 73 74 72 75 63 74 75 72 65   rtree structure
2fc0: 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   node..*/.struct
2fd0: 20 52 74 72 65 65 4e 6f 64 65 20 7b 0a 20 20 52   RtreeNode {.  R
2fe0: 74 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e  treeNode *pParen
2ff0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  t;         /* Pa
3000: 72 65 6e 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  rent node */.  i
3010: 36 34 20 69 4e 6f 64 65 3b 20 20 20 20 20 20 20  64 iNode;       
3020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
3030: 65 20 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f  e node number */
3040: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3060: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
3070: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6e  rences to this n
3080: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  ode */.  int isD
3090: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
30a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30b0: 74 68 65 20 6e 6f 64 65 20 6e 65 65 64 73 20 74  the node needs t
30c0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  o be written to 
30d0: 64 69 73 6b 20 2a 2f 0a 20 20 75 38 20 2a 7a 44  disk */.  u8 *zD
30e0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
30f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
3100: 20 6f 66 20 74 68 65 20 6e 6f 64 65 2c 20 61 73   of the node, as
3110: 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 20 64 69   should be on di
3120: 73 6b 20 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64  sk */.  RtreeNod
3130: 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  e *pNext;       
3140: 20 20 20 20 2f 2a 20 4e 65 78 74 20 6e 6f 64 65      /* Next node
3150: 20 69 6e 20 74 68 69 73 20 68 61 73 68 20 63 6f   in this hash co
3160: 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 2a 2f  llision chain */
3170: 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  .};../* Return t
3180: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  he number of cel
3190: 6c 73 20 69 6e 20 61 20 6e 6f 64 65 20 20 2a 2f  ls in a node  */
31a0: 0a 23 64 65 66 69 6e 65 20 4e 43 45 4c 4c 28 70  .#define NCELL(p
31b0: 4e 6f 64 65 29 20 72 65 61 64 49 6e 74 31 36 28  Node) readInt16(
31c0: 26 28 70 4e 6f 64 65 29 2d 3e 7a 44 61 74 61 5b  &(pNode)->zData[
31d0: 32 5d 29 0a 0a 2f 2a 20 0a 2a 2a 20 41 20 73 69  2])../* .** A si
31e0: 6e 67 6c 65 20 63 65 6c 6c 20 66 72 6f 6d 20 61  ngle cell from a
31f0: 20 6e 6f 64 65 2c 20 64 65 73 65 72 69 61 6c 69   node, deseriali
3200: 7a 65 64 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74  zed.*/.struct Rt
3210: 72 65 65 43 65 6c 6c 20 7b 0a 20 20 69 36 34 20  reeCell {.  i64 
3220: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3240: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20          /* Node 
3250: 6f 72 20 65 6e 74 72 79 20 49 44 20 2a 2f 0a 20  or entry ID */. 
3260: 20 52 74 72 65 65 43 6f 6f 72 64 20 61 43 6f 6f   RtreeCoord aCoo
3270: 72 64 5b 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d  rd[RTREE_MAX_DIM
3280: 45 4e 53 49 4f 4e 53 2a 32 5d 3b 20 20 2f 2a 20  ENSIONS*2];  /* 
3290: 42 6f 75 6e 64 69 6e 67 20 62 6f 78 20 63 6f 6f  Bounding box coo
32a0: 72 64 69 6e 61 74 65 73 20 2a 2f 0a 7d 3b 0a 0a  rdinates */.};..
32b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65  ./*.** This obje
32c0: 63 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20 73  ct becomes the s
32d0: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
32e0: 28 29 20 66 6f 72 20 74 68 65 20 53 51 4c 20 66  () for the SQL f
32f0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  unctions.** that
3300: 20 61 72 65 20 63 72 65 61 74 65 64 20 62 79 20   are created by 
3310: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
3320: 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28  ometry_callback(
3330: 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33  ) and.** sqlite3
3340: 5f 72 74 72 65 65 5f 71 75 65 72 79 5f 63 61 6c  _rtree_query_cal
3350: 6c 62 61 63 6b 28 29 20 61 6e 64 20 77 68 69 63  lback() and whic
3360: 68 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  h appear on the 
3370: 72 69 67 68 74 20 6f 66 20 4d 41 54 43 48 0a 2a  right of MATCH.*
3380: 2a 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 6f  * operators in o
3390: 72 64 65 72 20 74 6f 20 63 6f 6e 73 74 72 61 69  rder to constrai
33a0: 6e 20 61 20 73 65 61 72 63 68 2e 0a 2a 2a 0a 2a  n a search..**.*
33b0: 2a 20 78 47 65 6f 6d 20 61 6e 64 20 78 51 75 65  * xGeom and xQue
33c0: 72 79 46 75 6e 63 20 61 72 65 20 74 68 65 20 63  ryFunc are the c
33d0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
33e0: 73 2e 20 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  s.  Exactly one 
33f0: 6f 66 20 0a 2a 2a 20 78 47 65 6f 6d 20 61 6e 64  of .** xGeom and
3400: 20 78 51 75 65 72 79 46 75 6e 63 20 66 69 65 6c   xQueryFunc fiel
3410: 64 73 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  ds is non-NULL, 
3420: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
3430: 74 68 65 72 20 74 68 65 0a 2a 2a 20 53 51 4c 20  ther the.** SQL 
3440: 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 72 65  function was cre
3450: 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ated using sqlit
3460: 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72  e3_rtree_geometr
3470: 79 5f 63 61 6c 6c 62 61 63 6b 28 29 20 6f 72 0a  y_callback() or.
3480: 2a 2a 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65  ** sqlite3_rtree
3490: 5f 71 75 65 72 79 5f 63 61 6c 6c 62 61 63 6b 28  _query_callback(
34a0: 29 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 6f  )..** .** This o
34b0: 62 6a 65 63 74 20 69 73 20 64 65 6c 65 74 65 64  bject is deleted
34c0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62   automatically b
34d0: 79 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  y the destructor
34e0: 20 6d 65 63 68 61 6e 69 73 6d 20 69 6e 0a 2a 2a   mechanism in.**
34f0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
3500: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 29 2e 0a 2a  function_v2()..*
3510: 2f 0a 73 74 72 75 63 74 20 52 74 72 65 65 47 65  /.struct RtreeGe
3520: 6f 6d 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20 69  omCallback {.  i
3530: 6e 74 20 28 2a 78 47 65 6f 6d 29 28 73 71 6c 69  nt (*xGeom)(sqli
3540: 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74  te3_rtree_geomet
3550: 72 79 2a 2c 20 69 6e 74 2c 20 52 74 72 65 65 44  ry*, int, RtreeD
3560: 56 61 6c 75 65 2a 2c 20 69 6e 74 2a 29 3b 0a 20  Value*, int*);. 
3570: 20 69 6e 74 20 28 2a 78 51 75 65 72 79 46 75 6e   int (*xQueryFun
3580: 63 29 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65  c)(sqlite3_rtree
3590: 5f 71 75 65 72 79 5f 69 6e 66 6f 2a 29 3b 0a 20  _query_info*);. 
35a0: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63   void (*xDestruc
35b0: 74 6f 72 29 28 76 6f 69 64 2a 29 3b 0a 20 20 76  tor)(void*);.  v
35c0: 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 3b 0a 7d  oid *pContext;.}
35d0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
35e0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
35f0: 75 63 74 75 72 65 20 28 69 6e 20 74 68 65 20 66  ucture (in the f
3600: 6f 72 6d 20 6f 66 20 61 20 42 4c 4f 42 29 20 69  orm of a BLOB) i
3610: 73 20 72 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a  s returned by.**
3620: 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f   the SQL functio
3630: 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  ns that sqlite3_
3640: 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63  rtree_geometry_c
3650: 61 6c 6c 62 61 63 6b 28 29 20 61 6e 64 0a 2a 2a  allback() and.**
3660: 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71   sqlite3_rtree_q
3670: 75 65 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29 20  uery_callback() 
3680: 63 72 65 61 74 65 2c 20 61 6e 64 20 69 73 20 72  create, and is r
3690: 65 61 64 20 61 73 20 74 68 65 20 72 69 67 68 74  ead as the right
36a0: 2d 68 61 6e 64 0a 2a 2a 20 6f 70 65 72 61 6e 64  -hand.** operand
36b0: 20 74 6f 20 74 68 65 20 4d 41 54 43 48 20 6f 70   to the MATCH op
36c0: 65 72 61 74 6f 72 20 6f 66 20 61 6e 20 52 2d 54  erator of an R-T
36d0: 72 65 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52  ree..*/.struct R
36e0: 74 72 65 65 4d 61 74 63 68 41 72 67 20 7b 0a 20  treeMatchArg {. 
36f0: 20 75 33 32 20 69 53 69 7a 65 3b 20 20 20 20 20   u32 iSize;     
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3710: 53 69 7a 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  Size of this obj
3720: 65 63 74 20 2a 2f 0a 20 20 52 74 72 65 65 47 65  ect */.  RtreeGe
3730: 6f 6d 43 61 6c 6c 62 61 63 6b 20 63 62 3b 20 20  omCallback cb;  
3740: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f       /* Info abo
3750: 75 74 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ut the callback 
3760: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
3770: 6e 74 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20  nt nParam;      
3780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3790: 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65  mber of paramete
37a0: 72 73 20 74 6f 20 74 68 65 20 53 51 4c 20 66 75  rs to the SQL fu
37b0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  nction */.  sqli
37c0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 53 71  te3_value **apSq
37d0: 6c 50 61 72 61 6d 3b 20 2f 2a 20 4f 72 69 67 69  lParam; /* Origi
37e0: 6e 61 6c 20 53 51 4c 20 70 61 72 61 6d 65 74 65  nal SQL paramete
37f0: 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 52 74  r values */.  Rt
3800: 72 65 65 44 56 61 6c 75 65 20 61 50 61 72 61 6d  reeDValue aParam
3810: 5b 31 5d 3b 20 20 20 20 20 20 2f 2a 20 56 61 6c  [1];      /* Val
3820: 75 65 73 20 66 6f 72 20 70 61 72 61 6d 65 74 65  ues for paramete
3830: 72 73 20 74 6f 20 74 68 65 20 53 51 4c 20 66 75  rs to the SQL fu
3840: 6e 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69  nction */.};..#i
3850: 66 6e 64 65 66 20 4d 41 58 0a 23 20 64 65 66 69  fndef MAX.# defi
3860: 6e 65 20 4d 41 58 28 78 2c 79 29 20 28 28 78 29  ne MAX(x,y) ((x)
3870: 20 3c 20 28 79 29 20 3f 20 28 79 29 20 3a 20 28   < (y) ? (y) : (
3880: 78 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  x)).#endif.#ifnd
3890: 65 66 20 4d 49 4e 0a 23 20 64 65 66 69 6e 65 20  ef MIN.# define 
38a0: 4d 49 4e 28 78 2c 79 29 20 28 28 78 29 20 3e 20  MIN(x,y) ((x) > 
38b0: 28 79 29 20 3f 20 28 79 29 20 3a 20 28 78 29 29  (y) ? (y) : (x))
38c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 57 68 61 74  .#endif../* What
38d0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 47 43 43 20   version of GCC 
38e0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20  is being used.  
38f0: 30 20 6d 65 61 6e 73 20 47 43 43 20 69 73 20 6e  0 means GCC is n
3900: 6f 74 20 62 65 69 6e 67 20 75 73 65 64 20 2e 0a  ot being used ..
3910: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
3920: 20 47 43 43 5f 56 45 52 53 49 4f 4e 20 6d 61 63   GCC_VERSION mac
3930: 72 6f 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65 20  ro will also be 
3940: 73 65 74 20 63 6f 72 72 65 63 74 6c 79 20 77 68  set correctly wh
3950: 65 6e 20 75 73 69 6e 67 0a 2a 2a 20 63 6c 61 6e  en using.** clan
3960: 67 2c 20 73 69 6e 63 65 20 63 6c 61 6e 67 20 77  g, since clang w
3970: 6f 72 6b 73 20 68 61 72 64 20 74 6f 20 62 65 20  orks hard to be 
3980: 67 63 63 20 63 6f 6d 70 61 74 69 62 6c 65 2e 20  gcc compatible. 
3990: 20 53 6f 20 74 68 65 20 67 63 63 0a 2a 2a 20 6f   So the gcc.** o
39a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 69 6c  ptimizations wil
39b0: 6c 20 61 6c 73 6f 20 77 6f 72 6b 20 77 68 65 6e  l also work when
39c0: 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20   compiling with 
39d0: 63 6c 61 6e 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65  clang..*/.#ifnde
39e0: 66 20 47 43 43 5f 56 45 52 53 49 4f 4e 0a 23 69  f GCC_VERSION.#i
39f0: 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43  f defined(__GNUC
3a00: 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  __) && !defined(
3a10: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 49  SQLITE_DISABLE_I
3a20: 4e 54 52 49 4e 53 49 43 29 0a 23 20 64 65 66 69  NTRINSIC).# defi
3a30: 6e 65 20 47 43 43 5f 56 45 52 53 49 4f 4e 20 28  ne GCC_VERSION (
3a40: 5f 5f 47 4e 55 43 5f 5f 2a 31 30 30 30 30 30 30  __GNUC__*1000000
3a50: 2b 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 2a  +__GNUC_MINOR__*
3a60: 31 30 30 30 2b 5f 5f 47 4e 55 43 5f 50 41 54 43  1000+__GNUC_PATC
3a70: 48 4c 45 56 45 4c 5f 5f 29 0a 23 65 6c 73 65 0a  HLEVEL__).#else.
3a80: 23 20 64 65 66 69 6e 65 20 47 43 43 5f 56 45 52  # define GCC_VER
3a90: 53 49 4f 4e 20 30 0a 23 65 6e 64 69 66 0a 23 65  SION 0.#endif.#e
3aa0: 6e 64 69 66 0a 0a 2f 2a 20 54 68 65 20 74 65 73  ndif../* The tes
3ab0: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 73 68  tcase() macro sh
3ac0: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
3ad0: 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 61  defined in the a
3ae0: 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 20 20 49 66  malgamation.  If
3af0: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 6d  .** it is not, m
3b00: 61 6b 65 20 69 74 20 61 20 6e 6f 2d 6f 70 2e 0a  ake it a no-op..
3b10: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
3b20: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23  E_AMALGAMATION.#
3b30: 20 64 65 66 69 6e 65 20 74 65 73 74 63 61 73 65   define testcase
3b40: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
3b50: 2a 20 4d 61 63 72 6f 73 20 74 6f 20 64 65 74 65  * Macros to dete
3b60: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 74 68  rmine whether th
3b70: 65 20 6d 61 63 68 69 6e 65 20 69 73 20 62 69 67  e machine is big
3b80: 20 6f 72 20 6c 69 74 74 6c 65 20 65 6e 64 69 61   or little endia
3b90: 6e 2c 0a 2a 2a 20 61 6e 64 20 77 68 65 74 68 65  n,.** and whethe
3ba0: 72 20 6f 72 20 6e 6f 74 20 74 68 61 74 20 64 65  r or not that de
3bb0: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 69 73 20 72  termination is r
3bc0: 75 6e 2d 74 69 6d 65 20 6f 72 20 63 6f 6d 70 69  un-time or compi
3bd0: 6c 65 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 46  le-time..**.** F
3be0: 6f 72 20 62 65 73 74 20 70 65 72 66 6f 72 6d 61  or best performa
3bf0: 6e 63 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20  nce, an attempt 
3c00: 69 73 20 6d 61 64 65 20 74 6f 20 67 75 65 73 73  is made to guess
3c10: 20 61 74 20 74 68 65 20 62 79 74 65 2d 6f 72 64   at the byte-ord
3c20: 65 72 0a 2a 2a 20 75 73 69 6e 67 20 43 2d 70 72  er.** using C-pr
3c30: 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f  eprocessor macro
3c40: 73 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 75  s.  If that is u
3c50: 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20  nsuccessful, or 
3c60: 69 66 0a 2a 2a 20 2d 44 53 51 4c 49 54 45 5f 52  if.** -DSQLITE_R
3c70: 55 4e 54 49 4d 45 5f 42 59 54 45 4f 52 44 45 52  UNTIME_BYTEORDER
3c80: 3d 31 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  =1 is set, then 
3c90: 62 79 74 65 2d 6f 72 64 65 72 20 69 73 20 64 65  byte-order is de
3ca0: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 61 74 20 72  termined.** at r
3cb0: 75 6e 2d 74 69 6d 65 2e 0a 2a 2f 0a 23 69 66 6e  un-time..*/.#ifn
3cc0: 64 65 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  def SQLITE_BYTEO
3cd0: 52 44 45 52 0a 23 69 66 20 64 65 66 69 6e 65 64  RDER.#if defined
3ce0: 28 69 33 38 36 29 20 20 20 20 20 7c 7c 20 64 65  (i386)     || de
3cf0: 66 69 6e 65 64 28 5f 5f 69 33 38 36 5f 5f 29 20  fined(__i386__) 
3d00: 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f    || defined(_M_
3d10: 49 58 38 36 29 20 7c 7c 20 20 20 20 5c 0a 20 20  IX86) ||    \.  
3d20: 20 20 64 65 66 69 6e 65 64 28 5f 5f 78 38 36 5f    defined(__x86_
3d30: 36 34 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  64) || defined(_
3d40: 5f 78 38 36 5f 36 34 5f 5f 29 20 7c 7c 20 64 65  _x86_64__) || de
3d50: 66 69 6e 65 64 28 5f 4d 5f 58 36 34 29 20 20 7c  fined(_M_X64)  |
3d60: 7c 20 20 20 20 5c 0a 20 20 20 20 64 65 66 69 6e  |    \.    defin
3d70: 65 64 28 5f 4d 5f 41 4d 44 36 34 29 20 7c 7c 20  ed(_M_AMD64) || 
3d80: 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 20  defined(_M_ARM) 
3d90: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f      || defined(_
3da0: 5f 78 38 36 29 20 20 20 7c 7c 20 20 20 20 5c 0a  _x86)   ||    \.
3db0: 20 20 20 20 64 65 66 69 6e 65 64 28 5f 5f 61 72      defined(__ar
3dc0: 6d 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 53 51  m__).# define SQ
3dd0: 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 20 20  LITE_BYTEORDER  
3de0: 20 20 31 32 33 34 0a 23 65 6c 69 66 20 64 65 66    1234.#elif def
3df0: 69 6e 65 64 28 73 70 61 72 63 29 20 20 20 20 7c  ined(sparc)    |
3e00: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 70 70 63 5f  | defined(__ppc_
3e10: 5f 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  _).# define SQLI
3e20: 54 45 5f 42 59 54 45 4f 52 44 45 52 20 20 20 20  TE_BYTEORDER    
3e30: 34 33 32 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  4321.#else.# def
3e40: 69 6e 65 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  ine SQLITE_BYTEO
3e50: 52 44 45 52 20 20 20 20 30 20 20 20 20 20 2f 2a  RDER    0     /*
3e60: 20 30 20 6d 65 61 6e 73 20 22 75 6e 6b 6e 6f 77   0 means "unknow
3e70: 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  n at compile-tim
3e80: 65 22 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 65 6e  e" */.#endif.#en
3e90: 64 69 66 0a 0a 0a 2f 2a 20 57 68 61 74 20 76 65  dif.../* What ve
3ea0: 72 73 69 6f 6e 20 6f 66 20 4d 53 56 43 20 69 73  rsion of MSVC is
3eb0: 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 30 20   being used.  0 
3ec0: 6d 65 61 6e 73 20 4d 53 56 43 20 69 73 20 6e 6f  means MSVC is no
3ed0: 74 20 62 65 69 6e 67 20 75 73 65 64 20 2a 2f 0a  t being used */.
3ee0: 23 69 66 6e 64 65 66 20 4d 53 56 43 5f 56 45 52  #ifndef MSVC_VER
3ef0: 53 49 4f 4e 0a 23 69 66 20 64 65 66 69 6e 65 64  SION.#if defined
3f00: 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 21 64  (_MSC_VER) && !d
3f10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49  efined(SQLITE_DI
3f20: 53 41 42 4c 45 5f 49 4e 54 52 49 4e 53 49 43 29  SABLE_INTRINSIC)
3f30: 0a 23 20 64 65 66 69 6e 65 20 4d 53 56 43 5f 56  .# define MSVC_V
3f40: 45 52 53 49 4f 4e 20 5f 4d 53 43 5f 56 45 52 0a  ERSION _MSC_VER.
3f50: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
3f60: 53 56 43 5f 56 45 52 53 49 4f 4e 20 30 0a 23 65  SVC_VERSION 0.#e
3f70: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
3f80: 2a 2a 20 46 75 6e 63 74 69 6f 6e 73 20 74 6f 20  ** Functions to 
3f90: 64 65 73 65 72 69 61 6c 69 7a 65 20 61 20 31 36  deserialize a 16
3fa0: 20 62 69 74 20 69 6e 74 65 67 65 72 2c 20 33 32   bit integer, 32
3fb0: 20 62 69 74 20 72 65 61 6c 20 6e 75 6d 62 65 72   bit real number
3fc0: 20 61 6e 64 0a 2a 2a 20 36 34 20 62 69 74 20 69   and.** 64 bit i
3fd0: 6e 74 65 67 65 72 2e 20 54 68 65 20 64 65 73 65  nteger. The dese
3fe0: 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 69  rialized value i
3ff0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
4000: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 49 6e  tatic int readIn
4010: 74 31 36 28 75 38 20 2a 70 29 7b 0a 20 20 72 65  t16(u8 *p){.  re
4020: 74 75 72 6e 20 28 70 5b 30 5d 3c 3c 38 29 20 2b  turn (p[0]<<8) +
4030: 20 70 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20   p[1];.}.static 
4040: 76 6f 69 64 20 72 65 61 64 43 6f 6f 72 64 28 75  void readCoord(u
4050: 38 20 2a 70 2c 20 52 74 72 65 65 43 6f 6f 72 64  8 *p, RtreeCoord
4060: 20 2a 70 43 6f 6f 72 64 29 7b 0a 20 20 61 73 73   *pCoord){.  ass
4070: 65 72 74 28 20 28 28 28 28 63 68 61 72 2a 29 70  ert( ((((char*)p
4080: 29 20 2d 20 28 63 68 61 72 2a 29 30 29 26 33 29  ) - (char*)0)&3)
4090: 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 20 69 73 20  ==0 );  /* p is 
40a0: 61 6c 77 61 79 73 20 34 2d 62 79 74 65 20 61 6c  always 4-byte al
40b0: 69 67 6e 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c  igned */.#if SQL
40c0: 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31  ITE_BYTEORDER==1
40d0: 32 33 34 20 26 26 20 4d 53 56 43 5f 56 45 52 53  234 && MSVC_VERS
40e0: 49 4f 4e 3e 3d 31 33 30 30 0a 20 20 70 43 6f 6f  ION>=1300.  pCoo
40f0: 72 64 2d 3e 75 20 3d 20 5f 62 79 74 65 73 77 61  rd->u = _byteswa
4100: 70 5f 75 6c 6f 6e 67 28 2a 28 75 33 32 2a 29 70  p_ulong(*(u32*)p
4110: 29 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  );.#elif SQLITE_
4120: 42 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 20  BYTEORDER==1234 
4130: 26 26 20 47 43 43 5f 56 45 52 53 49 4f 4e 3e 3d  && GCC_VERSION>=
4140: 34 30 30 33 30 30 30 0a 20 20 70 43 6f 6f 72 64  4003000.  pCoord
4150: 2d 3e 75 20 3d 20 5f 5f 62 75 69 6c 74 69 6e 5f  ->u = __builtin_
4160: 62 73 77 61 70 33 32 28 2a 28 75 33 32 2a 29 70  bswap32(*(u32*)p
4170: 29 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  );.#elif SQLITE_
4180: 42 59 54 45 4f 52 44 45 52 3d 3d 34 33 32 31 0a  BYTEORDER==4321.
4190: 20 20 70 43 6f 6f 72 64 2d 3e 75 20 3d 20 2a 28    pCoord->u = *(
41a0: 75 33 32 2a 29 70 3b 0a 23 65 6c 73 65 0a 20 20  u32*)p;.#else.  
41b0: 70 43 6f 6f 72 64 2d 3e 75 20 3d 20 28 0a 20 20  pCoord->u = (.  
41c0: 20 20 28 28 28 75 33 32 29 70 5b 30 5d 29 20 3c    (((u32)p[0]) <
41d0: 3c 20 32 34 29 20 2b 20 0a 20 20 20 20 28 28 28  < 24) + .    (((
41e0: 75 33 32 29 70 5b 31 5d 29 20 3c 3c 20 31 36 29  u32)p[1]) << 16)
41f0: 20 2b 20 0a 20 20 20 20 28 28 28 75 33 32 29 70   + .    (((u32)p
4200: 5b 32 5d 29 20 3c 3c 20 20 38 29 20 2b 20 0a 20  [2]) <<  8) + . 
4210: 20 20 20 28 28 28 75 33 32 29 70 5b 33 5d 29 20     (((u32)p[3]) 
4220: 3c 3c 20 20 30 29 0a 20 20 29 3b 0a 23 65 6e 64  <<  0).  );.#end
4230: 69 66 0a 7d 0a 73 74 61 74 69 63 20 69 36 34 20  if.}.static i64 
4240: 72 65 61 64 49 6e 74 36 34 28 75 38 20 2a 70 29  readInt64(u8 *p)
4250: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 42 59 54  {.#if SQLITE_BYT
4260: 45 4f 52 44 45 52 3d 3d 31 32 33 34 20 26 26 20  EORDER==1234 && 
4270: 4d 53 56 43 5f 56 45 52 53 49 4f 4e 3e 3d 31 33  MSVC_VERSION>=13
4280: 30 30 0a 20 20 75 36 34 20 78 3b 0a 20 20 6d 65  00.  u64 x;.  me
4290: 6d 63 70 79 28 26 78 2c 20 70 2c 20 38 29 3b 0a  mcpy(&x, p, 8);.
42a0: 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 5f 62    return (i64)_b
42b0: 79 74 65 73 77 61 70 5f 75 69 6e 74 36 34 28 78  yteswap_uint64(x
42c0: 29 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  );.#elif SQLITE_
42d0: 42 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 20  BYTEORDER==1234 
42e0: 26 26 20 47 43 43 5f 56 45 52 53 49 4f 4e 3e 3d  && GCC_VERSION>=
42f0: 34 30 30 33 30 30 30 0a 20 20 75 36 34 20 78 3b  4003000.  u64 x;
4300: 0a 20 20 6d 65 6d 63 70 79 28 26 78 2c 20 70 2c  .  memcpy(&x, p,
4310: 20 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69   8);.  return (i
4320: 36 34 29 5f 5f 62 75 69 6c 74 69 6e 5f 62 73 77  64)__builtin_bsw
4330: 61 70 36 34 28 78 29 3b 0a 23 65 6c 69 66 20 53  ap64(x);.#elif S
4340: 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d  QLITE_BYTEORDER=
4350: 3d 34 33 32 31 0a 20 20 69 36 34 20 78 3b 0a 20  =4321.  i64 x;. 
4360: 20 6d 65 6d 63 70 79 28 26 78 2c 20 70 2c 20 38   memcpy(&x, p, 8
4370: 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 23  );.  return x;.#
4380: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 28 69  else.  return (i
4390: 36 34 29 28 0a 20 20 20 20 28 28 28 75 36 34 29  64)(.    (((u64)
43a0: 70 5b 30 5d 29 20 3c 3c 20 35 36 29 20 2b 20 0a  p[0]) << 56) + .
43b0: 20 20 20 20 28 28 28 75 36 34 29 70 5b 31 5d 29      (((u64)p[1])
43c0: 20 3c 3c 20 34 38 29 20 2b 20 0a 20 20 20 20 28   << 48) + .    (
43d0: 28 28 75 36 34 29 70 5b 32 5d 29 20 3c 3c 20 34  ((u64)p[2]) << 4
43e0: 30 29 20 2b 20 0a 20 20 20 20 28 28 28 75 36 34  0) + .    (((u64
43f0: 29 70 5b 33 5d 29 20 3c 3c 20 33 32 29 20 2b 20  )p[3]) << 32) + 
4400: 0a 20 20 20 20 28 28 28 75 36 34 29 70 5b 34 5d  .    (((u64)p[4]
4410: 29 20 3c 3c 20 32 34 29 20 2b 20 0a 20 20 20 20  ) << 24) + .    
4420: 28 28 28 75 36 34 29 70 5b 35 5d 29 20 3c 3c 20  (((u64)p[5]) << 
4430: 31 36 29 20 2b 20 0a 20 20 20 20 28 28 28 75 36  16) + .    (((u6
4440: 34 29 70 5b 36 5d 29 20 3c 3c 20 20 38 29 20 2b  4)p[6]) <<  8) +
4450: 20 0a 20 20 20 20 28 28 28 75 36 34 29 70 5b 37   .    (((u64)p[7
4460: 5d 29 20 3c 3c 20 20 30 29 0a 20 20 29 3b 0a 23  ]) <<  0).  );.#
4470: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  endif.}../*.** F
4480: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 73 65 72 69  unctions to seri
4490: 61 6c 69 7a 65 20 61 20 31 36 20 62 69 74 20 69  alize a 16 bit i
44a0: 6e 74 65 67 65 72 2c 20 33 32 20 62 69 74 20 72  nteger, 32 bit r
44b0: 65 61 6c 20 6e 75 6d 62 65 72 20 61 6e 64 0a 2a  eal number and.*
44c0: 2a 20 36 34 20 62 69 74 20 69 6e 74 65 67 65 72  * 64 bit integer
44d0: 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
44e0: 72 6e 65 64 20 69 73 20 74 68 65 20 6e 75 6d 62  rned is the numb
44f0: 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
4500: 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 61 72  ten.** to the ar
4510: 67 75 6d 65 6e 74 20 62 75 66 66 65 72 20 28 61  gument buffer (a
4520: 6c 77 61 79 73 20 32 2c 20 34 20 61 6e 64 20 38  lways 2, 4 and 8
4530: 20 72 65 73 70 65 63 74 69 76 65 6c 79 29 2e 0a   respectively)..
4540: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
4550: 72 69 74 65 49 6e 74 31 36 28 75 38 20 2a 70 2c  riteInt16(u8 *p,
4560: 20 69 6e 74 20 69 29 7b 0a 20 20 70 5b 30 5d 20   int i){.  p[0] 
4570: 3d 20 28 69 3e 3e 20 38 29 26 30 78 46 46 3b 0a  = (i>> 8)&0xFF;.
4580: 20 20 70 5b 31 5d 20 3d 20 28 69 3e 3e 20 30 29    p[1] = (i>> 0)
4590: 26 30 78 46 46 3b 0a 7d 0a 73 74 61 74 69 63 20  &0xFF;.}.static 
45a0: 69 6e 74 20 77 72 69 74 65 43 6f 6f 72 64 28 75  int writeCoord(u
45b0: 38 20 2a 70 2c 20 52 74 72 65 65 43 6f 6f 72 64  8 *p, RtreeCoord
45c0: 20 2a 70 43 6f 6f 72 64 29 7b 0a 20 20 75 33 32   *pCoord){.  u32
45d0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   i;.  assert( ((
45e0: 28 28 63 68 61 72 2a 29 70 29 20 2d 20 28 63 68  ((char*)p) - (ch
45f0: 61 72 2a 29 30 29 26 33 29 3d 3d 30 20 29 3b 20  ar*)0)&3)==0 ); 
4600: 20 2f 2a 20 70 20 69 73 20 61 6c 77 61 79 73 20   /* p is always 
4610: 34 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 2a  4-byte aligned *
4620: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  /.  assert( size
4630: 6f 66 28 52 74 72 65 65 43 6f 6f 72 64 29 3d 3d  of(RtreeCoord)==
4640: 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  4 );.  assert( s
4650: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
4660: 0a 23 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45  .#if SQLITE_BYTE
4670: 4f 52 44 45 52 3d 3d 31 32 33 34 20 26 26 20 47  ORDER==1234 && G
4680: 43 43 5f 56 45 52 53 49 4f 4e 3e 3d 34 30 30 33  CC_VERSION>=4003
4690: 30 30 30 0a 20 20 69 20 3d 20 5f 5f 62 75 69 6c  000.  i = __buil
46a0: 74 69 6e 5f 62 73 77 61 70 33 32 28 70 43 6f 6f  tin_bswap32(pCoo
46b0: 72 64 2d 3e 75 29 3b 0a 20 20 6d 65 6d 63 70 79  rd->u);.  memcpy
46c0: 28 70 2c 20 26 69 2c 20 34 29 3b 0a 23 65 6c 69  (p, &i, 4);.#eli
46d0: 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44  f SQLITE_BYTEORD
46e0: 45 52 3d 3d 31 32 33 34 20 26 26 20 4d 53 56 43  ER==1234 && MSVC
46f0: 5f 56 45 52 53 49 4f 4e 3e 3d 31 33 30 30 0a 20  _VERSION>=1300. 
4700: 20 69 20 3d 20 5f 62 79 74 65 73 77 61 70 5f 75   i = _byteswap_u
4710: 6c 6f 6e 67 28 70 43 6f 6f 72 64 2d 3e 75 29 3b  long(pCoord->u);
4720: 0a 20 20 6d 65 6d 63 70 79 28 70 2c 20 26 69 2c  .  memcpy(p, &i,
4730: 20 34 29 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54   4);.#elif SQLIT
4740: 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 34 33 32  E_BYTEORDER==432
4750: 31 0a 20 20 69 20 3d 20 70 43 6f 6f 72 64 2d 3e  1.  i = pCoord->
4760: 75 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2c 20 26  u;.  memcpy(p, &
4770: 69 2c 20 34 29 3b 0a 23 65 6c 73 65 0a 20 20 69  i, 4);.#else.  i
4780: 20 3d 20 70 43 6f 6f 72 64 2d 3e 75 3b 0a 20 20   = pCoord->u;.  
4790: 70 5b 30 5d 20 3d 20 28 69 3e 3e 32 34 29 26 30  p[0] = (i>>24)&0
47a0: 78 46 46 3b 0a 20 20 70 5b 31 5d 20 3d 20 28 69  xFF;.  p[1] = (i
47b0: 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20 20 70 5b  >>16)&0xFF;.  p[
47c0: 32 5d 20 3d 20 28 69 3e 3e 20 38 29 26 30 78 46  2] = (i>> 8)&0xF
47d0: 46 3b 0a 20 20 70 5b 33 5d 20 3d 20 28 69 3e 3e  F;.  p[3] = (i>>
47e0: 20 30 29 26 30 78 46 46 3b 0a 23 65 6e 64 69 66   0)&0xFF;.#endif
47f0: 0a 20 20 72 65 74 75 72 6e 20 34 3b 0a 7d 0a 73  .  return 4;.}.s
4800: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 49  tatic int writeI
4810: 6e 74 36 34 28 75 38 20 2a 70 2c 20 69 36 34 20  nt64(u8 *p, i64 
4820: 69 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 42  i){.#if SQLITE_B
4830: 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 20 26  YTEORDER==1234 &
4840: 26 20 47 43 43 5f 56 45 52 53 49 4f 4e 3e 3d 34  & GCC_VERSION>=4
4850: 30 30 33 30 30 30 0a 20 20 69 20 3d 20 28 69 36  003000.  i = (i6
4860: 34 29 5f 5f 62 75 69 6c 74 69 6e 5f 62 73 77 61  4)__builtin_bswa
4870: 70 36 34 28 28 75 36 34 29 69 29 3b 0a 20 20 6d  p64((u64)i);.  m
4880: 65 6d 63 70 79 28 70 2c 20 26 69 2c 20 38 29 3b  emcpy(p, &i, 8);
4890: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 42 59  .#elif SQLITE_BY
48a0: 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 20 26 26  TEORDER==1234 &&
48b0: 20 4d 53 56 43 5f 56 45 52 53 49 4f 4e 3e 3d 31   MSVC_VERSION>=1
48c0: 33 30 30 0a 20 20 69 20 3d 20 28 69 36 34 29 5f  300.  i = (i64)_
48d0: 62 79 74 65 73 77 61 70 5f 75 69 6e 74 36 34 28  byteswap_uint64(
48e0: 28 75 36 34 29 69 29 3b 0a 20 20 6d 65 6d 63 70  (u64)i);.  memcp
48f0: 79 28 70 2c 20 26 69 2c 20 38 29 3b 0a 23 65 6c  y(p, &i, 8);.#el
4900: 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52  if SQLITE_BYTEOR
4910: 44 45 52 3d 3d 34 33 32 31 0a 20 20 6d 65 6d 63  DER==4321.  memc
4920: 70 79 28 70 2c 20 26 69 2c 20 38 29 3b 0a 23 65  py(p, &i, 8);.#e
4930: 6c 73 65 0a 20 20 70 5b 30 5d 20 3d 20 28 69 3e  lse.  p[0] = (i>
4940: 3e 35 36 29 26 30 78 46 46 3b 0a 20 20 70 5b 31  >56)&0xFF;.  p[1
4950: 5d 20 3d 20 28 69 3e 3e 34 38 29 26 30 78 46 46  ] = (i>>48)&0xFF
4960: 3b 0a 20 20 70 5b 32 5d 20 3d 20 28 69 3e 3e 34  ;.  p[2] = (i>>4
4970: 30 29 26 30 78 46 46 3b 0a 20 20 70 5b 33 5d 20  0)&0xFF;.  p[3] 
4980: 3d 20 28 69 3e 3e 33 32 29 26 30 78 46 46 3b 0a  = (i>>32)&0xFF;.
4990: 20 20 70 5b 34 5d 20 3d 20 28 69 3e 3e 32 34 29    p[4] = (i>>24)
49a0: 26 30 78 46 46 3b 0a 20 20 70 5b 35 5d 20 3d 20  &0xFF;.  p[5] = 
49b0: 28 69 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20 20  (i>>16)&0xFF;.  
49c0: 70 5b 36 5d 20 3d 20 28 69 3e 3e 20 38 29 26 30  p[6] = (i>> 8)&0
49d0: 78 46 46 3b 0a 20 20 70 5b 37 5d 20 3d 20 28 69  xFF;.  p[7] = (i
49e0: 3e 3e 20 30 29 26 30 78 46 46 3b 0a 23 65 6e 64  >> 0)&0xFF;.#end
49f0: 69 66 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d  if.  return 8;.}
4a00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
4a10: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
4a20: 63 6f 75 6e 74 20 6f 66 20 6e 6f 64 65 20 70 2e  count of node p.
4a30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4a40: 6e 6f 64 65 52 65 66 65 72 65 6e 63 65 28 52 74  nodeReference(Rt
4a50: 72 65 65 4e 6f 64 65 20 2a 70 29 7b 0a 20 20 69  reeNode *p){.  i
4a60: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
4a70: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
4a80: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a  .    p->nRef++;.
4a90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
4aa0: 61 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ar the content o
4ab0: 66 20 6e 6f 64 65 20 70 20 28 73 65 74 20 61 6c  f node p (set al
4ac0: 6c 20 62 79 74 65 73 20 74 6f 20 30 78 30 30 29  l bytes to 0x00)
4ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4ae0: 20 6e 6f 64 65 5a 65 72 6f 28 52 74 72 65 65 20   nodeZero(Rtree 
4af0: 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f  *pRtree, RtreeNo
4b00: 64 65 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  de *p){.  memset
4b10: 28 26 70 2d 3e 7a 44 61 74 61 5b 32 5d 2c 20 30  (&p->zData[2], 0
4b20: 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53  , pRtree->iNodeS
4b30: 69 7a 65 2d 32 29 3b 0a 20 20 70 2d 3e 69 73 44  ize-2);.  p->isD
4b40: 69 72 74 79 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  irty = 1;.}../*.
4b50: 2a 2a 20 47 69 76 65 6e 20 61 20 6e 6f 64 65 20  ** Given a node 
4b60: 6e 75 6d 62 65 72 20 69 4e 6f 64 65 2c 20 72 65  number iNode, re
4b70: 74 75 72 6e 20 74 68 65 20 63 6f 72 72 65 73 70  turn the corresp
4b80: 6f 6e 64 69 6e 67 20 6b 65 79 20 74 6f 20 75 73  onding key to us
4b90: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 52 74 72 65  e.** in the Rtre
4ba0: 65 2e 61 48 61 73 68 20 74 61 62 6c 65 2e 0a 2a  e.aHash table..*
4bb0: 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  /.static unsigne
4bc0: 64 20 69 6e 74 20 6e 6f 64 65 48 61 73 68 28 69  d int nodeHash(i
4bd0: 36 34 20 69 4e 6f 64 65 29 7b 0a 20 20 72 65 74  64 iNode){.  ret
4be0: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 29 69  urn ((unsigned)i
4bf0: 4e 6f 64 65 29 20 25 20 48 41 53 48 53 49 5a 45  Node) % HASHSIZE
4c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
4c10: 68 20 74 68 65 20 6e 6f 64 65 20 68 61 73 68 20  h the node hash 
4c20: 74 61 62 6c 65 20 66 6f 72 20 6e 6f 64 65 20 69  table for node i
4c30: 4e 6f 64 65 2e 20 49 66 20 66 6f 75 6e 64 2c 20  Node. If found, 
4c40: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
4c50: 0a 2a 2a 20 74 6f 20 69 74 2e 20 4f 74 68 65 72  .** to it. Other
4c60: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a  wise, return 0..
4c70: 2a 2f 0a 73 74 61 74 69 63 20 52 74 72 65 65 4e  */.static RtreeN
4c80: 6f 64 65 20 2a 6e 6f 64 65 48 61 73 68 4c 6f 6f  ode *nodeHashLoo
4c90: 6b 75 70 28 52 74 72 65 65 20 2a 70 52 74 72 65  kup(Rtree *pRtre
4ca0: 65 2c 20 69 36 34 20 69 4e 6f 64 65 29 7b 0a 20  e, i64 iNode){. 
4cb0: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 3b 0a 20   RtreeNode *p;. 
4cc0: 20 66 6f 72 28 70 3d 70 52 74 72 65 65 2d 3e 61   for(p=pRtree->a
4cd0: 48 61 73 68 5b 6e 6f 64 65 48 61 73 68 28 69 4e  Hash[nodeHash(iN
4ce0: 6f 64 65 29 5d 3b 20 70 20 26 26 20 70 2d 3e 69  ode)]; p && p->i
4cf0: 4e 6f 64 65 21 3d 69 4e 6f 64 65 3b 20 70 3d 70  Node!=iNode; p=p
4d00: 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 72 65 74 75  ->pNext);.  retu
4d10: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn p;.}../*.** A
4d20: 64 64 20 6e 6f 64 65 20 70 4e 6f 64 65 20 74 6f  dd node pNode to
4d30: 20 74 68 65 20 6e 6f 64 65 20 68 61 73 68 20 74   the node hash t
4d40: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
4d50: 76 6f 69 64 20 6e 6f 64 65 48 61 73 68 49 6e 73  void nodeHashIns
4d60: 65 72 74 28 52 74 72 65 65 20 2a 70 52 74 72 65  ert(Rtree *pRtre
4d70: 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e  e, RtreeNode *pN
4d80: 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 48 61 73  ode){.  int iHas
4d90: 68 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f  h;.  assert( pNo
4da0: 64 65 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a  de->pNext==0 );.
4db0: 20 20 69 48 61 73 68 20 3d 20 6e 6f 64 65 48 61    iHash = nodeHa
4dc0: 73 68 28 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29  sh(pNode->iNode)
4dd0: 3b 0a 20 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74  ;.  pNode->pNext
4de0: 20 3d 20 70 52 74 72 65 65 2d 3e 61 48 61 73 68   = pRtree->aHash
4df0: 5b 69 48 61 73 68 5d 3b 0a 20 20 70 52 74 72 65  [iHash];.  pRtre
4e00: 65 2d 3e 61 48 61 73 68 5b 69 48 61 73 68 5d 20  e->aHash[iHash] 
4e10: 3d 20 70 4e 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  = pNode;.}../*.*
4e20: 2a 20 52 65 6d 6f 76 65 20 6e 6f 64 65 20 70 4e  * Remove node pN
4e30: 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 6e 6f 64  ode from the nod
4e40: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f  e hash table..*/
4e50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64  .static void nod
4e60: 65 48 61 73 68 44 65 6c 65 74 65 28 52 74 72 65  eHashDelete(Rtre
4e70: 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65  e *pRtree, Rtree
4e80: 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20  Node *pNode){.  
4e90: 52 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70 3b 0a  RtreeNode **pp;.
4ea0: 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f    if( pNode->iNo
4eb0: 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 70 20  de!=0 ){.    pp 
4ec0: 3d 20 26 70 52 74 72 65 65 2d 3e 61 48 61 73 68  = &pRtree->aHash
4ed0: 5b 6e 6f 64 65 48 61 73 68 28 70 4e 6f 64 65 2d  [nodeHash(pNode-
4ee0: 3e 69 4e 6f 64 65 29 5d 3b 0a 20 20 20 20 66 6f  >iNode)];.    fo
4ef0: 72 28 20 3b 20 28 2a 70 70 29 21 3d 70 4e 6f 64  r( ; (*pp)!=pNod
4f00: 65 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  e; pp = &(*pp)->
4f10: 70 4e 65 78 74 29 7b 20 61 73 73 65 72 74 28 2a  pNext){ assert(*
4f20: 70 70 29 3b 20 7d 0a 20 20 20 20 2a 70 70 20 3d  pp); }.    *pp =
4f30: 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20   pNode->pNext;. 
4f40: 20 20 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 20     pNode->pNext 
4f50: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
4f60: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
4f70: 65 74 75 72 6e 20 6e 65 77 20 72 2d 74 72 65 65  eturn new r-tree
4f80: 20 6e 6f 64 65 2e 20 49 6e 69 74 69 61 6c 6c 79   node. Initially
4f90: 2c 20 28 52 74 72 65 65 4e 6f 64 65 2e 69 4e 6f  , (RtreeNode.iNo
4fa0: 64 65 3d 3d 30 29 2c 0a 2a 2a 20 69 6e 64 69 63  de==0),.** indic
4fb0: 61 74 69 6e 67 20 74 68 61 74 20 6e 6f 64 65 20  ating that node 
4fc0: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
4fd0: 20 61 73 73 69 67 6e 65 64 20 61 20 6e 6f 64 65   assigned a node
4fe0: 20 6e 75 6d 62 65 72 2e 20 49 74 20 69 73 0a 2a   number. It is.*
4ff0: 2a 20 61 73 73 69 67 6e 65 64 20 61 20 6e 6f 64  * assigned a nod
5000: 65 20 6e 75 6d 62 65 72 20 77 68 65 6e 20 6e 6f  e number when no
5010: 64 65 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  deWrite() is cal
5020: 6c 65 64 20 74 6f 20 77 72 69 74 65 20 74 68 65  led to write the
5030: 0a 2a 2a 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74  .** node content
5040: 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
5050: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
5060: 20 52 74 72 65 65 4e 6f 64 65 20 2a 6e 6f 64 65   RtreeNode *node
5070: 4e 65 77 28 52 74 72 65 65 20 2a 70 52 74 72 65  New(Rtree *pRtre
5080: 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50  e, RtreeNode *pP
5090: 61 72 65 6e 74 29 7b 0a 20 20 52 74 72 65 65 4e  arent){.  RtreeN
50a0: 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 70 4e  ode *pNode;.  pN
50b0: 6f 64 65 20 3d 20 28 52 74 72 65 65 4e 6f 64 65  ode = (RtreeNode
50c0: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
50d0: 63 36 34 28 73 69 7a 65 6f 66 28 52 74 72 65 65  c64(sizeof(Rtree
50e0: 4e 6f 64 65 29 20 2b 20 70 52 74 72 65 65 2d 3e  Node) + pRtree->
50f0: 69 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 69 66  iNodeSize);.  if
5100: 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 6d  ( pNode ){.    m
5110: 65 6d 73 65 74 28 70 4e 6f 64 65 2c 20 30 2c 20  emset(pNode, 0, 
5120: 73 69 7a 65 6f 66 28 52 74 72 65 65 4e 6f 64 65  sizeof(RtreeNode
5130: 29 20 2b 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64  ) + pRtree->iNod
5140: 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 4e 6f 64  eSize);.    pNod
5150: 65 2d 3e 7a 44 61 74 61 20 3d 20 28 75 38 20 2a  e->zData = (u8 *
5160: 29 26 70 4e 6f 64 65 5b 31 5d 3b 0a 20 20 20 20  )&pNode[1];.    
5170: 70 4e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  pNode->nRef = 1;
5180: 0a 20 20 20 20 70 52 74 72 65 65 2d 3e 6e 4e 6f  .    pRtree->nNo
5190: 64 65 52 65 66 2b 2b 3b 0a 20 20 20 20 70 4e 6f  deRef++;.    pNo
51a0: 64 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  de->pParent = pP
51b0: 61 72 65 6e 74 3b 0a 20 20 20 20 70 4e 6f 64 65  arent;.    pNode
51c0: 2d 3e 69 73 44 69 72 74 79 20 3d 20 31 3b 0a 20  ->isDirty = 1;. 
51d0: 20 20 20 6e 6f 64 65 52 65 66 65 72 65 6e 63 65     nodeReference
51e0: 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20  (pParent);.  }. 
51f0: 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 3b 0a 7d   return pNode;.}
5200: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
5210: 65 20 52 74 72 65 65 2e 70 4e 6f 64 65 42 6c 6f  e Rtree.pNodeBlo
5220: 62 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74  b object.*/.stat
5230: 69 63 20 76 6f 69 64 20 6e 6f 64 65 42 6c 6f 62  ic void nodeBlob
5240: 52 65 73 65 74 28 52 74 72 65 65 20 2a 70 52 74  Reset(Rtree *pRt
5250: 72 65 65 29 7b 0a 20 20 69 66 28 20 70 52 74 72  ree){.  if( pRtr
5260: 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f 62 20 26 26  ee->pNodeBlob &&
5270: 20 70 52 74 72 65 65 2d 3e 69 6e 57 72 54 72 61   pRtree->inWrTra
5280: 6e 73 3d 3d 30 20 26 26 20 70 52 74 72 65 65 2d  ns==0 && pRtree-
5290: 3e 6e 43 75 72 73 6f 72 3d 3d 30 20 29 7b 0a 20  >nCursor==0 ){. 
52a0: 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20     sqlite3_blob 
52b0: 2a 70 42 6c 6f 62 20 3d 20 70 52 74 72 65 65 2d  *pBlob = pRtree-
52c0: 3e 70 4e 6f 64 65 42 6c 6f 62 3b 0a 20 20 20 20  >pNodeBlob;.    
52d0: 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f  pRtree->pNodeBlo
52e0: 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  b = 0;.    sqlit
52f0: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42  e3_blob_close(pB
5300: 6c 6f 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  lob);.  }.}../*.
5310: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
5320: 69 66 20 70 4e 6f 64 65 20 69 73 20 74 68 65 20  if pNode is the 
5330: 73 61 6d 65 20 61 73 20 70 50 61 72 65 6e 74 20  same as pParent 
5340: 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 70 61  or any of the pa
5350: 72 65 6e 74 73 0a 2a 2a 20 6f 66 20 70 50 61 72  rents.** of pPar
5360: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
5370: 6e 74 20 6e 6f 64 65 49 6e 50 61 72 65 6e 74 43  nt nodeInParentC
5380: 68 61 69 6e 28 63 6f 6e 73 74 20 52 74 72 65 65  hain(const Rtree
5390: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 63 6f 6e  Node *pNode, con
53a0: 73 74 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50  st RtreeNode *pP
53b0: 61 72 65 6e 74 29 7b 0a 20 20 64 6f 7b 0a 20 20  arent){.  do{.  
53c0: 20 20 69 66 28 20 70 4e 6f 64 65 3d 3d 70 50 61    if( pNode==pPa
53d0: 72 65 6e 74 20 29 20 72 65 74 75 72 6e 20 31 3b  rent ) return 1;
53e0: 0a 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 70  .    pParent = p
53f0: 50 61 72 65 6e 74 2d 3e 70 50 61 72 65 6e 74 3b  Parent->pParent;
5400: 0a 20 20 7d 77 68 69 6c 65 28 20 70 50 61 72 65  .  }while( pPare
5410: 6e 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  nt );.  return 0
5420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  ;.}../*.** Obtai
5430: 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
5440: 20 61 6e 20 72 2d 74 72 65 65 20 6e 6f 64 65 2e   an r-tree node.
5450: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
5460: 6f 64 65 41 63 71 75 69 72 65 28 0a 20 20 52 74  odeAcquire(.  Rt
5470: 72 65 65 20 2a 70 52 74 72 65 65 2c 20 20 20 20  ree *pRtree,    
5480: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 2d 74 72           /* R-tr
5490: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
54a0: 20 20 69 36 34 20 69 4e 6f 64 65 2c 20 20 20 20    i64 iNode,    
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54c0: 4e 6f 64 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c  Node number to l
54d0: 6f 61 64 20 2a 2f 0a 20 20 52 74 72 65 65 4e 6f  oad */.  RtreeNo
54e0: 64 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  de *pParent,    
54f0: 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
5500: 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 20 6f 72  e parent node or
5510: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 52 74 72 65 65   NULL */.  Rtree
5520: 4e 6f 64 65 20 2a 2a 70 70 4e 6f 64 65 20 20 20  Node **ppNode   
5530: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63        /* OUT: Ac
5540: 71 75 69 72 65 64 20 6e 6f 64 65 20 2a 2f 0a 29  quired node */.)
5550: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5560: 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 4e  ITE_OK;.  RtreeN
5570: 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a  ode *pNode = 0;.
5580: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
5590: 68 65 20 72 65 71 75 65 73 74 65 64 20 6e 6f 64  he requested nod
55a0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
55b0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
55c0: 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 69 6e 63 72  If so,.  ** incr
55d0: 65 61 73 65 20 69 74 73 20 72 65 66 65 72 65 6e  ease its referen
55e0: 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74  ce count and ret
55f0: 75 72 6e 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  urn it..  */.  i
5600: 66 28 20 28 70 4e 6f 64 65 20 3d 20 6e 6f 64 65  f( (pNode = node
5610: 48 61 73 68 4c 6f 6f 6b 75 70 28 70 52 74 72 65  HashLookup(pRtre
5620: 65 2c 20 69 4e 6f 64 65 29 29 21 3d 30 20 29 7b  e, iNode))!=0 ){
5630: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
5640: 61 72 65 6e 74 20 7c 7c 20 21 70 4e 6f 64 65 2d  arent || !pNode-
5650: 3e 70 50 61 72 65 6e 74 20 7c 7c 20 70 4e 6f 64  >pParent || pNod
5660: 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 70 50 61 72  e->pParent==pPar
5670: 65 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ent );.    if( p
5680: 50 61 72 65 6e 74 20 26 26 20 21 70 4e 6f 64 65  Parent && !pNode
5690: 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ->pParent ){.   
56a0: 20 20 20 69 66 28 20 6e 6f 64 65 49 6e 50 61 72     if( nodeInPar
56b0: 65 6e 74 43 68 61 69 6e 28 70 4e 6f 64 65 2c 20  entChain(pNode, 
56c0: 70 50 61 72 65 6e 74 29 20 29 7b 0a 20 20 20 20  pParent) ){.    
56d0: 20 20 20 20 52 54 52 45 45 5f 49 53 5f 43 4f 52      RTREE_IS_COR
56e0: 52 55 50 54 28 70 52 74 72 65 65 29 3b 0a 20 20  RUPT(pRtree);.  
56f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5700: 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
5710: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5720: 70 50 61 72 65 6e 74 2d 3e 6e 52 65 66 2b 2b 3b  pParent->nRef++;
5730: 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 70 50  .      pNode->pP
5740: 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b  arent = pParent;
5750: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 6f 64 65  .    }.    pNode
5760: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 2a 70  ->nRef++;.    *p
5770: 70 4e 6f 64 65 20 3d 20 70 4e 6f 64 65 3b 0a 20  pNode = pNode;. 
5780: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5790: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
57a0: 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f  pRtree->pNodeBlo
57b0: 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
57c0: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70  _blob *pBlob = p
57d0: 52 74 72 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f 62  Rtree->pNodeBlob
57e0: 3b 0a 20 20 20 20 70 52 74 72 65 65 2d 3e 70 4e  ;.    pRtree->pN
57f0: 6f 64 65 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 20  odeBlob = 0;.   
5800: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
5810: 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c  ob_reopen(pBlob,
5820: 20 69 4e 6f 64 65 29 3b 0a 20 20 20 20 70 52 74   iNode);.    pRt
5830: 72 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f 62 20 3d  ree->pNodeBlob =
5840: 20 70 42 6c 6f 62 3b 0a 20 20 20 20 69 66 28 20   pBlob;.    if( 
5850: 72 63 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65  rc ){.      node
5860: 42 6c 6f 62 52 65 73 65 74 28 70 52 74 72 65 65  BlobReset(pRtree
5870: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
5880: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
5890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
58a0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
58b0: 20 69 66 28 20 70 52 74 72 65 65 2d 3e 70 4e 6f   if( pRtree->pNo
58c0: 64 65 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20 20 20  deBlob==0 ){.   
58d0: 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 73 71   char *zTab = sq
58e0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
58f0: 73 5f 6e 6f 64 65 22 2c 20 70 52 74 72 65 65 2d  s_node", pRtree-
5900: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
5910: 20 7a 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   zTab==0 ) retur
5920: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
5930: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5940: 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 52 74 72 65  _blob_open(pRtre
5950: 65 2d 3e 64 62 2c 20 70 52 74 72 65 65 2d 3e 7a  e->db, pRtree->z
5960: 44 62 2c 20 7a 54 61 62 2c 20 22 64 61 74 61 22  Db, zTab, "data"
5970: 2c 20 69 4e 6f 64 65 2c 20 30 2c 0a 20 20 20 20  , iNode, 0,.    
5980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5990: 20 20 20 20 20 20 20 26 70 52 74 72 65 65 2d 3e         &pRtree->
59a0: 70 4e 6f 64 65 42 6c 6f 62 29 3b 0a 20 20 20 20  pNodeBlob);.    
59b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61  sqlite3_free(zTa
59c0: 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  b);.  }.  if( rc
59d0: 20 29 7b 0a 20 20 20 20 6e 6f 64 65 42 6c 6f 62   ){.    nodeBlob
59e0: 52 65 73 65 74 28 70 52 74 72 65 65 29 3b 0a 20  Reset(pRtree);. 
59f0: 20 20 20 2a 70 70 4e 6f 64 65 20 3d 20 30 3b 0a     *ppNode = 0;.
5a00: 20 20 20 20 2f 2a 20 49 66 20 75 6e 61 62 6c 65      /* If unable
5a10: 20 74 6f 20 6f 70 65 6e 20 61 6e 20 73 71 6c 69   to open an sqli
5a20: 74 65 33 5f 62 6c 6f 62 20 6f 6e 20 74 68 65 20  te3_blob on the 
5a30: 64 65 73 69 72 65 64 20 72 6f 77 2c 20 74 68 61  desired row, tha
5a40: 74 20 63 61 6e 20 6f 6e 6c 79 0a 20 20 20 20 2a  t can only.    *
5a50: 2a 20 62 65 20 62 65 63 61 75 73 65 20 74 68 65  * be because the
5a60: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 20 68   shadow tables h
5a70: 6f 6c 64 20 65 72 72 6f 6e 65 6f 75 73 20 64 61  old erroneous da
5a80: 74 61 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ta. */.    if( r
5a90: 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
5aa0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
5ab0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
5ac0: 42 3b 0a 20 20 20 20 20 20 52 54 52 45 45 5f 49  B;.      RTREE_I
5ad0: 53 5f 43 4f 52 52 55 50 54 28 70 52 74 72 65 65  S_CORRUPT(pRtree
5ae0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
5af0: 20 69 66 28 20 70 52 74 72 65 65 2d 3e 69 4e 6f   if( pRtree->iNo
5b00: 64 65 53 69 7a 65 3d 3d 73 71 6c 69 74 65 33 5f  deSize==sqlite3_
5b10: 62 6c 6f 62 5f 62 79 74 65 73 28 70 52 74 72 65  blob_bytes(pRtre
5b20: 65 2d 3e 70 4e 6f 64 65 42 6c 6f 62 29 20 29 7b  e->pNodeBlob) ){
5b30: 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 28 52 74  .    pNode = (Rt
5b40: 72 65 65 4e 6f 64 65 20 2a 29 73 71 6c 69 74 65  reeNode *)sqlite
5b50: 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f  3_malloc64(sizeo
5b60: 66 28 52 74 72 65 65 4e 6f 64 65 29 2b 70 52 74  f(RtreeNode)+pRt
5b70: 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 29 3b  ree->iNodeSize);
5b80: 0a 20 20 20 20 69 66 28 20 21 70 4e 6f 64 65 20  .    if( !pNode 
5b90: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
5ba0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 6f  }else{.      pNo
5bc0: 64 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  de->pParent = pP
5bd0: 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 70 4e 6f  arent;.      pNo
5be0: 64 65 2d 3e 7a 44 61 74 61 20 3d 20 28 75 38 20  de->zData = (u8 
5bf0: 2a 29 26 70 4e 6f 64 65 5b 31 5d 3b 0a 20 20 20  *)&pNode[1];.   
5c00: 20 20 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 20 3d     pNode->nRef =
5c10: 20 31 3b 0a 20 20 20 20 20 20 70 52 74 72 65 65   1;.      pRtree
5c20: 2d 3e 6e 4e 6f 64 65 52 65 66 2b 2b 3b 0a 20 20  ->nNodeRef++;.  
5c30: 20 20 20 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65      pNode->iNode
5c40: 20 3d 20 69 4e 6f 64 65 3b 0a 20 20 20 20 20 20   = iNode;.      
5c50: 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d  pNode->isDirty =
5c60: 20 30 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d   0;.      pNode-
5c70: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
5c80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
5c90: 6c 6f 62 5f 72 65 61 64 28 70 52 74 72 65 65 2d  lob_read(pRtree-
5ca0: 3e 70 4e 6f 64 65 42 6c 6f 62 2c 20 70 4e 6f 64  >pNodeBlob, pNod
5cb0: 65 2d 3e 7a 44 61 74 61 2c 0a 20 20 20 20 20 20  e->zData,.      
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 20 20 20 70 52 74 72 65 65 2d 3e 69         pRtree->i
5ce0: 4e 6f 64 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20  NodeSize, 0);.  
5cf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
5d00: 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 77   the root node w
5d10: 61 73 20 6a 75 73 74 20 6c 6f 61 64 65 64 2c 20  as just loaded, 
5d20: 73 65 74 20 70 52 74 72 65 65 2d 3e 69 44 65 70  set pRtree->iDep
5d30: 74 68 20 74 6f 20 74 68 65 20 68 65 69 67 68 74  th to the height
5d40: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 2d 74  .  ** of the r-t
5d50: 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 41  ree structure. A
5d60: 20 68 65 69 67 68 74 20 6f 66 20 7a 65 72 6f 20   height of zero 
5d70: 6d 65 61 6e 73 20 61 6c 6c 20 64 61 74 61 20 69  means all data i
5d80: 73 20 73 74 6f 72 65 64 20 6f 6e 0a 20 20 2a 2a  s stored on.  **
5d90: 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20   the root node. 
5da0: 41 20 68 65 69 67 68 74 20 6f 66 20 6f 6e 65 20  A height of one 
5db0: 6d 65 61 6e 73 20 74 68 65 20 63 68 69 6c 64 72  means the childr
5dc0: 65 6e 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6e  en of the root n
5dd0: 6f 64 65 0a 20 20 2a 2a 20 61 72 65 20 74 68 65  ode.  ** are the
5de0: 20 6c 65 61 76 65 73 2c 20 61 6e 64 20 73 6f 20   leaves, and so 
5df0: 6f 6e 2e 20 49 66 20 74 68 65 20 64 65 70 74 68  on. If the depth
5e00: 20 61 73 20 73 70 65 63 69 66 69 65 64 20 6f 6e   as specified on
5e10: 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 0a 20   the root node. 
5e20: 20 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74   ** is greater t
5e30: 68 61 6e 20 52 54 52 45 45 5f 4d 41 58 5f 44 45  han RTREE_MAX_DE
5e40: 50 54 48 2c 20 74 68 65 20 72 2d 74 72 65 65 20  PTH, the r-tree 
5e50: 73 74 72 75 63 74 75 72 65 20 6d 75 73 74 20 62  structure must b
5e60: 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 2a 2f 0a  e corrupt..  */.
5e70: 20 20 69 66 28 20 70 4e 6f 64 65 20 26 26 20 69    if( pNode && i
5e80: 4e 6f 64 65 3d 3d 31 20 29 7b 0a 20 20 20 20 70  Node==1 ){.    p
5e90: 52 74 72 65 65 2d 3e 69 44 65 70 74 68 20 3d 20  Rtree->iDepth = 
5ea0: 72 65 61 64 49 6e 74 31 36 28 70 4e 6f 64 65 2d  readInt16(pNode-
5eb0: 3e 7a 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >zData);.    if(
5ec0: 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 3e   pRtree->iDepth>
5ed0: 52 54 52 45 45 5f 4d 41 58 5f 44 45 50 54 48 20  RTREE_MAX_DEPTH 
5ee0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
5ef0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
5f00: 42 3b 0a 20 20 20 20 20 20 52 54 52 45 45 5f 49  B;.      RTREE_I
5f10: 53 5f 43 4f 52 52 55 50 54 28 70 52 74 72 65 65  S_CORRUPT(pRtree
5f20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
5f30: 2f 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 68  /* If no error h
5f40: 61 73 20 6f 63 63 75 72 72 65 64 20 73 6f 20 66  as occurred so f
5f50: 61 72 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  ar, check if the
5f60: 20 22 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72   "number of entr
5f70: 69 65 73 22 0a 20 20 2a 2a 20 66 69 65 6c 64 20  ies".  ** field 
5f80: 6f 6e 20 74 68 65 20 6e 6f 64 65 20 69 73 20 74  on the node is t
5f90: 6f 6f 20 6c 61 72 67 65 2e 20 49 66 20 73 6f 2c  oo large. If so,
5fa0: 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   set the return 
5fb0: 63 6f 64 65 20 74 6f 20 0a 20 20 2a 2a 20 53 51  code to .  ** SQ
5fc0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
5fd0: 42 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  B..  */.  if( pN
5fe0: 6f 64 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ode && rc==SQLIT
5ff0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
6000: 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3e 28 28 70  NCELL(pNode)>((p
6010: 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65  Rtree->iNodeSize
6020: 2d 34 29 2f 70 52 74 72 65 65 2d 3e 6e 42 79 74  -4)/pRtree->nByt
6030: 65 73 50 65 72 43 65 6c 6c 29 20 29 7b 0a 20 20  esPerCell) ){.  
6040: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6050: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20  CORRUPT_VTAB;.  
6060: 20 20 20 20 52 54 52 45 45 5f 49 53 5f 43 4f 52      RTREE_IS_COR
6070: 52 55 50 54 28 70 52 74 72 65 65 29 3b 0a 20 20  RUPT(pRtree);.  
6080: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
6090: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
60a0: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 21 3d 30      if( pNode!=0
60b0: 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65 52 65   ){.      nodeRe
60c0: 66 65 72 65 6e 63 65 28 70 50 61 72 65 6e 74 29  ference(pParent)
60d0: 3b 0a 20 20 20 20 20 20 6e 6f 64 65 48 61 73 68  ;.      nodeHash
60e0: 49 6e 73 65 72 74 28 70 52 74 72 65 65 2c 20 70  Insert(pRtree, p
60f0: 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Node);.    }else
6100: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
6110: 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
6120: 3b 0a 20 20 20 20 20 20 52 54 52 45 45 5f 49 53  ;.      RTREE_IS
6130: 5f 43 4f 52 52 55 50 54 28 70 52 74 72 65 65 29  _CORRUPT(pRtree)
6140: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4e  ;.    }.    *ppN
6150: 6f 64 65 20 3d 20 70 4e 6f 64 65 3b 0a 20 20 7d  ode = pNode;.  }
6160: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 4e  else{.    if( pN
6170: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 70 52 74  ode ){.      pRt
6180: 72 65 65 2d 3e 6e 4e 6f 64 65 52 65 66 2d 2d 3b  ree->nNodeRef--;
6190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
61a0: 72 65 65 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20  ree(pNode);.    
61b0: 7d 0a 20 20 20 20 2a 70 70 4e 6f 64 65 20 3d 20  }.    *ppNode = 
61c0: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
61d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 76   rc;.}../*.** Ov
61e0: 65 72 77 72 69 74 65 20 63 65 6c 6c 20 69 43 65  erwrite cell iCe
61f0: 6c 6c 20 6f 66 20 6e 6f 64 65 20 70 4e 6f 64 65  ll of node pNode
6200: 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
6210: 74 73 20 6f 66 20 70 43 65 6c 6c 2e 0a 2a 2f 0a  ts of pCell..*/.
6220: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65  static void node
6230: 4f 76 65 72 77 72 69 74 65 43 65 6c 6c 28 0a 20  OverwriteCell(. 
6240: 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20   Rtree *pRtree, 
6250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6260: 68 65 20 6f 76 65 72 61 6c 6c 20 52 2d 54 72 65  he overall R-Tre
6270: 65 20 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65  e */.  RtreeNode
6280: 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20   *pNode,        
6290: 20 20 2f 2a 20 54 68 65 20 6e 6f 64 65 20 69 6e    /* The node in
62a0: 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 65 6c  to which the cel
62b0: 6c 20 69 73 20 74 6f 20 62 65 20 77 72 69 74 74  l is to be writt
62c0: 65 6e 20 2a 2f 0a 20 20 52 74 72 65 65 43 65 6c  en */.  RtreeCel
62d0: 6c 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  l *pCell,       
62e0: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 74     /* The cell t
62f0: 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
6300: 20 69 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20   iCell          
6310: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
6320: 20 69 6e 74 6f 20 70 4e 6f 64 65 20 69 6e 74 6f   into pNode into
6330: 20 77 68 69 63 68 20 70 43 65 6c 6c 20 69 73 20   which pCell is 
6340: 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20  written */.){.  
6350: 69 6e 74 20 69 69 3b 0a 20 20 75 38 20 2a 70 20  int ii;.  u8 *p 
6360: 3d 20 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b  = &pNode->zData[
6370: 34 20 2b 20 70 52 74 72 65 65 2d 3e 6e 42 79 74  4 + pRtree->nByt
6380: 65 73 50 65 72 43 65 6c 6c 2a 69 43 65 6c 6c 5d  esPerCell*iCell]
6390: 3b 0a 20 20 70 20 2b 3d 20 77 72 69 74 65 49 6e  ;.  p += writeIn
63a0: 74 36 34 28 70 2c 20 70 43 65 6c 6c 2d 3e 69 52  t64(p, pCell->iR
63b0: 6f 77 69 64 29 3b 0a 20 20 66 6f 72 28 69 69 3d  owid);.  for(ii=
63c0: 30 3b 20 69 69 3c 70 52 74 72 65 65 2d 3e 6e 44  0; ii<pRtree->nD
63d0: 69 6d 32 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  im2; ii++){.    
63e0: 70 20 2b 3d 20 77 72 69 74 65 43 6f 6f 72 64 28  p += writeCoord(
63f0: 70 2c 20 26 70 43 65 6c 6c 2d 3e 61 43 6f 6f 72  p, &pCell->aCoor
6400: 64 5b 69 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 4e  d[ii]);.  }.  pN
6410: 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d 20 31  ode->isDirty = 1
6420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
6430: 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  e the cell with 
6440: 69 6e 64 65 78 20 69 43 65 6c 6c 20 66 72 6f 6d  index iCell from
6450: 20 6e 6f 64 65 20 70 4e 6f 64 65 2e 0a 2a 2f 0a   node pNode..*/.
6460: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65  static void node
6470: 44 65 6c 65 74 65 43 65 6c 6c 28 52 74 72 65 65  DeleteCell(Rtree
6480: 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e   *pRtree, RtreeN
6490: 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 69 6e 74 20  ode *pNode, int 
64a0: 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 44  iCell){.  u8 *pD
64b0: 73 74 20 3d 20 26 70 4e 6f 64 65 2d 3e 7a 44 61  st = &pNode->zDa
64c0: 74 61 5b 34 20 2b 20 70 52 74 72 65 65 2d 3e 6e  ta[4 + pRtree->n
64d0: 42 79 74 65 73 50 65 72 43 65 6c 6c 2a 69 43 65  BytesPerCell*iCe
64e0: 6c 6c 5d 3b 0a 20 20 75 38 20 2a 70 53 72 63 20  ll];.  u8 *pSrc 
64f0: 3d 20 26 70 44 73 74 5b 70 52 74 72 65 65 2d 3e  = &pDst[pRtree->
6500: 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 5d 3b 0a  nBytesPerCell];.
6510: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 4e    int nByte = (N
6520: 43 45 4c 4c 28 70 4e 6f 64 65 29 20 2d 20 69 43  CELL(pNode) - iC
6530: 65 6c 6c 20 2d 20 31 29 20 2a 20 70 52 74 72 65  ell - 1) * pRtre
6540: 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c  e->nBytesPerCell
6550: 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28 70 44 73 74  ;.  memmove(pDst
6560: 2c 20 70 53 72 63 2c 20 6e 42 79 74 65 29 3b 0a  , pSrc, nByte);.
6570: 20 20 77 72 69 74 65 49 6e 74 31 36 28 26 70 4e    writeInt16(&pN
6580: 6f 64 65 2d 3e 7a 44 61 74 61 5b 32 5d 2c 20 4e  ode->zData[2], N
6590: 43 45 4c 4c 28 70 4e 6f 64 65 29 2d 31 29 3b 0a  CELL(pNode)-1);.
65a0: 20 20 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79    pNode->isDirty
65b0: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 1;.}../*.** I
65c0: 6e 73 65 72 74 20 74 68 65 20 63 6f 6e 74 65 6e  nsert the conten
65d0: 74 73 20 6f 66 20 63 65 6c 6c 20 70 43 65 6c 6c  ts of cell pCell
65e0: 20 69 6e 74 6f 20 6e 6f 64 65 20 70 4e 6f 64 65   into node pNode
65f0: 2e 20 49 66 20 74 68 65 20 69 6e 73 65 72 74 0a  . If the insert.
6600: 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ** is successful
6610: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
6620: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
6630: 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68  re is not enough
6640: 20 66 72 65 65 20 73 70 61 63 65 20 69 6e 20 70   free space in p
6650: 4e 6f 64 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  Node, return SQL
6660: 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  ITE_FULL..*/.sta
6670: 74 69 63 20 69 6e 74 20 6e 6f 64 65 49 6e 73 65  tic int nodeInse
6680: 72 74 43 65 6c 6c 28 0a 20 20 52 74 72 65 65 20  rtCell(.  Rtree 
6690: 2a 70 52 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pRtree,        
66a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
66b0: 76 65 72 61 6c 6c 20 52 2d 54 72 65 65 20 2a 2f  verall R-Tree */
66c0: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e  .  RtreeNode *pN
66d0: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
66e0: 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 65   /* Write new ce
66f0: 6c 6c 20 69 6e 74 6f 20 74 68 69 73 20 6e 6f 64  ll into this nod
6700: 65 20 2a 2f 0a 20 20 52 74 72 65 65 43 65 6c 6c  e */.  RtreeCell
6710: 20 2a 70 43 65 6c 6c 20 20 20 20 20 20 20 20 20   *pCell         
6720: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
6730: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
6740: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 65 6c  */.){.  int nCel
6750: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
6760: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
6770: 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
6780: 20 69 6e 20 70 4e 6f 64 65 20 2a 2f 0a 20 20 69   in pNode */.  i
6790: 6e 74 20 6e 4d 61 78 43 65 6c 6c 3b 20 20 20 20  nt nMaxCell;    
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
67b0: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
67c0: 66 20 63 65 6c 6c 73 20 66 6f 72 20 70 4e 6f 64  f cells for pNod
67d0: 65 20 2a 2f 0a 0a 20 20 6e 4d 61 78 43 65 6c 6c  e */..  nMaxCell
67e0: 20 3d 20 28 70 52 74 72 65 65 2d 3e 69 4e 6f 64   = (pRtree->iNod
67f0: 65 53 69 7a 65 2d 34 29 2f 70 52 74 72 65 65 2d  eSize-4)/pRtree-
6800: 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 3b 0a  >nBytesPerCell;.
6810: 20 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28    nCell = NCELL(
6820: 70 4e 6f 64 65 29 3b 0a 0a 20 20 61 73 73 65 72  pNode);..  asser
6830: 74 28 20 6e 43 65 6c 6c 3c 3d 6e 4d 61 78 43 65  t( nCell<=nMaxCe
6840: 6c 6c 20 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c  ll );.  if( nCel
6850: 6c 3c 6e 4d 61 78 43 65 6c 6c 20 29 7b 0a 20 20  l<nMaxCell ){.  
6860: 20 20 6e 6f 64 65 4f 76 65 72 77 72 69 74 65 43    nodeOverwriteC
6870: 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ell(pRtree, pNod
6880: 65 2c 20 70 43 65 6c 6c 2c 20 6e 43 65 6c 6c 29  e, pCell, nCell)
6890: 3b 0a 20 20 20 20 77 72 69 74 65 49 6e 74 31 36  ;.    writeInt16
68a0: 28 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b 32  (&pNode->zData[2
68b0: 5d 2c 20 6e 43 65 6c 6c 2b 31 29 3b 0a 20 20 20  ], nCell+1);.   
68c0: 20 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20   pNode->isDirty 
68d0: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 1;.  }..  retu
68e0: 72 6e 20 28 6e 43 65 6c 6c 3d 3d 6e 4d 61 78 43  rn (nCell==nMaxC
68f0: 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ell);.}../*.** I
6900: 66 20 74 68 65 20 6e 6f 64 65 20 69 73 20 64 69  f the node is di
6910: 72 74 79 2c 20 77 72 69 74 65 20 69 74 20 6f 75  rty, write it ou
6920: 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
6930: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
6940: 20 6e 6f 64 65 57 72 69 74 65 28 52 74 72 65 65   nodeWrite(Rtree
6950: 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e   *pRtree, RtreeN
6960: 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69  ode *pNode){.  i
6970: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6980: 4b 3b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  K;.  if( pNode->
6990: 69 73 44 69 72 74 79 20 29 7b 0a 20 20 20 20 73  isDirty ){.    s
69a0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d  qlite3_stmt *p =
69b0: 20 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 4e   pRtree->pWriteN
69c0: 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f  ode;.    if( pNo
69d0: 64 65 2d 3e 69 4e 6f 64 65 20 29 7b 0a 20 20 20  de->iNode ){.   
69e0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
69f0: 69 6e 74 36 34 28 70 2c 20 31 2c 20 70 4e 6f 64  int64(p, 1, pNod
6a00: 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20 7d  e->iNode);.    }
6a10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
6a20: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2c  te3_bind_null(p,
6a30: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   1);.    }.    s
6a40: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
6a50: 28 70 2c 20 32 2c 20 70 4e 6f 64 65 2d 3e 7a 44  (p, 2, pNode->zD
6a60: 61 74 61 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f  ata, pRtree->iNo
6a70: 64 65 53 69 7a 65 2c 20 53 51 4c 49 54 45 5f 53  deSize, SQLITE_S
6a80: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
6a90: 74 65 33 5f 73 74 65 70 28 70 29 3b 0a 20 20 20  te3_step(p);.   
6aa0: 20 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20   pNode->isDirty 
6ab0: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
6ac0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 29 3b 0a  lite3_reset(p);.
6ad0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
6ae0: 5f 6e 75 6c 6c 28 70 2c 20 32 29 3b 0a 20 20 20  _null(p, 2);.   
6af0: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64   if( pNode->iNod
6b00: 65 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  e==0 && rc==SQLI
6b10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
6b20: 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20 3d 20 73 71  Node->iNode = sq
6b30: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
6b40: 74 5f 72 6f 77 69 64 28 70 52 74 72 65 65 2d 3e  t_rowid(pRtree->
6b50: 64 62 29 3b 0a 20 20 20 20 20 20 6e 6f 64 65 48  db);.      nodeH
6b60: 61 73 68 49 6e 73 65 72 74 28 70 52 74 72 65 65  ashInsert(pRtree
6b70: 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  , pNode);.    }.
6b80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
6ba0: 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
6bb0: 20 61 20 6e 6f 64 65 2e 20 49 66 20 74 68 65 20   a node. If the 
6bc0: 6e 6f 64 65 20 69 73 20 64 69 72 74 79 20 61 6e  node is dirty an
6bd0: 64 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 0a  d the reference.
6be0: 2a 2a 20 63 6f 75 6e 74 20 64 72 6f 70 73 20 74  ** count drops t
6bf0: 6f 20 7a 65 72 6f 2c 20 74 68 65 20 6e 6f 64 65  o zero, the node
6c00: 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
6c10: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6c20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6c30: 6e 6f 64 65 52 65 6c 65 61 73 65 28 52 74 72 65  nodeRelease(Rtre
6c40: 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65  e *pRtree, Rtree
6c50: 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20  Node *pNode){.  
6c60: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6c70: 4f 4b 3b 0a 20 20 69 66 28 20 70 4e 6f 64 65 20  OK;.  if( pNode 
6c80: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6c90: 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
6ca0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 74 72      assert( pRtr
6cb0: 65 65 2d 3e 6e 4e 6f 64 65 52 65 66 3e 30 20 29  ee->nNodeRef>0 )
6cc0: 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 52 65  ;.    pNode->nRe
6cd0: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f  f--;.    if( pNo
6ce0: 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
6cf0: 20 20 20 20 20 70 52 74 72 65 65 2d 3e 6e 4e 6f       pRtree->nNo
6d00: 64 65 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 69  deRef--;.      i
6d10: 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d  f( pNode->iNode=
6d20: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  =1 ){.        pR
6d30: 74 72 65 65 2d 3e 69 44 65 70 74 68 20 3d 20 2d  tree->iDepth = -
6d40: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
6d50: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 70 50 61 72   if( pNode->pPar
6d60: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ent ){.        r
6d70: 63 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28  c = nodeRelease(
6d80: 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2d 3e 70  pRtree, pNode->p
6d90: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d  Parent);.      }
6da0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6db0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6dc0: 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 57 72 69      rc = nodeWri
6dd0: 74 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  te(pRtree, pNode
6de0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6df0: 20 6e 6f 64 65 48 61 73 68 44 65 6c 65 74 65 28   nodeHashDelete(
6e00: 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a  pRtree, pNode);.
6e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6e20: 65 65 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 7d  ee(pNode);.    }
6e30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6e40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6e50: 6e 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  n the 64-bit int
6e60: 65 67 65 72 20 76 61 6c 75 65 20 61 73 73 6f 63  eger value assoc
6e70: 69 61 74 65 64 20 77 69 74 68 20 63 65 6c 6c 20  iated with cell 
6e80: 69 43 65 6c 6c 20 6f 66 0a 2a 2a 20 6e 6f 64 65  iCell of.** node
6e90: 20 70 4e 6f 64 65 2e 20 49 66 20 70 4e 6f 64 65   pNode. If pNode
6ea0: 20 69 73 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c   is a leaf node,
6eb0: 20 74 68 69 73 20 69 73 20 61 20 72 6f 77 69 64   this is a rowid
6ec0: 2e 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 61 6e  . If it is.** an
6ed0: 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20   internal node, 
6ee0: 74 68 65 6e 20 74 68 65 20 36 34 2d 62 69 74 20  then the 64-bit 
6ef0: 69 6e 74 65 67 65 72 20 69 73 20 61 20 63 68 69  integer is a chi
6f00: 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  ld page number..
6f10: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6e 6f  */.static i64 no
6f20: 64 65 47 65 74 52 6f 77 69 64 28 0a 20 20 52 74  deGetRowid(.  Rt
6f30: 72 65 65 20 2a 70 52 74 72 65 65 2c 20 20 20 20  ree *pRtree,    
6f40: 20 20 20 2f 2a 20 54 68 65 20 6f 76 65 72 61 6c     /* The overal
6f50: 6c 20 52 2d 54 72 65 65 20 2a 2f 0a 20 20 52 74  l R-Tree */.  Rt
6f60: 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20  reeNode *pNode, 
6f70: 20 20 20 2f 2a 20 54 68 65 20 6e 6f 64 65 20 66     /* The node f
6f80: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
6f90: 72 61 63 74 20 74 68 65 20 49 44 20 2a 2f 0a 20  ract the ID */. 
6fa0: 20 69 6e 74 20 69 43 65 6c 6c 20 20 20 20 20 20   int iCell      
6fb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
6fc0: 6c 20 69 6e 64 65 78 20 66 72 6f 6d 20 77 68 69  l index from whi
6fd0: 63 68 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  ch to extract th
6fe0: 65 20 49 44 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  e ID */.){.  ass
6ff0: 65 72 74 28 20 69 43 65 6c 6c 3c 4e 43 45 4c 4c  ert( iCell<NCELL
7000: 28 70 4e 6f 64 65 29 20 29 3b 0a 20 20 72 65 74  (pNode) );.  ret
7010: 75 72 6e 20 72 65 61 64 49 6e 74 36 34 28 26 70  urn readInt64(&p
7020: 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b 34 20 2b 20  Node->zData[4 + 
7030: 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65  pRtree->nBytesPe
7040: 72 43 65 6c 6c 2a 69 43 65 6c 6c 5d 29 3b 0a 7d  rCell*iCell]);.}
7050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 63  ../*.** Return c
7060: 6f 6f 72 64 69 6e 61 74 65 20 69 43 6f 6f 72 64  oordinate iCoord
7070: 20 66 72 6f 6d 20 63 65 6c 6c 20 69 43 65 6c 6c   from cell iCell
7080: 20 69 6e 20 6e 6f 64 65 20 70 4e 6f 64 65 2e 0a   in node pNode..
7090: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
70a0: 6f 64 65 47 65 74 43 6f 6f 72 64 28 0a 20 20 52  odeGetCoord(.  R
70b0: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 20 20  tree *pRtree,   
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
70d0: 68 65 20 6f 76 65 72 61 6c 6c 20 52 2d 54 72 65  he overall R-Tre
70e0: 65 20 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65  e */.  RtreeNode
70f0: 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20   *pNode,        
7100: 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f 64 65 20      /* The node 
7110: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78  from which to ex
7120: 74 72 61 63 74 20 61 20 63 6f 6f 72 64 69 6e 61  tract a coordina
7130: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  te */.  int iCel
7140: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
7150: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
7160: 78 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 77 69  x of the cell wi
7170: 74 68 69 6e 20 74 68 65 20 6e 6f 64 65 20 2a 2f  thin the node */
7180: 0a 20 20 69 6e 74 20 69 43 6f 6f 72 64 2c 20 20  .  int iCoord,  
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71a0: 2f 2a 20 57 68 69 63 68 20 63 6f 6f 72 64 69 6e  /* Which coordin
71b0: 61 74 65 20 74 6f 20 65 78 74 72 61 63 74 20 2a  ate to extract *
71c0: 2f 0a 20 20 52 74 72 65 65 43 6f 6f 72 64 20 2a  /.  RtreeCoord *
71d0: 70 43 6f 6f 72 64 20 20 20 20 20 20 20 20 20 20  pCoord          
71e0: 20 2f 2a 20 4f 55 54 3a 20 53 70 61 63 65 20 74   /* OUT: Space t
71f0: 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 20 74  o write result t
7200: 6f 20 2a 2f 0a 29 7b 0a 20 20 72 65 61 64 43 6f  o */.){.  readCo
7210: 6f 72 64 28 26 70 4e 6f 64 65 2d 3e 7a 44 61 74  ord(&pNode->zDat
7220: 61 5b 31 32 20 2b 20 70 52 74 72 65 65 2d 3e 6e  a[12 + pRtree->n
7230: 42 79 74 65 73 50 65 72 43 65 6c 6c 2a 69 43 65  BytesPerCell*iCe
7240: 6c 6c 20 2b 20 34 2a 69 43 6f 6f 72 64 5d 2c 20  ll + 4*iCoord], 
7250: 70 43 6f 6f 72 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pCoord);.}../*.*
7260: 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 63 65  * Deserialize ce
7270: 6c 6c 20 69 43 65 6c 6c 20 6f 66 20 6e 6f 64 65  ll iCell of node
7280: 20 70 4e 6f 64 65 2e 20 50 6f 70 75 6c 61 74 65   pNode. Populate
7290: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
72a0: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
72b0: 70 43 65 6c 6c 20 77 69 74 68 20 74 68 65 20 72  pCell with the r
72c0: 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  esults..*/.stati
72d0: 63 20 76 6f 69 64 20 6e 6f 64 65 47 65 74 43 65  c void nodeGetCe
72e0: 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74  ll(.  Rtree *pRt
72f0: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
7300: 20 20 20 2f 2a 20 54 68 65 20 6f 76 65 72 61 6c     /* The overal
7310: 6c 20 52 2d 54 72 65 65 20 2a 2f 0a 20 20 52 74  l R-Tree */.  Rt
7320: 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20  reeNode *pNode, 
7330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7340: 65 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e  e node containin
7350: 67 20 74 68 65 20 63 65 6c 6c 20 74 6f 20 62 65  g the cell to be
7360: 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 69   read */.  int i
7370: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
7380: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
7390: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74   of the cell wit
73a0: 68 69 6e 20 74 68 65 20 6e 6f 64 65 20 2a 2f 0a  hin the node */.
73b0: 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43 65    RtreeCell *pCe
73c0: 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ll             /
73d0: 2a 20 4f 55 54 3a 20 57 72 69 74 65 20 74 68 65  * OUT: Write the
73e0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 68   cell contents h
73f0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ere */.){.  u8 *
7400: 70 44 61 74 61 3b 0a 20 20 52 74 72 65 65 43 6f  pData;.  RtreeCo
7410: 6f 72 64 20 2a 70 43 6f 6f 72 64 3b 0a 20 20 69  ord *pCoord;.  i
7420: 6e 74 20 69 69 20 3d 20 30 3b 0a 20 20 70 43 65  nt ii = 0;.  pCe
7430: 6c 6c 2d 3e 69 52 6f 77 69 64 20 3d 20 6e 6f 64  ll->iRowid = nod
7440: 65 47 65 74 52 6f 77 69 64 28 70 52 74 72 65 65  eGetRowid(pRtree
7450: 2c 20 70 4e 6f 64 65 2c 20 69 43 65 6c 6c 29 3b  , pNode, iCell);
7460: 0a 20 20 70 44 61 74 61 20 3d 20 70 4e 6f 64 65  .  pData = pNode
7470: 2d 3e 7a 44 61 74 61 20 2b 20 28 31 32 20 2b 20  ->zData + (12 + 
7480: 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65  pRtree->nBytesPe
7490: 72 43 65 6c 6c 2a 69 43 65 6c 6c 29 3b 0a 20 20  rCell*iCell);.  
74a0: 70 43 6f 6f 72 64 20 3d 20 70 43 65 6c 6c 2d 3e  pCoord = pCell->
74b0: 61 43 6f 6f 72 64 3b 0a 20 20 64 6f 7b 0a 20 20  aCoord;.  do{.  
74c0: 20 20 72 65 61 64 43 6f 6f 72 64 28 70 44 61 74    readCoord(pDat
74d0: 61 2c 20 26 70 43 6f 6f 72 64 5b 69 69 5d 29 3b  a, &pCoord[ii]);
74e0: 0a 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70  .    readCoord(p
74f0: 44 61 74 61 2b 34 2c 20 26 70 43 6f 6f 72 64 5b  Data+4, &pCoord[
7500: 69 69 2b 31 5d 29 3b 0a 20 20 20 20 70 44 61 74  ii+1]);.    pDat
7510: 61 20 2b 3d 20 38 3b 0a 20 20 20 20 69 69 20 2b  a += 8;.    ii +
7520: 3d 20 32 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  = 2;.  }while( i
7530: 69 3c 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32 20  i<pRtree->nDim2 
7540: 29 3b 0a 7d 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72  );.}.../* Forwar
7550: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f  d declaration fo
7560: 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74  r the function t
7570: 68 61 74 20 64 6f 65 73 20 74 68 65 20 77 6f 72  hat does the wor
7580: 6b 20 6f 66 0a 2a 2a 20 74 68 65 20 76 69 72 74  k of.** the virt
7590: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
75a0: 20 78 43 72 65 61 74 65 28 29 20 61 6e 64 20 78   xCreate() and x
75b0: 43 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64  Connect() method
75c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
75d0: 20 72 74 72 65 65 49 6e 69 74 28 0a 20 20 73 71   rtreeInit(.  sq
75e0: 6c 69 74 65 33 20 2a 2c 20 76 6f 69 64 20 2a 2c  lite3 *, void *,
75f0: 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72   int, const char
7600: 20 2a 63 6f 6e 73 74 2a 2c 20 73 71 6c 69 74 65   *const*, sqlite
7610: 33 5f 76 74 61 62 20 2a 2a 2c 20 63 68 61 72 20  3_vtab **, char 
7620: 2a 2a 2c 20 69 6e 74 0a 29 3b 0a 0a 2f 2a 20 0a  **, int.);../* .
7630: 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c  ** Rtree virtual
7640: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43   table module xC
7650: 72 65 61 74 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f  reate method..*/
7660: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65  .static int rtre
7670: 65 43 72 65 61 74 65 28 0a 20 20 73 71 6c 69 74  eCreate(.  sqlit
7680: 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a  e3 *db,.  void *
7690: 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  pAux,.  int argc
76a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  , const char *co
76b0: 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69  nst*argv,.  sqli
76c0: 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61  te3_vtab **ppVta
76d0: 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  b,.  char **pzEr
76e0: 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 72 74  r.){.  return rt
76f0: 72 65 65 49 6e 69 74 28 64 62 2c 20 70 41 75 78  reeInit(db, pAux
7700: 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 70 70  , argc, argv, pp
7710: 56 74 61 62 2c 20 70 7a 45 72 72 2c 20 31 29 3b  Vtab, pzErr, 1);
7720: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65  .}../* .** Rtree
7730: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
7740: 6f 64 75 6c 65 20 78 43 6f 6e 6e 65 63 74 20 6d  odule xConnect m
7750: 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
7760: 20 69 6e 74 20 72 74 72 65 65 43 6f 6e 6e 65 63   int rtreeConnec
7770: 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
7780: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a  ,.  void *pAux,.
7790: 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73    int argc, cons
77a0: 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72  t char *const*ar
77b0: 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  gv,.  sqlite3_vt
77c0: 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63  ab **ppVtab,.  c
77d0: 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
77e0: 20 72 65 74 75 72 6e 20 72 74 72 65 65 49 6e 69   return rtreeIni
77f0: 74 28 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63  t(db, pAux, argc
7800: 2c 20 61 72 67 76 2c 20 70 70 56 74 61 62 2c 20  , argv, ppVtab, 
7810: 70 7a 45 72 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  pzErr, 0);.}../*
7820: 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
7830: 65 20 72 2d 74 72 65 65 20 72 65 66 65 72 65 6e  e r-tree referen
7840: 63 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 73 74 61  ce count..*/.sta
7850: 74 69 63 20 76 6f 69 64 20 72 74 72 65 65 52 65  tic void rtreeRe
7860: 66 65 72 65 6e 63 65 28 52 74 72 65 65 20 2a 70  ference(Rtree *p
7870: 52 74 72 65 65 29 7b 0a 20 20 70 52 74 72 65 65  Rtree){.  pRtree
7880: 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 7d 0a 0a 2f 2a  ->nBusy++;.}../*
7890: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
78a0: 65 20 72 2d 74 72 65 65 20 72 65 66 65 72 65 6e  e r-tree referen
78b0: 63 65 20 63 6f 75 6e 74 2e 20 57 68 65 6e 20 74  ce count. When t
78c0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
78d0: 6e 74 20 72 65 61 63 68 65 73 0a 2a 2a 20 7a 65  nt reaches.** ze
78e0: 72 6f 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ro the structure
78f0: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   is deleted..*/.
7900: 73 74 61 74 69 63 20 76 6f 69 64 20 72 74 72 65  static void rtre
7910: 65 52 65 6c 65 61 73 65 28 52 74 72 65 65 20 2a  eRelease(Rtree *
7920: 70 52 74 72 65 65 29 7b 0a 20 20 70 52 74 72 65  pRtree){.  pRtre
7930: 65 2d 3e 6e 42 75 73 79 2d 2d 3b 0a 20 20 69 66  e->nBusy--;.  if
7940: 28 20 70 52 74 72 65 65 2d 3e 6e 42 75 73 79 3d  ( pRtree->nBusy=
7950: 3d 30 20 29 7b 0a 20 20 20 20 70 52 74 72 65 65  =0 ){.    pRtree
7960: 2d 3e 69 6e 57 72 54 72 61 6e 73 20 3d 20 30 3b  ->inWrTrans = 0;
7970: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 74  .    assert( pRt
7980: 72 65 65 2d 3e 6e 43 75 72 73 6f 72 3d 3d 30 20  ree->nCursor==0 
7990: 29 3b 0a 20 20 20 20 6e 6f 64 65 42 6c 6f 62 52  );.    nodeBlobR
79a0: 65 73 65 74 28 70 52 74 72 65 65 29 3b 0a 20 20  eset(pRtree);.  
79b0: 20 20 61 73 73 65 72 74 28 20 70 52 74 72 65 65    assert( pRtree
79c0: 2d 3e 6e 4e 6f 64 65 52 65 66 3d 3d 30 20 7c 7c  ->nNodeRef==0 ||
79d0: 20 70 52 74 72 65 65 2d 3e 62 43 6f 72 72 75 70   pRtree->bCorrup
79e0: 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
79f0: 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65  _finalize(pRtree
7a00: 2d 3e 70 57 72 69 74 65 4e 6f 64 65 29 3b 0a 20  ->pWriteNode);. 
7a10: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
7a20: 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 44 65 6c  ize(pRtree->pDel
7a30: 65 74 65 4e 6f 64 65 29 3b 0a 20 20 20 20 73 71  eteNode);.    sq
7a40: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
7a50: 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69  Rtree->pReadRowi
7a60: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
7a70: 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d  finalize(pRtree-
7a80: 3e 70 57 72 69 74 65 52 6f 77 69 64 29 3b 0a 20  >pWriteRowid);. 
7a90: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
7aa0: 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 44 65 6c  ize(pRtree->pDel
7ab0: 65 74 65 52 6f 77 69 64 29 3b 0a 20 20 20 20 73  eteRowid);.    s
7ac0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
7ad0: 70 52 74 72 65 65 2d 3e 70 52 65 61 64 50 61 72  pRtree->pReadPar
7ae0: 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
7af0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65  3_finalize(pRtre
7b00: 65 2d 3e 70 57 72 69 74 65 50 61 72 65 6e 74 29  e->pWriteParent)
7b10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
7b20: 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e 70  nalize(pRtree->p
7b30: 44 65 6c 65 74 65 50 61 72 65 6e 74 29 3b 0a 20  DeleteParent);. 
7b40: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
7b50: 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 57 72 69  ize(pRtree->pWri
7b60: 74 65 41 75 78 29 3b 0a 20 20 20 20 73 71 6c 69  teAux);.    sqli
7b70: 74 65 33 5f 66 72 65 65 28 70 52 74 72 65 65 2d  te3_free(pRtree-
7b80: 3e 7a 52 65 61 64 41 75 78 53 71 6c 29 3b 0a 20  >zReadAuxSql);. 
7b90: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7ba0: 70 52 74 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  pRtree);.  }.}..
7bb0: 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72  /* .** Rtree vir
7bc0: 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
7bd0: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65  e xDisconnect me
7be0: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
7bf0: 69 6e 74 20 72 74 72 65 65 44 69 73 63 6f 6e 6e  int rtreeDisconn
7c00: 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ect(sqlite3_vtab
7c10: 20 2a 70 56 74 61 62 29 7b 0a 20 20 72 74 72 65   *pVtab){.  rtre
7c20: 65 52 65 6c 65 61 73 65 28 28 52 74 72 65 65 20  eRelease((Rtree 
7c30: 2a 29 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75  *)pVtab);.  retu
7c40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7c50: 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69  ./* .** Rtree vi
7c60: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
7c70: 6c 65 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68  le xDestroy meth
7c80: 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
7c90: 74 20 72 74 72 65 65 44 65 73 74 72 6f 79 28 73  t rtreeDestroy(s
7ca0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
7cb0: 61 62 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52  ab){.  Rtree *pR
7cc0: 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29  tree = (Rtree *)
7cd0: 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pVtab;.  int rc;
7ce0: 0a 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65  .  char *zCreate
7cf0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7d00: 74 66 28 0a 20 20 20 20 22 44 52 4f 50 20 54 41  tf(.    "DROP TA
7d10: 42 4c 45 20 27 25 71 27 2e 27 25 71 5f 6e 6f 64  BLE '%q'.'%q_nod
7d20: 65 27 3b 22 0a 20 20 20 20 22 44 52 4f 50 20 54  e';".    "DROP T
7d30: 41 42 4c 45 20 27 25 71 27 2e 27 25 71 5f 72 6f  ABLE '%q'.'%q_ro
7d40: 77 69 64 27 3b 22 0a 20 20 20 20 22 44 52 4f 50  wid';".    "DROP
7d50: 20 54 41 42 4c 45 20 27 25 71 27 2e 27 25 71 5f   TABLE '%q'.'%q_
7d60: 70 61 72 65 6e 74 27 3b 22 2c 0a 20 20 20 20 70  parent';",.    p
7d70: 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72  Rtree->zDb, pRtr
7d80: 65 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ee->zName, .    
7d90: 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74  pRtree->zDb, pRt
7da0: 72 65 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  ree->zName,.    
7db0: 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74  pRtree->zDb, pRt
7dc0: 72 65 65 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a  ree->zName.  );.
7dd0: 20 20 69 66 28 20 21 7a 43 72 65 61 74 65 20 29    if( !zCreate )
7de0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
7df0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
7e00: 7b 0a 20 20 20 20 6e 6f 64 65 42 6c 6f 62 52 65  {.    nodeBlobRe
7e10: 73 65 74 28 70 52 74 72 65 65 29 3b 0a 20 20 20  set(pRtree);.   
7e20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
7e30: 65 63 28 70 52 74 72 65 65 2d 3e 64 62 2c 20 7a  ec(pRtree->db, z
7e40: 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29  Create, 0, 0, 0)
7e50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
7e60: 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d  ee(zCreate);.  }
7e70: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7e80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 74 72 65  E_OK ){.    rtre
7e90: 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 29  eRelease(pRtree)
7ea0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
7eb0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74  rc;.}../* .** Rt
7ec0: 72 65 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ree virtual tabl
7ed0: 65 20 6d 6f 64 75 6c 65 20 78 4f 70 65 6e 20 6d  e module xOpen m
7ee0: 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
7ef0: 20 69 6e 74 20 72 74 72 65 65 4f 70 65 6e 28 73   int rtreeOpen(s
7f00: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
7f10: 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ab, sqlite3_vtab
7f20: 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73  _cursor **ppCurs
7f30: 6f 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  or){.  int rc = 
7f40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7f50: 52 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20  Rtree *pRtree = 
7f60: 28 52 74 72 65 65 20 2a 29 70 56 54 61 62 3b 0a  (Rtree *)pVTab;.
7f70: 20 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70    RtreeCursor *p
7f80: 43 73 72 3b 0a 0a 20 20 70 43 73 72 20 3d 20 28  Csr;..  pCsr = (
7f90: 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29 73 71  RtreeCursor *)sq
7fa0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73  lite3_malloc64(s
7fb0: 69 7a 65 6f 66 28 52 74 72 65 65 43 75 72 73 6f  izeof(RtreeCurso
7fc0: 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73 72 20  r));.  if( pCsr 
7fd0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 43  ){.    memset(pC
7fe0: 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74  sr, 0, sizeof(Rt
7ff0: 72 65 65 43 75 72 73 6f 72 29 29 3b 0a 20 20 20  reeCursor));.   
8000: 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61   pCsr->base.pVta
8010: 62 20 3d 20 70 56 54 61 62 3b 0a 20 20 20 20 72  b = pVTab;.    r
8020: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8030: 20 20 20 70 52 74 72 65 65 2d 3e 6e 43 75 72 73     pRtree->nCurs
8040: 6f 72 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 43  or++;.  }.  *ppC
8050: 75 72 73 6f 72 20 3d 20 28 73 71 6c 69 74 65 33  ursor = (sqlite3
8060: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 29 70  _vtab_cursor *)p
8070: 43 73 72 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  Csr;..  return r
8080: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  c;.}.../*.** Fre
8090: 65 20 74 68 65 20 52 74 72 65 65 43 75 72 73 6f  e the RtreeCurso
80a0: 72 2e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 20  r.aConstraint[] 
80b0: 61 72 72 61 79 20 61 6e 64 20 69 74 73 20 63 6f  array and its co
80c0: 6e 74 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntents..*/.stati
80d0: 63 20 76 6f 69 64 20 66 72 65 65 43 75 72 73 6f  c void freeCurso
80e0: 72 43 6f 6e 73 74 72 61 69 6e 74 73 28 52 74 72  rConstraints(Rtr
80f0: 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b  eeCursor *pCsr){
8100: 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 43 6f  .  if( pCsr->aCo
8110: 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
8120: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8140: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
8150: 20 74 68 72 6f 75 67 68 20 63 6f 6e 73 74 72 61   through constra
8160: 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  int array */.   
8170: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
8180: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
8190: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
81a0: 65 33 5f 72 74 72 65 65 5f 71 75 65 72 79 5f 69  e3_rtree_query_i
81b0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 43 73  nfo *pInfo = pCs
81c0: 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  r->aConstraint[i
81d0: 5d 2e 70 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  ].pInfo;.      i
81e0: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
81f0: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 78      if( pInfo->x
8200: 44 65 6c 55 73 65 72 20 29 20 70 49 6e 66 6f 2d  DelUser ) pInfo-
8210: 3e 78 44 65 6c 55 73 65 72 28 70 49 6e 66 6f 2d  >xDelUser(pInfo-
8220: 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
8230: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
8240: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nfo);.      }.  
8250: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
8260: 66 72 65 65 28 70 43 73 72 2d 3e 61 43 6f 6e 73  free(pCsr->aCons
8270: 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 70 43 73  traint);.    pCs
8280: 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  r->aConstraint =
8290: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a   0;.  }.}../* .*
82a0: 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c 20  * Rtree virtual 
82b0: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6c  table module xCl
82c0: 6f 73 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  ose method..*/.s
82d0: 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 43  tatic int rtreeC
82e0: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61  lose(sqlite3_vta
82f0: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a  b_cursor *cur){.
8300: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 20    Rtree *pRtree 
8310: 3d 20 28 52 74 72 65 65 20 2a 29 28 63 75 72 2d  = (Rtree *)(cur-
8320: 3e 70 56 74 61 62 29 3b 0a 20 20 69 6e 74 20 69  >pVtab);.  int i
8330: 69 3b 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72  i;.  RtreeCursor
8340: 20 2a 70 43 73 72 20 3d 20 28 52 74 72 65 65 43   *pCsr = (RtreeC
8350: 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 61  ursor *)cur;.  a
8360: 73 73 65 72 74 28 20 70 52 74 72 65 65 2d 3e 6e  ssert( pRtree->n
8370: 43 75 72 73 6f 72 3e 30 20 29 3b 0a 20 20 66 72  Cursor>0 );.  fr
8380: 65 65 43 75 72 73 6f 72 43 6f 6e 73 74 72 61 69  eeCursorConstrai
8390: 6e 74 73 28 70 43 73 72 29 3b 0a 20 20 73 71 6c  nts(pCsr);.  sql
83a0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43  ite3_finalize(pC
83b0: 73 72 2d 3e 70 52 65 61 64 41 75 78 29 3b 0a 20  sr->pReadAux);. 
83c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
83d0: 73 72 2d 3e 61 50 6f 69 6e 74 29 3b 0a 20 20 66  sr->aPoint);.  f
83e0: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 52 54 52 45  or(ii=0; ii<RTRE
83f0: 45 5f 43 41 43 48 45 5f 53 5a 3b 20 69 69 2b 2b  E_CACHE_SZ; ii++
8400: 29 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52  ) nodeRelease(pR
8410: 74 72 65 65 2c 20 70 43 73 72 2d 3e 61 4e 6f 64  tree, pCsr->aNod
8420: 65 5b 69 69 5d 29 3b 0a 20 20 73 71 6c 69 74 65  e[ii]);.  sqlite
8430: 33 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20 20  3_free(pCsr);.  
8440: 70 52 74 72 65 65 2d 3e 6e 43 75 72 73 6f 72 2d  pRtree->nCursor-
8450: 2d 3b 0a 20 20 6e 6f 64 65 42 6c 6f 62 52 65 73  -;.  nodeBlobRes
8460: 65 74 28 70 52 74 72 65 65 29 3b 0a 20 20 72 65  et(pRtree);.  re
8470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8480: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 74 72 65 65 20 76  }../*.** Rtree v
8490: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
84a0: 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f 64 2e  ule xEof method.
84b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  .**.** Return no
84c0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 63 75  n-zero if the cu
84d0: 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 63 75  rsor does not cu
84e0: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f  rrently point to
84f0: 20 61 20 76 61 6c 69 64 20 0a 2a 2a 20 72 65 63   a valid .** rec
8500: 6f 72 64 20 28 69 2e 65 20 69 66 20 74 68 65 20  ord (i.e if the 
8510: 73 63 61 6e 20 68 61 73 20 66 69 6e 69 73 68 65  scan has finishe
8520: 64 29 2c 20 6f 72 20 7a 65 72 6f 20 6f 74 68 65  d), or zero othe
8530: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
8540: 20 69 6e 74 20 72 74 72 65 65 45 6f 66 28 73 71   int rtreeEof(sq
8550: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
8560: 72 20 2a 63 75 72 29 7b 0a 20 20 52 74 72 65 65  r *cur){.  Rtree
8570: 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
8580: 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29 63 75  RtreeCursor *)cu
8590: 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 73 72  r;.  return pCsr
85a0: 2d 3e 61 74 45 4f 46 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->atEOF;.}../*.*
85b0: 2a 20 43 6f 6e 76 65 72 74 20 72 61 77 20 62 69  * Convert raw bi
85c0: 74 73 20 66 72 6f 6d 20 74 68 65 20 6f 6e 2d 64  ts from the on-d
85d0: 69 73 6b 20 52 54 72 65 65 20 72 65 63 6f 72 64  isk RTree record
85e0: 20 69 6e 74 6f 20 61 20 63 6f 6f 72 64 69 6e 61   into a coordina
85f0: 74 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65  te value..** The
8600: 20 6f 6e 2d 64 69 73 6b 20 66 6f 72 6d 61 74 20   on-disk format 
8610: 69 73 20 62 69 67 2d 65 6e 64 69 61 6e 20 61 6e  is big-endian an
8620: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6f  d needs to be co
8630: 6e 76 65 72 74 65 64 20 66 6f 72 20 6c 69 74 74  nverted for litt
8640: 6c 65 2d 0a 2a 2a 20 65 6e 64 69 61 6e 20 70 6c  le-.** endian pl
8650: 61 74 66 6f 72 6d 73 2e 20 20 54 68 65 20 6f 6e  atforms.  The on
8660: 2d 64 69 73 6b 20 72 65 63 6f 72 64 20 73 74 6f  -disk record sto
8670: 72 65 73 20 69 6e 74 65 67 65 72 20 63 6f 6f 72  res integer coor
8680: 64 69 6e 61 74 65 73 20 69 66 0a 2a 2a 20 65 49  dinates if.** eI
8690: 6e 74 20 69 73 20 74 72 75 65 20 61 6e 64 20 69  nt is true and i
86a0: 74 20 73 74 6f 72 65 73 20 33 32 2d 62 69 74 20  t stores 32-bit 
86b0: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 72  floating point r
86c0: 65 63 6f 72 64 73 20 69 66 20 65 49 6e 74 20 69  ecords if eInt i
86d0: 73 0a 2a 2a 20 66 61 6c 73 65 2e 20 20 61 5b 5d  s.** false.  a[]
86e0: 20 69 73 20 74 68 65 20 66 6f 75 72 20 62 79 74   is the four byt
86f0: 65 73 20 6f 66 20 74 68 65 20 6f 6e 2d 64 69 73  es of the on-dis
8700: 6b 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 64  k record to be d
8710: 65 63 6f 64 65 64 2e 0a 2a 2a 20 53 74 6f 72 65  ecoded..** Store
8720: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
8730: 22 72 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  "r"..**.** There
8740: 20 61 72 65 20 66 69 76 65 20 76 65 72 73 69 6f   are five versio
8750: 6e 73 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  ns of this macro
8760: 2e 20 20 54 68 65 20 6c 61 73 74 20 6f 6e 65 20  .  The last one 
8770: 69 73 20 67 65 6e 65 72 69 63 2e 20 20 54 68 65  is generic.  The
8780: 0a 2a 2a 20 6f 74 68 65 72 20 66 6f 75 72 20 61  .** other four a
8790: 72 65 20 76 61 72 69 6f 75 73 20 61 72 63 68 69  re various archi
87a0: 74 65 63 74 75 72 65 73 2d 73 70 65 63 69 66 69  tectures-specifi
87b0: 63 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  c optimizations.
87c0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 42  .*/.#if SQLITE_B
87d0: 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 20 26  YTEORDER==1234 &
87e0: 26 20 4d 53 56 43 5f 56 45 52 53 49 4f 4e 3e 3d  & MSVC_VERSION>=
87f0: 31 33 30 30 0a 23 64 65 66 69 6e 65 20 52 54 52  1300.#define RTR
8800: 45 45 5f 44 45 43 4f 44 45 5f 43 4f 4f 52 44 28  EE_DECODE_COORD(
8810: 65 49 6e 74 2c 20 61 2c 20 72 29 20 7b 20 20 20  eInt, a, r) {   
8820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8830: 20 20 20 20 20 5c 0a 20 20 20 20 52 74 72 65 65       \.    Rtree
8840: 43 6f 6f 72 64 20 63 3b 20 20 20 20 2f 2a 20 43  Coord c;    /* C
8850: 6f 6f 72 64 69 6e 61 74 65 20 64 65 63 6f 64 65  oordinate decode
8860: 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  d */            
8870: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 2e 75         \.    c.u
8880: 20 3d 20 5f 62 79 74 65 73 77 61 70 5f 75 6c 6f   = _byteswap_ulo
8890: 6e 67 28 2a 28 75 33 32 2a 29 61 29 3b 20 20 20  ng(*(u32*)a);   
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 72           \.    r
88c0: 20 3d 20 65 49 6e 74 20 3f 20 28 73 71 6c 69 74   = eInt ? (sqlit
88d0: 65 33 5f 72 74 72 65 65 5f 64 62 6c 29 63 2e 69  e3_rtree_dbl)c.i
88e0: 20 3a 20 28 73 71 6c 69 74 65 33 5f 72 74 72 65   : (sqlite3_rtre
88f0: 65 5f 64 62 6c 29 63 2e 66 3b 20 5c 0a 7d 0a 23  e_dbl)c.f; \.}.#
8900: 65 6c 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45  elif SQLITE_BYTE
8910: 4f 52 44 45 52 3d 3d 31 32 33 34 20 26 26 20 47  ORDER==1234 && G
8920: 43 43 5f 56 45 52 53 49 4f 4e 3e 3d 34 30 30 33  CC_VERSION>=4003
8930: 30 30 30 0a 23 64 65 66 69 6e 65 20 52 54 52 45  000.#define RTRE
8940: 45 5f 44 45 43 4f 44 45 5f 43 4f 4f 52 44 28 65  E_DECODE_COORD(e
8950: 49 6e 74 2c 20 61 2c 20 72 29 20 7b 20 20 20 20  Int, a, r) {    
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8970: 20 20 20 20 5c 0a 20 20 20 20 52 74 72 65 65 43      \.    RtreeC
8980: 6f 6f 72 64 20 63 3b 20 20 20 20 2f 2a 20 43 6f  oord c;    /* Co
8990: 6f 72 64 69 6e 61 74 65 20 64 65 63 6f 64 65 64  ordinate decoded
89a0: 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
89b0: 20 20 20 20 20 20 5c 0a 20 20 20 20 63 2e 75 20        \.    c.u 
89c0: 3d 20 5f 5f 62 75 69 6c 74 69 6e 5f 62 73 77 61  = __builtin_bswa
89d0: 70 33 32 28 2a 28 75 33 32 2a 29 61 29 3b 20 20  p32(*(u32*)a);  
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89f0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 72 20          \.    r 
8a00: 3d 20 65 49 6e 74 20 3f 20 28 73 71 6c 69 74 65  = eInt ? (sqlite
8a10: 33 5f 72 74 72 65 65 5f 64 62 6c 29 63 2e 69 20  3_rtree_dbl)c.i 
8a20: 3a 20 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65  : (sqlite3_rtree
8a30: 5f 64 62 6c 29 63 2e 66 3b 20 5c 0a 7d 0a 23 65  _dbl)c.f; \.}.#e
8a40: 6c 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  lif SQLITE_BYTEO
8a50: 52 44 45 52 3d 3d 31 32 33 34 0a 23 64 65 66 69  RDER==1234.#defi
8a60: 6e 65 20 52 54 52 45 45 5f 44 45 43 4f 44 45 5f  ne RTREE_DECODE_
8a70: 43 4f 4f 52 44 28 65 49 6e 74 2c 20 61 2c 20 72  COORD(eInt, a, r
8a80: 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
8a90: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
8aa0: 20 52 74 72 65 65 43 6f 6f 72 64 20 63 3b 20 20   RtreeCoord c;  
8ab0: 20 20 2f 2a 20 43 6f 6f 72 64 69 6e 61 74 65 20    /* Coordinate 
8ac0: 64 65 63 6f 64 65 64 20 2a 2f 20 20 20 20 20 20  decoded */      
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
8ae0: 20 20 20 6d 65 6d 63 70 79 28 26 63 2e 75 2c 61     memcpy(&c.u,a
8af0: 2c 34 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ,4);            
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
8b20: 0a 20 20 20 20 63 2e 75 20 3d 20 28 28 63 2e 75  .    c.u = ((c.u
8b30: 3e 3e 32 34 29 26 30 78 66 66 29 7c 28 28 63 2e  >>24)&0xff)|((c.
8b40: 75 3e 3e 38 29 26 30 78 66 66 30 30 29 7c 20 20  u>>8)&0xff00)|  
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 28 28 63   \.          ((c
8b70: 2e 75 26 30 78 66 66 29 3c 3c 32 34 29 7c 28 28  .u&0xff)<<24)|((
8b80: 63 2e 75 26 30 78 66 66 30 30 29 3c 3c 38 29 3b  c.u&0xff00)<<8);
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 20 20 5c 0a 20 20 20 20 72 20 3d 20 65 49 6e     \.    r = eIn
8bb0: 74 20 3f 20 28 73 71 6c 69 74 65 33 5f 72 74 72  t ? (sqlite3_rtr
8bc0: 65 65 5f 64 62 6c 29 63 2e 69 20 3a 20 28 73 71  ee_dbl)c.i : (sq
8bd0: 6c 69 74 65 33 5f 72 74 72 65 65 5f 64 62 6c 29  lite3_rtree_dbl)
8be0: 63 2e 66 3b 20 5c 0a 7d 0a 23 65 6c 69 66 20 53  c.f; \.}.#elif S
8bf0: 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d  QLITE_BYTEORDER=
8c00: 3d 34 33 32 31 0a 23 64 65 66 69 6e 65 20 52 54  =4321.#define RT
8c10: 52 45 45 5f 44 45 43 4f 44 45 5f 43 4f 4f 52 44  REE_DECODE_COORD
8c20: 28 65 49 6e 74 2c 20 61 2c 20 72 29 20 7b 20 20  (eInt, a, r) {  
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c40: 20 20 20 20 20 20 5c 0a 20 20 20 20 52 74 72 65        \.    Rtre
8c50: 65 43 6f 6f 72 64 20 63 3b 20 20 20 20 2f 2a 20  eCoord c;    /* 
8c60: 43 6f 6f 72 64 69 6e 61 74 65 20 64 65 63 6f 64  Coordinate decod
8c70: 65 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ed */           
8c80: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 6d 65          \.    me
8c90: 6d 63 70 79 28 26 63 2e 75 2c 61 2c 34 29 3b 20  mcpy(&c.u,a,4); 
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cc0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
8cd0: 72 20 3d 20 65 49 6e 74 20 3f 20 28 73 71 6c 69  r = eInt ? (sqli
8ce0: 74 65 33 5f 72 74 72 65 65 5f 64 62 6c 29 63 2e  te3_rtree_dbl)c.
8cf0: 69 20 3a 20 28 73 71 6c 69 74 65 33 5f 72 74 72  i : (sqlite3_rtr
8d00: 65 65 5f 64 62 6c 29 63 2e 66 3b 20 5c 0a 7d 0a  ee_dbl)c.f; \.}.
8d10: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 52 54  #else.#define RT
8d20: 52 45 45 5f 44 45 43 4f 44 45 5f 43 4f 4f 52 44  REE_DECODE_COORD
8d30: 28 65 49 6e 74 2c 20 61 2c 20 72 29 20 7b 20 20  (eInt, a, r) {  
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 20 20 20 20 20 20 5c 0a 20 20 20 20 52 74 72 65        \.    Rtre
8d60: 65 43 6f 6f 72 64 20 63 3b 20 20 20 20 2f 2a 20  eCoord c;    /* 
8d70: 43 6f 6f 72 64 69 6e 61 74 65 20 64 65 63 6f 64  Coordinate decod
8d80: 65 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ed */           
8d90: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 2e          \.    c.
8da0: 75 20 3d 20 28 28 75 33 32 29 61 5b 30 5d 3c 3c  u = ((u32)a[0]<<
8db0: 32 34 29 20 2b 20 28 28 75 33 32 29 61 5b 31 5d  24) + ((u32)a[1]
8dc0: 3c 3c 31 36 29 20 20 20 20 20 20 20 20 20 20 20  <<16)           
8dd0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
8de0: 20 20 20 20 20 20 20 2b 28 28 75 33 32 29 61 5b         +((u32)a[
8df0: 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 20 20  2]<<8) + a[3];  
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
8e20: 20 20 72 20 3d 20 65 49 6e 74 20 3f 20 28 73 71    r = eInt ? (sq
8e30: 6c 69 74 65 33 5f 72 74 72 65 65 5f 64 62 6c 29  lite3_rtree_dbl)
8e40: 63 2e 69 20 3a 20 28 73 71 6c 69 74 65 33 5f 72  c.i : (sqlite3_r
8e50: 74 72 65 65 5f 64 62 6c 29 63 2e 66 3b 20 5c 0a  tree_dbl)c.f; \.
8e60: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
8e70: 43 68 65 63 6b 20 74 68 65 20 52 54 72 65 65 20  Check the RTree 
8e80: 6e 6f 64 65 20 6f 72 20 65 6e 74 72 79 20 67 69  node or entry gi
8e90: 76 65 6e 20 62 79 20 70 43 65 6c 6c 44 61 74 61  ven by pCellData
8ea0: 20 61 6e 64 20 70 20 61 67 61 69 6e 73 74 20 74   and p against t
8eb0: 68 65 20 4d 41 54 43 48 0a 2a 2a 20 63 6f 6e 73  he MATCH.** cons
8ec0: 74 72 61 69 6e 74 20 70 43 6f 6e 73 74 72 61 69  traint pConstrai
8ed0: 6e 74 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  nt.  .*/.static 
8ee0: 69 6e 74 20 72 74 72 65 65 43 61 6c 6c 62 61 63  int rtreeCallbac
8ef0: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 52  kConstraint(.  R
8f00: 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a  treeConstraint *
8f10: 70 43 6f 6e 73 74 72 61 69 6e 74 2c 20 20 2f 2a  pConstraint,  /*
8f20: 20 54 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   The constraint 
8f30: 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74  to test */.  int
8f40: 20 65 49 6e 74 2c 20 20 20 20 20 20 20 20 20 20   eInt,          
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8f60: 72 75 65 20 69 66 20 52 54 72 65 65 20 68 6f 6c  rue if RTree hol
8f70: 64 69 6e 67 20 69 6e 74 65 67 65 72 20 63 6f 6f  ding integer coo
8f80: 72 64 69 6e 61 74 65 73 20 2a 2f 0a 20 20 75 38  rdinates */.  u8
8f90: 20 2a 70 43 65 6c 6c 44 61 74 61 2c 20 20 20 20   *pCellData,    
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8fb0: 52 61 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  Raw cell content
8fc0: 20 2a 2f 0a 20 20 52 74 72 65 65 53 65 61 72 63   */.  RtreeSearc
8fd0: 68 50 6f 69 6e 74 20 2a 70 53 65 61 72 63 68 2c  hPoint *pSearch,
8fe0: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 61 69 6e 65       /* Containe
8ff0: 72 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 2a  r of this cell *
9000: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 74 72 65  /.  sqlite3_rtre
9010: 65 5f 64 62 6c 20 2a 70 72 53 63 6f 72 65 2c 20  e_dbl *prScore, 
9020: 20 20 20 2f 2a 20 4f 55 54 3a 20 73 63 6f 72 65     /* OUT: score
9030: 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 20 2a 2f   for the cell */
9040: 0a 20 20 69 6e 74 20 2a 70 65 57 69 74 68 69 6e  .  int *peWithin
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9060: 20 20 2f 2a 20 4f 55 54 3a 20 76 69 73 69 62 69    /* OUT: visibi
9070: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  lity of the cell
9080: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
9090: 5f 72 74 72 65 65 5f 71 75 65 72 79 5f 69 6e 66  _rtree_query_inf
90a0: 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 43 6f 6e 73  o *pInfo = pCons
90b0: 74 72 61 69 6e 74 2d 3e 70 49 6e 66 6f 3b 20 2f  traint->pInfo; /
90c0: 2a 20 43 61 6c 6c 62 61 63 6b 20 69 6e 66 6f 20  * Callback info 
90d0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6f 72 64 20  */.  int nCoord 
90e0: 3d 20 70 49 6e 66 6f 2d 3e 6e 43 6f 6f 72 64 3b  = pInfo->nCoord;
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
9110: 2e 20 6f 66 20 63 6f 6f 72 64 69 6e 61 74 65 73  . of coordinates
9120: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c            /* Cal
9160: 6c 62 61 63 6b 20 72 65 74 75 72 6e 20 63 6f 64  lback return cod
9170: 65 20 2a 2f 0a 20 20 52 74 72 65 65 43 6f 6f 72  e */.  RtreeCoor
9180: 64 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  d c;            
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
91b0: 61 6e 73 6c 61 74 6f 72 20 75 6e 69 6f 6e 20 2a  anslator union *
91c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 74 72 65  /.  sqlite3_rtre
91d0: 65 5f 64 62 6c 20 61 43 6f 6f 72 64 5b 52 54 52  e_dbl aCoord[RTR
91e0: 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e  EE_MAX_DIMENSION
91f0: 53 2a 32 5d 3b 20 20 20 2f 2a 20 44 65 63 6f 64  S*2];   /* Decod
9200: 65 64 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 2a  ed coordinates *
9210: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  /..  assert( pCo
9220: 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 52 54  nstraint->op==RT
9230: 52 45 45 5f 4d 41 54 43 48 20 7c 7c 20 70 43 6f  REE_MATCH || pCo
9240: 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 52 54  nstraint->op==RT
9250: 52 45 45 5f 51 55 45 52 59 20 29 3b 0a 20 20 61  REE_QUERY );.  a
9260: 73 73 65 72 74 28 20 6e 43 6f 6f 72 64 3d 3d 32  ssert( nCoord==2
9270: 20 7c 7c 20 6e 43 6f 6f 72 64 3d 3d 34 20 7c 7c   || nCoord==4 ||
9280: 20 6e 43 6f 6f 72 64 3d 3d 36 20 7c 7c 20 6e 43   nCoord==6 || nC
9290: 6f 6f 72 64 3d 3d 38 20 7c 7c 20 6e 43 6f 6f 72  oord==8 || nCoor
92a0: 64 3d 3d 31 30 20 29 3b 0a 0a 20 20 69 66 28 20  d==10 );..  if( 
92b0: 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d  pConstraint->op=
92c0: 3d 52 54 52 45 45 5f 51 55 45 52 59 20 26 26 20  =RTREE_QUERY && 
92d0: 70 53 65 61 72 63 68 2d 3e 69 4c 65 76 65 6c 3d  pSearch->iLevel=
92e0: 3d 31 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  =1 ){.    pInfo-
92f0: 3e 69 52 6f 77 69 64 20 3d 20 72 65 61 64 49 6e  >iRowid = readIn
9300: 74 36 34 28 70 43 65 6c 6c 44 61 74 61 29 3b 0a  t64(pCellData);.
9310: 20 20 7d 0a 20 20 70 43 65 6c 6c 44 61 74 61 20    }.  pCellData 
9320: 2b 3d 20 38 3b 0a 23 69 66 6e 64 65 66 20 53 51  += 8;.#ifndef SQ
9330: 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f  LITE_RTREE_INT_O
9340: 4e 4c 59 0a 20 20 69 66 28 20 65 49 6e 74 3d 3d  NLY.  if( eInt==
9350: 30 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  0 ){.    switch(
9360: 20 6e 43 6f 6f 72 64 20 29 7b 0a 20 20 20 20 20   nCoord ){.     
9370: 20 63 61 73 65 20 31 30 3a 20 20 72 65 61 64 43   case 10:  readC
9380: 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 33  oord(pCellData+3
9390: 36 2c 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 39  6, &c); aCoord[9
93a0: 5d 20 3d 20 63 2e 66 3b 0a 20 20 20 20 20 20 20  ] = c.f;.       
93b0: 20 20 20 20 20 20 20 20 20 72 65 61 64 43 6f 6f           readCoo
93c0: 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 33 32 2c  rd(pCellData+32,
93d0: 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 38 5d 20   &c); aCoord[8] 
93e0: 3d 20 63 2e 66 3b 0a 20 20 20 20 20 20 63 61 73  = c.f;.      cas
93f0: 65 20 38 3a 20 20 20 72 65 61 64 43 6f 6f 72 64  e 8:   readCoord
9400: 28 70 43 65 6c 6c 44 61 74 61 2b 32 38 2c 20 26  (pCellData+28, &
9410: 63 29 3b 20 61 43 6f 6f 72 64 5b 37 5d 20 3d 20  c); aCoord[7] = 
9420: 63 2e 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20  c.f;.           
9430: 20 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70       readCoord(p
9440: 43 65 6c 6c 44 61 74 61 2b 32 34 2c 20 26 63 29  CellData+24, &c)
9450: 3b 20 61 43 6f 6f 72 64 5b 36 5d 20 3d 20 63 2e  ; aCoord[6] = c.
9460: 66 3b 0a 20 20 20 20 20 20 63 61 73 65 20 36 3a  f;.      case 6:
9470: 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65     readCoord(pCe
9480: 6c 6c 44 61 74 61 2b 32 30 2c 20 26 63 29 3b 20  llData+20, &c); 
9490: 61 43 6f 6f 72 64 5b 35 5d 20 3d 20 63 2e 66 3b  aCoord[5] = c.f;
94a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
94b0: 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c   readCoord(pCell
94c0: 44 61 74 61 2b 31 36 2c 20 26 63 29 3b 20 61 43  Data+16, &c); aC
94d0: 6f 6f 72 64 5b 34 5d 20 3d 20 63 2e 66 3b 0a 20  oord[4] = c.f;. 
94e0: 20 20 20 20 20 63 61 73 65 20 34 3a 20 20 20 72       case 4:   r
94f0: 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61  eadCoord(pCellDa
9500: 74 61 2b 31 32 2c 20 26 63 29 3b 20 61 43 6f 6f  ta+12, &c); aCoo
9510: 72 64 5b 33 5d 20 3d 20 63 2e 66 3b 0a 20 20 20  rd[3] = c.f;.   
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
9530: 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61  dCoord(pCellData
9540: 2b 38 2c 20 20 26 63 29 3b 20 61 43 6f 6f 72 64  +8,  &c); aCoord
9550: 5b 32 5d 20 3d 20 63 2e 66 3b 0a 20 20 20 20 20  [2] = c.f;.     
9560: 20 64 65 66 61 75 6c 74 3a 20 20 72 65 61 64 43   default:  readC
9570: 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 34  oord(pCellData+4
9580: 2c 20 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 31  ,  &c); aCoord[1
9590: 5d 20 3d 20 63 2e 66 3b 0a 20 20 20 20 20 20 20  ] = c.f;.       
95a0: 20 20 20 20 20 20 20 20 20 72 65 61 64 43 6f 6f           readCoo
95b0: 72 64 28 70 43 65 6c 6c 44 61 74 61 2c 20 20 20  rd(pCellData,   
95c0: 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 30 5d 20   &c); aCoord[0] 
95d0: 3d 20 63 2e 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  = c.f;.    }.  }
95e0: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
95f0: 20 20 20 20 73 77 69 74 63 68 28 20 6e 43 6f 6f      switch( nCoo
9600: 72 64 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  rd ){.      case
9610: 20 31 30 3a 20 20 72 65 61 64 43 6f 6f 72 64 28   10:  readCoord(
9620: 70 43 65 6c 6c 44 61 74 61 2b 33 36 2c 20 26 63  pCellData+36, &c
9630: 29 3b 20 61 43 6f 6f 72 64 5b 39 5d 20 3d 20 63  ); aCoord[9] = c
9640: 2e 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  .i;.            
9650: 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43      readCoord(pC
9660: 65 6c 6c 44 61 74 61 2b 33 32 2c 20 26 63 29 3b  ellData+32, &c);
9670: 20 61 43 6f 6f 72 64 5b 38 5d 20 3d 20 63 2e 69   aCoord[8] = c.i
9680: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 38 3a 20  ;.      case 8: 
9690: 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c    readCoord(pCel
96a0: 6c 44 61 74 61 2b 32 38 2c 20 26 63 29 3b 20 61  lData+28, &c); a
96b0: 43 6f 6f 72 64 5b 37 5d 20 3d 20 63 2e 69 3b 0a  Coord[7] = c.i;.
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44  readCoord(pCellD
96e0: 61 74 61 2b 32 34 2c 20 26 63 29 3b 20 61 43 6f  ata+24, &c); aCo
96f0: 6f 72 64 5b 36 5d 20 3d 20 63 2e 69 3b 0a 20 20  ord[6] = c.i;.  
9700: 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 72 65      case 6:   re
9710: 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74  adCoord(pCellDat
9720: 61 2b 32 30 2c 20 26 63 29 3b 20 61 43 6f 6f 72  a+20, &c); aCoor
9730: 64 5b 35 5d 20 3d 20 63 2e 69 3b 0a 20 20 20 20  d[5] = c.i;.    
9740: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
9750: 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b  Coord(pCellData+
9760: 31 36 2c 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b  16, &c); aCoord[
9770: 34 5d 20 3d 20 63 2e 69 3b 0a 20 20 20 20 20 20  4] = c.i;.      
9780: 63 61 73 65 20 34 3a 20 20 20 72 65 61 64 43 6f  case 4:   readCo
9790: 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 31 32  ord(pCellData+12
97a0: 2c 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 33 5d  , &c); aCoord[3]
97b0: 20 3d 20 63 2e 69 3b 0a 20 20 20 20 20 20 20 20   = c.i;.        
97c0: 20 20 20 20 20 20 20 20 72 65 61 64 43 6f 6f 72          readCoor
97d0: 64 28 70 43 65 6c 6c 44 61 74 61 2b 38 2c 20 20  d(pCellData+8,  
97e0: 26 63 29 3b 20 61 43 6f 6f 72 64 5b 32 5d 20 3d  &c); aCoord[2] =
97f0: 20 63 2e 69 3b 0a 20 20 20 20 20 20 64 65 66 61   c.i;.      defa
9800: 75 6c 74 3a 20 20 72 65 61 64 43 6f 6f 72 64 28  ult:  readCoord(
9810: 70 43 65 6c 6c 44 61 74 61 2b 34 2c 20 20 26 63  pCellData+4,  &c
9820: 29 3b 20 61 43 6f 6f 72 64 5b 31 5d 20 3d 20 63  ); aCoord[1] = c
9830: 2e 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  .i;.            
9840: 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43      readCoord(pC
9850: 65 6c 6c 44 61 74 61 2c 20 20 20 20 26 63 29 3b  ellData,    &c);
9860: 20 61 43 6f 6f 72 64 5b 30 5d 20 3d 20 63 2e 69   aCoord[0] = c.i
9870: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
9880: 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f  ( pConstraint->o
9890: 70 3d 3d 52 54 52 45 45 5f 4d 41 54 43 48 20 29  p==RTREE_MATCH )
98a0: 7b 0a 20 20 20 20 69 6e 74 20 65 57 69 74 68 69  {.    int eWithi
98b0: 6e 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  n = 0;.    rc = 
98c0: 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 2e 78  pConstraint->u.x
98d0: 47 65 6f 6d 28 28 73 71 6c 69 74 65 33 5f 72 74  Geom((sqlite3_rt
98e0: 72 65 65 5f 67 65 6f 6d 65 74 72 79 2a 29 70 49  ree_geometry*)pI
98f0: 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9910: 20 20 20 6e 43 6f 6f 72 64 2c 20 61 43 6f 6f 72     nCoord, aCoor
9920: 64 2c 20 26 65 57 69 74 68 69 6e 29 3b 0a 20 20  d, &eWithin);.  
9930: 20 20 69 66 28 20 65 57 69 74 68 69 6e 3d 3d 30    if( eWithin==0
9940: 20 29 20 2a 70 65 57 69 74 68 69 6e 20 3d 20 4e   ) *peWithin = N
9950: 4f 54 5f 57 49 54 48 49 4e 3b 0a 20 20 20 20 2a  OT_WITHIN;.    *
9960: 70 72 53 63 6f 72 65 20 3d 20 52 54 52 45 45 5f  prScore = RTREE_
9970: 5a 45 52 4f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ZERO;.  }else{. 
9980: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6f 72 64     pInfo->aCoord
9990: 20 3d 20 61 43 6f 6f 72 64 3b 0a 20 20 20 20 70   = aCoord;.    p
99a0: 49 6e 66 6f 2d 3e 69 4c 65 76 65 6c 20 3d 20 70  Info->iLevel = p
99b0: 53 65 61 72 63 68 2d 3e 69 4c 65 76 65 6c 20 2d  Search->iLevel -
99c0: 20 31 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 72   1;.    pInfo->r
99d0: 53 63 6f 72 65 20 3d 20 70 49 6e 66 6f 2d 3e 72  Score = pInfo->r
99e0: 50 61 72 65 6e 74 53 63 6f 72 65 20 3d 20 70 53  ParentScore = pS
99f0: 65 61 72 63 68 2d 3e 72 53 63 6f 72 65 3b 0a 20  earch->rScore;. 
9a00: 20 20 20 70 49 6e 66 6f 2d 3e 65 57 69 74 68 69     pInfo->eWithi
9a10: 6e 20 3d 20 70 49 6e 66 6f 2d 3e 65 50 61 72 65  n = pInfo->ePare
9a20: 6e 74 57 69 74 68 69 6e 20 3d 20 70 53 65 61 72  ntWithin = pSear
9a30: 63 68 2d 3e 65 57 69 74 68 69 6e 3b 0a 20 20 20  ch->eWithin;.   
9a40: 20 72 63 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e   rc = pConstrain
9a50: 74 2d 3e 75 2e 78 51 75 65 72 79 46 75 6e 63 28  t->u.xQueryFunc(
9a60: 70 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20  pInfo);.    if( 
9a70: 70 49 6e 66 6f 2d 3e 65 57 69 74 68 69 6e 3c 2a  pInfo->eWithin<*
9a80: 70 65 57 69 74 68 69 6e 20 29 20 2a 70 65 57 69  peWithin ) *peWi
9a90: 74 68 69 6e 20 3d 20 70 49 6e 66 6f 2d 3e 65 57  thin = pInfo->eW
9aa0: 69 74 68 69 6e 3b 0a 20 20 20 20 69 66 28 20 70  ithin;.    if( p
9ab0: 49 6e 66 6f 2d 3e 72 53 63 6f 72 65 3c 2a 70 72  Info->rScore<*pr
9ac0: 53 63 6f 72 65 20 7c 7c 20 2a 70 72 53 63 6f 72  Score || *prScor
9ad0: 65 3c 52 54 52 45 45 5f 5a 45 52 4f 20 29 7b 0a  e<RTREE_ZERO ){.
9ae0: 20 20 20 20 20 20 2a 70 72 53 63 6f 72 65 20 3d        *prScore =
9af0: 20 70 49 6e 66 6f 2d 3e 72 53 63 6f 72 65 3b 0a   pInfo->rScore;.
9b00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9b10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
9b20: 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 72   Check the inter
9b30: 6e 61 6c 20 52 54 72 65 65 20 6e 6f 64 65 20 67  nal RTree node g
9b40: 69 76 65 6e 20 62 79 20 70 43 65 6c 6c 44 61 74  iven by pCellDat
9b50: 61 20 61 67 61 69 6e 73 74 20 63 6f 6e 73 74 72  a against constr
9b60: 61 69 6e 74 20 70 2e 0a 2a 2a 20 49 66 20 74 68  aint p..** If th
9b70: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  is constraint ca
9b80: 6e 6e 6f 74 20 62 65 20 73 61 74 69 73 66 69 65  nnot be satisfie
9b90: 64 20 62 79 20 61 6e 79 20 63 68 69 6c 64 20 77  d by any child w
9ba0: 69 74 68 69 6e 20 74 68 65 20 6e 6f 64 65 2c 0a  ithin the node,.
9bb0: 2a 2a 20 73 65 74 20 2a 70 65 57 69 74 68 69 6e  ** set *peWithin
9bc0: 20 74 6f 20 4e 4f 54 5f 57 49 54 48 49 4e 2e 0a   to NOT_WITHIN..
9bd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
9be0: 74 72 65 65 4e 6f 6e 6c 65 61 66 43 6f 6e 73 74  treeNonleafConst
9bf0: 72 61 69 6e 74 28 0a 20 20 52 74 72 65 65 43 6f  raint(.  RtreeCo
9c00: 6e 73 74 72 61 69 6e 74 20 2a 70 2c 20 20 20 20  nstraint *p,    
9c10: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 73 74      /* The const
9c20: 72 61 69 6e 74 20 74 6f 20 74 65 73 74 20 2a 2f  raint to test */
9c30: 0a 20 20 69 6e 74 20 65 49 6e 74 2c 20 20 20 20  .  int eInt,    
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9c50: 20 54 72 75 65 20 69 66 20 52 54 72 65 65 20 68   True if RTree h
9c60: 6f 6c 64 73 20 69 6e 74 65 67 65 72 20 63 6f 6f  olds integer coo
9c70: 72 64 69 6e 61 74 65 73 20 2a 2f 0a 20 20 75 38  rdinates */.  u8
9c80: 20 2a 70 43 65 6c 6c 44 61 74 61 2c 20 20 20 20   *pCellData,    
9c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 61 77 20           /* Raw 
9ca0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 73 20  cell content as 
9cb0: 61 70 70 65 61 72 73 20 6f 6e 20 64 69 73 6b 20  appears on disk 
9cc0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 65 57 69 74 68  */.  int *peWith
9cd0: 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  in              
9ce0: 2f 2a 20 41 64 6a 75 73 74 20 64 6f 77 6e 77 61  /* Adjust downwa
9cf0: 72 64 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  rd, as appropria
9d00: 74 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  te */.){.  sqlit
9d10: 65 33 5f 72 74 72 65 65 5f 64 62 6c 20 76 61 6c  e3_rtree_dbl val
9d20: 3b 20 20 20 20 20 2f 2a 20 43 6f 6f 72 64 69 6e  ;     /* Coordin
9d30: 61 74 65 20 76 61 6c 75 65 20 63 6f 6e 76 65 72  ate value conver
9d40: 74 20 74 6f 20 61 20 64 6f 75 62 6c 65 20 2a 2f  t to a double */
9d50: 0a 0a 20 20 2f 2a 20 70 2d 3e 69 43 6f 6f 72 64  ..  /* p->iCoord
9d60: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
9d70: 65 69 74 68 65 72 20 61 20 6c 6f 77 65 72 20 6f  either a lower o
9d80: 72 20 75 70 70 65 72 20 62 6f 75 6e 64 20 63 6f  r upper bound co
9d90: 6f 72 64 69 6e 61 74 65 0a 20 20 2a 2a 20 69 6e  ordinate.  ** in
9da0: 20 61 20 63 6f 6f 72 64 69 6e 61 74 65 20 70 61   a coordinate pa
9db0: 69 72 2e 20 20 42 75 74 20 6d 61 6b 65 20 70 43  ir.  But make pC
9dc0: 65 6c 6c 44 61 74 61 20 70 6f 69 6e 74 20 74 6f  ellData point to
9dd0: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
9de0: 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 44 61  ..  */.  pCellDa
9df0: 74 61 20 2b 3d 20 38 20 2b 20 34 2a 28 70 2d 3e  ta += 8 + 4*(p->
9e00: 69 43 6f 6f 72 64 26 30 78 66 65 29 3b 0a 0a 20  iCoord&0xfe);.. 
9e10: 20 61 73 73 65 72 74 28 70 2d 3e 6f 70 3d 3d 52   assert(p->op==R
9e20: 54 52 45 45 5f 4c 45 20 7c 7c 20 70 2d 3e 6f 70  TREE_LE || p->op
9e30: 3d 3d 52 54 52 45 45 5f 4c 54 20 7c 7c 20 70 2d  ==RTREE_LT || p-
9e40: 3e 6f 70 3d 3d 52 54 52 45 45 5f 47 45 20 0a 20  >op==RTREE_GE . 
9e50: 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52       || p->op==R
9e60: 54 52 45 45 5f 47 54 20 7c 7c 20 70 2d 3e 6f 70  TREE_GT || p->op
9e70: 3d 3d 52 54 52 45 45 5f 45 51 20 29 3b 0a 20 20  ==RTREE_EQ );.  
9e80: 61 73 73 65 72 74 28 20 28 28 28 28 63 68 61 72  assert( ((((char
9e90: 2a 29 70 43 65 6c 6c 44 61 74 61 29 20 2d 20 28  *)pCellData) - (
9ea0: 63 68 61 72 2a 29 30 29 26 33 29 3d 3d 30 20 29  char*)0)&3)==0 )
9eb0: 3b 20 20 2f 2a 20 34 2d 62 79 74 65 20 61 6c 69  ;  /* 4-byte ali
9ec0: 67 6e 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68  gned */.  switch
9ed0: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
9ee0: 61 73 65 20 52 54 52 45 45 5f 4c 45 3a 0a 20 20  ase RTREE_LE:.  
9ef0: 20 20 63 61 73 65 20 52 54 52 45 45 5f 4c 54 3a    case RTREE_LT:
9f00: 0a 20 20 20 20 63 61 73 65 20 52 54 52 45 45 5f  .    case RTREE_
9f10: 45 51 3a 0a 20 20 20 20 20 20 52 54 52 45 45 5f  EQ:.      RTREE_
9f20: 44 45 43 4f 44 45 5f 43 4f 4f 52 44 28 65 49 6e  DECODE_COORD(eIn
9f30: 74 2c 20 70 43 65 6c 6c 44 61 74 61 2c 20 76 61  t, pCellData, va
9f40: 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20 76 61 6c  l);.      /* val
9f50: 20 6e 6f 77 20 68 6f 6c 64 73 20 74 68 65 20 6c   now holds the l
9f60: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
9f70: 65 20 63 6f 6f 72 64 69 6e 61 74 65 20 70 61 69  e coordinate pai
9f80: 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  r */.      if( p
9f90: 2d 3e 75 2e 72 56 61 6c 75 65 3e 3d 76 61 6c 20  ->u.rValue>=val 
9fa0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
9fb0: 69 66 28 20 70 2d 3e 6f 70 21 3d 52 54 52 45 45  if( p->op!=RTREE
9fc0: 5f 45 51 20 29 20 62 72 65 61 6b 3b 20 20 2f 2a  _EQ ) break;  /*
9fd0: 20 52 54 52 45 45 5f 4c 45 20 61 6e 64 20 52 54   RTREE_LE and RT
9fe0: 52 45 45 5f 4c 54 20 65 6e 64 20 68 65 72 65 20  REE_LT end here 
9ff0: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  */.      /* Fall
a000: 20 74 68 72 6f 75 67 68 20 66 6f 72 20 74 68 65   through for the
a010: 20 52 54 52 45 45 5f 45 51 20 63 61 73 65 20 2a   RTREE_EQ case *
a020: 2f 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  /..    default: 
a030: 2f 2a 20 52 54 52 45 45 5f 47 54 20 6f 72 20 52  /* RTREE_GT or R
a040: 54 52 45 45 5f 47 45 2c 20 20 6f 72 20 66 61 6c  TREE_GE,  or fal
a050: 6c 74 68 72 6f 75 67 68 20 6f 66 20 52 54 52 45  lthrough of RTRE
a060: 45 5f 45 51 20 2a 2f 0a 20 20 20 20 20 20 70 43  E_EQ */.      pC
a070: 65 6c 6c 44 61 74 61 20 2b 3d 20 34 3b 0a 20 20  ellData += 4;.  
a080: 20 20 20 20 52 54 52 45 45 5f 44 45 43 4f 44 45      RTREE_DECODE
a090: 5f 43 4f 4f 52 44 28 65 49 6e 74 2c 20 70 43 65  _COORD(eInt, pCe
a0a0: 6c 6c 44 61 74 61 2c 20 76 61 6c 29 3b 0a 20 20  llData, val);.  
a0b0: 20 20 20 20 2f 2a 20 76 61 6c 20 6e 6f 77 20 68      /* val now h
a0c0: 6f 6c 64 73 20 74 68 65 20 75 70 70 65 72 20 62  olds the upper b
a0d0: 6f 75 6e 64 20 6f 66 20 74 68 65 20 63 6f 6f 72  ound of the coor
a0e0: 64 69 6e 61 74 65 20 70 61 69 72 20 2a 2f 0a 20  dinate pair */. 
a0f0: 20 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 72 56       if( p->u.rV
a100: 61 6c 75 65 3c 3d 76 61 6c 20 29 20 72 65 74 75  alue<=val ) retu
a110: 72 6e 3b 0a 20 20 7d 0a 20 20 2a 70 65 57 69 74  rn;.  }.  *peWit
a120: 68 69 6e 20 3d 20 4e 4f 54 5f 57 49 54 48 49 4e  hin = NOT_WITHIN
a130: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
a140: 20 74 68 65 20 6c 65 61 66 20 52 54 72 65 65 20   the leaf RTree 
a150: 63 65 6c 6c 20 67 69 76 65 6e 20 62 79 20 70 43  cell given by pC
a160: 65 6c 6c 44 61 74 61 20 61 67 61 69 6e 73 74 20  ellData against 
a170: 63 6f 6e 73 74 72 61 69 6e 74 20 70 2e 0a 2a 2a  constraint p..**
a180: 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61   If this constra
a190: 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73  int is not satis
a1a0: 66 69 65 64 2c 20 73 65 74 20 2a 70 65 57 69 74  fied, set *peWit
a1b0: 68 69 6e 20 74 6f 20 4e 4f 54 5f 57 49 54 48 49  hin to NOT_WITHI
a1c0: 4e 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  N..** If the con
a1d0: 73 74 72 61 69 6e 74 20 69 73 20 73 61 74 69 73  straint is satis
a1e0: 66 69 65 64 2c 20 6c 65 61 76 65 20 2a 70 65 57  fied, leave *peW
a1f0: 69 74 68 69 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ithin unchanged.
a200: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 73 74  .**.** The const
a210: 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20  raint is of the 
a220: 66 6f 72 6d 3a 20 20 78 4e 20 6f 70 20 24 76 61  form:  xN op $va
a230: 6c 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 20 69  l.**.** The op i
a240: 73 20 67 69 76 65 6e 20 62 79 20 70 2d 3e 6f 70  s given by p->op
a250: 2e 20 20 54 68 65 20 78 4e 20 69 73 20 70 2d 3e  .  The xN is p->
a260: 69 43 6f 6f 72 64 2d 74 68 20 63 6f 6f 72 64 69  iCoord-th coordi
a270: 6e 61 74 65 20 69 6e 0a 2a 2a 20 70 43 65 6c 6c  nate in.** pCell
a280: 44 61 74 61 2e 20 20 24 76 61 6c 20 69 73 20 67  Data.  $val is g
a290: 69 76 65 6e 20 62 79 20 70 2d 3e 75 2e 72 56 61  iven by p->u.rVa
a2a0: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lue..*/.static v
a2b0: 6f 69 64 20 72 74 72 65 65 4c 65 61 66 43 6f 6e  oid rtreeLeafCon
a2c0: 73 74 72 61 69 6e 74 28 0a 20 20 52 74 72 65 65  straint(.  Rtree
a2d0: 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 2c 20 20  Constraint *p,  
a2e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
a2f0: 73 74 72 61 69 6e 74 20 74 6f 20 74 65 73 74 20  straint to test 
a300: 2a 2f 0a 20 20 69 6e 74 20 65 49 6e 74 2c 20 20  */.  int eInt,  
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a320: 2f 2a 20 54 72 75 65 20 69 66 20 52 54 72 65 65  /* True if RTree
a330: 20 68 6f 6c 64 73 20 69 6e 74 65 67 65 72 20 63   holds integer c
a340: 6f 6f 72 64 69 6e 61 74 65 73 20 2a 2f 0a 20 20  oordinates */.  
a350: 75 38 20 2a 70 43 65 6c 6c 44 61 74 61 2c 20 20  u8 *pCellData,  
a360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 61             /* Ra
a370: 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  w cell content a
a380: 73 20 61 70 70 65 61 72 73 20 6f 6e 20 64 69 73  s appears on dis
a390: 6b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 65 57 69  k */.  int *peWi
a3a0: 74 68 69 6e 20 20 20 20 20 20 20 20 20 20 20 20  thin            
a3b0: 20 20 2f 2a 20 41 64 6a 75 73 74 20 64 6f 77 6e    /* Adjust down
a3c0: 77 61 72 64 2c 20 61 73 20 61 70 70 72 6f 70 72  ward, as appropr
a3d0: 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 52 74 72  iate */.){.  Rtr
a3e0: 65 65 44 56 61 6c 75 65 20 78 4e 3b 20 20 20 20  eeDValue xN;    
a3f0: 20 20 2f 2a 20 43 6f 6f 72 64 69 6e 61 74 65 20    /* Coordinate 
a400: 76 61 6c 75 65 20 63 6f 6e 76 65 72 74 65 64 20  value converted 
a410: 74 6f 20 61 20 64 6f 75 62 6c 65 20 2a 2f 0a 0a  to a double */..
a420: 20 20 61 73 73 65 72 74 28 70 2d 3e 6f 70 3d 3d    assert(p->op==
a430: 52 54 52 45 45 5f 4c 45 20 7c 7c 20 70 2d 3e 6f  RTREE_LE || p->o
a440: 70 3d 3d 52 54 52 45 45 5f 4c 54 20 7c 7c 20 70  p==RTREE_LT || p
a450: 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 47 45 20 0a  ->op==RTREE_GE .
a460: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 70 3d 3d        || p->op==
a470: 52 54 52 45 45 5f 47 54 20 7c 7c 20 70 2d 3e 6f  RTREE_GT || p->o
a480: 70 3d 3d 52 54 52 45 45 5f 45 51 20 29 3b 0a 20  p==RTREE_EQ );. 
a490: 20 70 43 65 6c 6c 44 61 74 61 20 2b 3d 20 38 20   pCellData += 8 
a4a0: 2b 20 70 2d 3e 69 43 6f 6f 72 64 2a 34 3b 0a 20  + p->iCoord*4;. 
a4b0: 20 61 73 73 65 72 74 28 20 28 28 28 28 63 68 61   assert( ((((cha
a4c0: 72 2a 29 70 43 65 6c 6c 44 61 74 61 29 20 2d 20  r*)pCellData) - 
a4d0: 28 63 68 61 72 2a 29 30 29 26 33 29 3d 3d 30 20  (char*)0)&3)==0 
a4e0: 29 3b 20 20 2f 2a 20 34 2d 62 79 74 65 20 61 6c  );  /* 4-byte al
a4f0: 69 67 6e 65 64 20 2a 2f 0a 20 20 52 54 52 45 45  igned */.  RTREE
a500: 5f 44 45 43 4f 44 45 5f 43 4f 4f 52 44 28 65 49  _DECODE_COORD(eI
a510: 6e 74 2c 20 70 43 65 6c 6c 44 61 74 61 2c 20 78  nt, pCellData, x
a520: 4e 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  N);.  switch( p-
a530: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
a540: 52 54 52 45 45 5f 4c 45 3a 20 69 66 28 20 78 4e  RTREE_LE: if( xN
a550: 20 3c 3d 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20   <= p->u.rValue 
a560: 29 20 72 65 74 75 72 6e 3b 20 20 62 72 65 61 6b  ) return;  break
a570: 3b 0a 20 20 20 20 63 61 73 65 20 52 54 52 45 45  ;.    case RTREE
a580: 5f 4c 54 3a 20 69 66 28 20 78 4e 20 3c 20 20 70  _LT: if( xN <  p
a590: 2d 3e 75 2e 72 56 61 6c 75 65 20 29 20 72 65 74  ->u.rValue ) ret
a5a0: 75 72 6e 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  urn;  break;.   
a5b0: 20 63 61 73 65 20 52 54 52 45 45 5f 47 45 3a 20   case RTREE_GE: 
a5c0: 69 66 28 20 78 4e 20 3e 3d 20 70 2d 3e 75 2e 72  if( xN >= p->u.r
a5d0: 56 61 6c 75 65 20 29 20 72 65 74 75 72 6e 3b 20  Value ) return; 
a5e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a5f0: 20 52 54 52 45 45 5f 47 54 3a 20 69 66 28 20 78   RTREE_GT: if( x
a600: 4e 20 3e 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65  N >  p->u.rValue
a610: 20 29 20 72 65 74 75 72 6e 3b 20 20 62 72 65 61   ) return;  brea
a620: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
a630: 20 20 20 20 20 20 69 66 28 20 78 4e 20 3d 3d 20        if( xN == 
a640: 70 2d 3e 75 2e 72 56 61 6c 75 65 20 29 20 72 65  p->u.rValue ) re
a650: 74 75 72 6e 3b 20 20 62 72 65 61 6b 3b 0a 20 20  turn;  break;.  
a660: 7d 0a 20 20 2a 70 65 57 69 74 68 69 6e 20 3d 20  }.  *peWithin = 
a670: 4e 4f 54 5f 57 49 54 48 49 4e 3b 0a 7d 0a 0a 2f  NOT_WITHIN;.}../
a680: 2a 0a 2a 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20  *.** One of the 
a690: 63 65 6c 6c 73 20 69 6e 20 6e 6f 64 65 20 70 4e  cells in node pN
a6a0: 6f 64 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ode is guarantee
a6b0: 64 20 74 6f 20 68 61 76 65 20 61 20 36 34 2d 62  d to have a 64-b
a6c0: 69 74 20 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76  it .** integer v
a6d0: 61 6c 75 65 20 65 71 75 61 6c 20 74 6f 20 69 52  alue equal to iR
a6e0: 6f 77 69 64 2e 20 52 65 74 75 72 6e 20 74 68 65  owid. Return the
a6f0: 20 69 6e 64 65 78 20 6f 66 20 74 68 69 73 20 63   index of this c
a700: 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
a710: 6e 74 20 6e 6f 64 65 52 6f 77 69 64 49 6e 64 65  nt nodeRowidInde
a720: 78 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  x(.  Rtree *pRtr
a730: 65 65 2c 20 0a 20 20 52 74 72 65 65 4e 6f 64 65  ee, .  RtreeNode
a740: 20 2a 70 4e 6f 64 65 2c 20 0a 20 20 69 36 34 20   *pNode, .  i64 
a750: 69 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20 2a 70  iRowid,.  int *p
a760: 69 49 6e 64 65 78 0a 29 7b 0a 20 20 69 6e 74 20  iIndex.){.  int 
a770: 69 69 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20  ii;.  int nCell 
a780: 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a  = NCELL(pNode);.
a790: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
a7a0: 32 30 30 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d  200 );.  for(ii=
a7b0: 30 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b  0; ii<nCell; ii+
a7c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 64 65  +){.    if( node
a7d0: 47 65 74 52 6f 77 69 64 28 70 52 74 72 65 65 2c  GetRowid(pRtree,
a7e0: 20 70 4e 6f 64 65 2c 20 69 69 29 3d 3d 69 52 6f   pNode, ii)==iRo
a7f0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 69  wid ){.      *pi
a800: 49 6e 64 65 78 20 3d 20 69 69 3b 0a 20 20 20 20  Index = ii;.    
a810: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a820: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
a830: 52 54 52 45 45 5f 49 53 5f 43 4f 52 52 55 50 54  RTREE_IS_CORRUPT
a840: 28 70 52 74 72 65 65 29 3b 0a 20 20 72 65 74 75  (pRtree);.  retu
a850: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a860: 54 5f 56 54 41 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_VTAB;.}../*.**
a870: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
a880: 78 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  x of the cell co
a890: 6e 74 61 69 6e 69 6e 67 20 61 20 70 6f 69 6e 74  ntaining a point
a8a0: 65 72 20 74 6f 20 6e 6f 64 65 20 70 4e 6f 64 65  er to node pNode
a8b0: 0a 2a 2a 20 69 6e 20 69 74 73 20 70 61 72 65 6e  .** in its paren
a8c0: 74 2e 20 49 66 20 70 4e 6f 64 65 20 69 73 20 74  t. If pNode is t
a8d0: 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 72 65  he root node, re
a8e0: 74 75 72 6e 20 2d 31 2e 0a 2a 2f 0a 73 74 61 74  turn -1..*/.stat
a8f0: 69 63 20 69 6e 74 20 6e 6f 64 65 50 61 72 65 6e  ic int nodeParen
a900: 74 49 6e 64 65 78 28 52 74 72 65 65 20 2a 70 52  tIndex(Rtree *pR
a910: 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20  tree, RtreeNode 
a920: 2a 70 4e 6f 64 65 2c 20 69 6e 74 20 2a 70 69 49  *pNode, int *piI
a930: 6e 64 65 78 29 7b 0a 20 20 52 74 72 65 65 4e 6f  ndex){.  RtreeNo
a940: 64 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 4e  de *pParent = pN
a950: 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  ode->pParent;.  
a960: 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20  if( pParent ){. 
a970: 20 20 20 72 65 74 75 72 6e 20 6e 6f 64 65 52 6f     return nodeRo
a980: 77 69 64 49 6e 64 65 78 28 70 52 74 72 65 65 2c  widIndex(pRtree,
a990: 20 70 50 61 72 65 6e 74 2c 20 70 4e 6f 64 65 2d   pParent, pNode-
a9a0: 3e 69 4e 6f 64 65 2c 20 70 69 49 6e 64 65 78 29  >iNode, piIndex)
a9b0: 3b 0a 20 20 7d 0a 20 20 2a 70 69 49 6e 64 65 78  ;.  }.  *piIndex
a9c0: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
a9d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a9e0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
a9f0: 73 65 61 72 63 68 20 70 6f 69 6e 74 73 2e 20 20  search points.  
aa00: 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c  Return negative,
aa10: 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
aa20: 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  ve if the first.
aa30: 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  ** is less than,
aa40: 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
aa50: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73  eater than the s
aa60: 65 63 6f 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  econd..**.** The
aa70: 20 72 53 63 6f 72 65 20 69 73 20 74 68 65 20 70   rScore is the p
aa80: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 53 6d 61  rimary key.  Sma
aa90: 6c 6c 65 72 20 72 53 63 6f 72 65 20 76 61 6c 75  ller rScore valu
aaa0: 65 73 20 63 6f 6d 65 20 66 69 72 73 74 2e 0a 2a  es come first..*
aab0: 2a 20 49 66 20 74 68 65 20 72 53 63 6f 72 65 20  * If the rScore 
aac0: 69 73 20 61 20 74 69 65 2c 20 74 68 65 6e 20 75  is a tie, then u
aad0: 73 65 20 69 4c 65 76 65 6c 20 61 73 20 74 68 65  se iLevel as the
aae0: 20 74 69 65 20 62 72 65 61 6b 65 72 20 77 69 74   tie breaker wit
aaf0: 68 20 73 6d 61 6c 6c 65 72 0a 2a 2a 20 69 4c 65  h smaller.** iLe
ab00: 76 65 6c 20 76 61 6c 75 65 73 20 63 6f 6d 69 6e  vel values comin
ab10: 67 20 66 69 72 73 74 2e 20 20 49 6e 20 74 68 69  g first.  In thi
ab20: 73 20 77 61 79 2c 20 69 66 20 72 53 63 6f 72 65  s way, if rScore
ab30: 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72   is the same for
ab40: 20 61 6c 6c 0a 2a 2a 20 53 65 61 72 63 68 50 6f   all.** SearchPo
ab50: 69 6e 74 73 2c 20 74 68 65 6e 20 69 4c 65 76 65  ints, then iLeve
ab60: 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 64 65  l becomes the de
ab70: 63 69 64 69 6e 67 20 66 61 63 74 6f 72 20 61 6e  ciding factor an
ab80: 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  d the result.** 
ab90: 69 73 20 61 20 64 65 70 74 68 2d 66 69 72 73 74  is a depth-first
aba0: 20 73 65 61 72 63 68 2c 20 77 68 69 63 68 20 69   search, which i
abb0: 73 20 74 68 65 20 64 65 73 69 72 65 64 20 64 65  s the desired de
abc0: 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a  fault behavior..
abd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74  */.static int rt
abe0: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 43 6f  reeSearchPointCo
abf0: 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74 20 52  mpare(.  const R
ac00: 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20  treeSearchPoint 
ac10: 2a 70 41 2c 0a 20 20 63 6f 6e 73 74 20 52 74 72  *pA,.  const Rtr
ac20: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70  eeSearchPoint *p
ac30: 42 0a 29 7b 0a 20 20 69 66 28 20 70 41 2d 3e 72  B.){.  if( pA->r
ac40: 53 63 6f 72 65 3c 70 42 2d 3e 72 53 63 6f 72 65  Score<pB->rScore
ac50: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
ac60: 69 66 28 20 70 41 2d 3e 72 53 63 6f 72 65 3e 70  if( pA->rScore>p
ac70: 42 2d 3e 72 53 63 6f 72 65 20 29 20 72 65 74 75  B->rScore ) retu
ac80: 72 6e 20 2b 31 3b 0a 20 20 69 66 28 20 70 41 2d  rn +1;.  if( pA-
ac90: 3e 69 4c 65 76 65 6c 3c 70 42 2d 3e 69 4c 65 76  >iLevel<pB->iLev
aca0: 65 6c 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  el ) return -1;.
acb0: 20 20 69 66 28 20 70 41 2d 3e 69 4c 65 76 65 6c    if( pA->iLevel
acc0: 3e 70 42 2d 3e 69 4c 65 76 65 6c 20 29 20 72 65  >pB->iLevel ) re
acd0: 74 75 72 6e 20 2b 31 3b 0a 20 20 72 65 74 75 72  turn +1;.  retur
ace0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
acf0: 74 65 72 63 68 61 6e 67 65 20 74 77 6f 20 73 65  terchange two se
ad00: 61 72 63 68 20 70 6f 69 6e 74 73 20 69 6e 20 61  arch points in a
ad10: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
ad20: 69 63 20 76 6f 69 64 20 72 74 72 65 65 53 65 61  ic void rtreeSea
ad30: 72 63 68 50 6f 69 6e 74 53 77 61 70 28 52 74 72  rchPointSwap(Rtr
ad40: 65 65 43 75 72 73 6f 72 20 2a 70 2c 20 69 6e 74  eeCursor *p, int
ad50: 20 69 2c 20 69 6e 74 20 6a 29 7b 0a 20 20 52 74   i, int j){.  Rt
ad60: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 74  reeSearchPoint t
ad70: 20 3d 20 70 2d 3e 61 50 6f 69 6e 74 5b 69 5d 3b   = p->aPoint[i];
ad80: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 6a 20 29  .  assert( i<j )
ad90: 3b 0a 20 20 70 2d 3e 61 50 6f 69 6e 74 5b 69 5d  ;.  p->aPoint[i]
ada0: 20 3d 20 70 2d 3e 61 50 6f 69 6e 74 5b 6a 5d 3b   = p->aPoint[j];
adb0: 0a 20 20 70 2d 3e 61 50 6f 69 6e 74 5b 6a 5d 20  .  p->aPoint[j] 
adc0: 3d 20 74 3b 0a 20 20 69 2b 2b 3b 20 6a 2b 2b 3b  = t;.  i++; j++;
add0: 0a 20 20 69 66 28 20 69 3c 52 54 52 45 45 5f 43  .  if( i<RTREE_C
ade0: 41 43 48 45 5f 53 5a 20 29 7b 0a 20 20 20 20 69  ACHE_SZ ){.    i
adf0: 66 28 20 6a 3e 3d 52 54 52 45 45 5f 43 41 43 48  f( j>=RTREE_CACH
ae00: 45 5f 53 5a 20 29 7b 0a 20 20 20 20 20 20 6e 6f  E_SZ ){.      no
ae10: 64 65 52 65 6c 65 61 73 65 28 52 54 52 45 45 5f  deRelease(RTREE_
ae20: 4f 46 5f 43 55 52 53 4f 52 28 70 29 2c 20 70 2d  OF_CURSOR(p), p-
ae30: 3e 61 4e 6f 64 65 5b 69 5d 29 3b 0a 20 20 20 20  >aNode[i]);.    
ae40: 20 20 70 2d 3e 61 4e 6f 64 65 5b 69 5d 20 3d 20    p->aNode[i] = 
ae50: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
ae60: 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
ae70: 54 65 6d 70 20 3d 20 70 2d 3e 61 4e 6f 64 65 5b  Temp = p->aNode[
ae80: 69 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4e 6f  i];.      p->aNo
ae90: 64 65 5b 69 5d 20 3d 20 70 2d 3e 61 4e 6f 64 65  de[i] = p->aNode
aea0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4e  [j];.      p->aN
aeb0: 6f 64 65 5b 6a 5d 20 3d 20 70 54 65 6d 70 3b 0a  ode[j] = pTemp;.
aec0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
aed0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
aee0: 61 72 63 68 20 70 6f 69 6e 74 20 77 69 74 68 20  arch point with 
aef0: 74 68 65 20 6c 6f 77 65 73 74 20 63 75 72 72 65  the lowest curre
af00: 6e 74 20 73 63 6f 72 65 2e 0a 2a 2f 0a 73 74 61  nt score..*/.sta
af10: 74 69 63 20 52 74 72 65 65 53 65 61 72 63 68 50  tic RtreeSearchP
af20: 6f 69 6e 74 20 2a 72 74 72 65 65 53 65 61 72 63  oint *rtreeSearc
af30: 68 50 6f 69 6e 74 46 69 72 73 74 28 52 74 72 65  hPointFirst(Rtre
af40: 65 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  eCursor *pCur){.
af50: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 62    return pCur->b
af60: 50 6f 69 6e 74 20 3f 20 26 70 43 75 72 2d 3e 73  Point ? &pCur->s
af70: 50 6f 69 6e 74 20 3a 20 70 43 75 72 2d 3e 6e 50  Point : pCur->nP
af80: 6f 69 6e 74 20 3f 20 70 43 75 72 2d 3e 61 50 6f  oint ? pCur->aPo
af90: 69 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  int : 0;.}../*.*
afa0: 2a 20 47 65 74 20 74 68 65 20 52 74 72 65 65 4e  * Get the RtreeN
afb0: 6f 64 65 20 66 6f 72 20 74 68 65 20 73 65 61 72  ode for the sear
afc0: 63 68 20 70 6f 69 6e 74 20 77 69 74 68 20 74 68  ch point with th
afd0: 65 20 6c 6f 77 65 73 74 20 73 63 6f 72 65 2e 0a  e lowest score..
afe0: 2a 2f 0a 73 74 61 74 69 63 20 52 74 72 65 65 4e  */.static RtreeN
aff0: 6f 64 65 20 2a 72 74 72 65 65 4e 6f 64 65 4f 66  ode *rtreeNodeOf
b000: 46 69 72 73 74 53 65 61 72 63 68 50 6f 69 6e 74  FirstSearchPoint
b010: 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43  (RtreeCursor *pC
b020: 75 72 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ur, int *pRC){. 
b030: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
b040: 64 3b 0a 20 20 69 6e 74 20 69 69 20 3d 20 31 20  d;.  int ii = 1 
b050: 2d 20 70 43 75 72 2d 3e 62 50 6f 69 6e 74 3b 0a  - pCur->bPoint;.
b060: 20 20 61 73 73 65 72 74 28 20 69 69 3d 3d 30 20    assert( ii==0 
b070: 7c 7c 20 69 69 3d 3d 31 20 29 3b 0a 20 20 61 73  || ii==1 );.  as
b080: 73 65 72 74 28 20 70 43 75 72 2d 3e 62 50 6f 69  sert( pCur->bPoi
b090: 6e 74 20 7c 7c 20 70 43 75 72 2d 3e 6e 50 6f 69  nt || pCur->nPoi
b0a0: 6e 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  nt );.  if( pCur
b0b0: 2d 3e 61 4e 6f 64 65 5b 69 69 5d 3d 3d 30 20 29  ->aNode[ii]==0 )
b0c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  {.    assert( pR
b0d0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 69 64 20 3d  C!=0 );.    id =
b0e0: 20 69 69 20 3f 20 70 43 75 72 2d 3e 61 50 6f 69   ii ? pCur->aPoi
b0f0: 6e 74 5b 30 5d 2e 69 64 20 3a 20 70 43 75 72 2d  nt[0].id : pCur-
b100: 3e 73 50 6f 69 6e 74 2e 69 64 3b 0a 20 20 20 20  >sPoint.id;.    
b110: 2a 70 52 43 20 3d 20 6e 6f 64 65 41 63 71 75 69  *pRC = nodeAcqui
b120: 72 65 28 52 54 52 45 45 5f 4f 46 5f 43 55 52 53  re(RTREE_OF_CURS
b130: 4f 52 28 70 43 75 72 29 2c 20 69 64 2c 20 30 2c  OR(pCur), id, 0,
b140: 20 26 70 43 75 72 2d 3e 61 4e 6f 64 65 5b 69 69   &pCur->aNode[ii
b150: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ]);.  }.  return
b160: 20 70 43 75 72 2d 3e 61 4e 6f 64 65 5b 69 69 5d   pCur->aNode[ii]
b170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20  ;.}../*.** Push 
b180: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 6f 6e  a new element on
b190: 74 6f 20 74 68 65 20 70 72 69 6f 72 69 74 79 20  to the priority 
b1a0: 71 75 65 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20  queue.*/.static 
b1b0: 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  RtreeSearchPoint
b1c0: 20 2a 72 74 72 65 65 45 6e 71 75 65 75 65 28 0a   *rtreeEnqueue(.
b1d0: 20 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70    RtreeCursor *p
b1e0: 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 63  Cur,    /* The c
b1f0: 75 72 73 6f 72 20 2a 2f 0a 20 20 52 74 72 65 65  ursor */.  Rtree
b200: 44 56 61 6c 75 65 20 72 53 63 6f 72 65 2c 20 20  DValue rScore,  
b210: 20 2f 2a 20 53 63 6f 72 65 20 66 6f 72 20 74 68   /* Score for th
b220: 65 20 6e 65 77 20 73 65 61 72 63 68 20 70 6f 69  e new search poi
b230: 6e 74 20 2a 2f 0a 20 20 75 38 20 69 4c 65 76 65  nt */.  u8 iLeve
b240: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l             /*
b250: 20 4c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6e   Level for the n
b260: 65 77 20 73 65 61 72 63 68 20 70 6f 69 6e 74 20  ew search point 
b270: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
b280: 3b 0a 20 20 52 74 72 65 65 53 65 61 72 63 68 50  ;.  RtreeSearchP
b290: 6f 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66  oint *pNew;.  if
b2a0: 28 20 70 43 75 72 2d 3e 6e 50 6f 69 6e 74 3e 3d  ( pCur->nPoint>=
b2b0: 70 43 75 72 2d 3e 6e 50 6f 69 6e 74 41 6c 6c 6f  pCur->nPointAllo
b2c0: 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65  c ){.    int nNe
b2d0: 77 20 3d 20 70 43 75 72 2d 3e 6e 50 6f 69 6e 74  w = pCur->nPoint
b2e0: 41 6c 6c 6f 63 2a 32 20 2b 20 38 3b 0a 20 20 20  Alloc*2 + 8;.   
b2f0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
b300: 72 65 61 6c 6c 6f 63 36 34 28 70 43 75 72 2d 3e  realloc64(pCur->
b310: 61 50 6f 69 6e 74 2c 20 6e 4e 65 77 2a 73 69 7a  aPoint, nNew*siz
b320: 65 6f 66 28 70 43 75 72 2d 3e 61 50 6f 69 6e 74  eof(pCur->aPoint
b330: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70  [0]));.    if( p
b340: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
b350: 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 50 6f  0;.    pCur->aPo
b360: 69 6e 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  int = pNew;.    
b370: 70 43 75 72 2d 3e 6e 50 6f 69 6e 74 41 6c 6c 6f  pCur->nPointAllo
b380: 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 20 20  c = nNew;.  }.  
b390: 69 20 3d 20 70 43 75 72 2d 3e 6e 50 6f 69 6e 74  i = pCur->nPoint
b3a0: 2b 2b 3b 0a 20 20 70 4e 65 77 20 3d 20 70 43 75  ++;.  pNew = pCu
b3b0: 72 2d 3e 61 50 6f 69 6e 74 20 2b 20 69 3b 0a 20  r->aPoint + i;. 
b3c0: 20 70 4e 65 77 2d 3e 72 53 63 6f 72 65 20 3d 20   pNew->rScore = 
b3d0: 72 53 63 6f 72 65 3b 0a 20 20 70 4e 65 77 2d 3e  rScore;.  pNew->
b3e0: 69 4c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b  iLevel = iLevel;
b3f0: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65  .  assert( iLeve
b400: 6c 3c 3d 52 54 52 45 45 5f 4d 41 58 5f 44 45 50  l<=RTREE_MAX_DEP
b410: 54 48 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  TH );.  while( i
b420: 3e 30 20 29 7b 0a 20 20 20 20 52 74 72 65 65 53  >0 ){.    RtreeS
b430: 65 61 72 63 68 50 6f 69 6e 74 20 2a 70 50 61 72  earchPoint *pPar
b440: 65 6e 74 3b 0a 20 20 20 20 6a 20 3d 20 28 69 2d  ent;.    j = (i-
b450: 31 29 2f 32 3b 0a 20 20 20 20 70 50 61 72 65 6e  1)/2;.    pParen
b460: 74 20 3d 20 70 43 75 72 2d 3e 61 50 6f 69 6e 74  t = pCur->aPoint
b470: 20 2b 20 6a 3b 0a 20 20 20 20 69 66 28 20 72 74   + j;.    if( rt
b480: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 43 6f  reeSearchPointCo
b490: 6d 70 61 72 65 28 70 4e 65 77 2c 20 70 50 61 72  mpare(pNew, pPar
b4a0: 65 6e 74 29 3e 3d 30 20 29 20 62 72 65 61 6b 3b  ent)>=0 ) break;
b4b0: 0a 20 20 20 20 72 74 72 65 65 53 65 61 72 63 68  .    rtreeSearch
b4c0: 50 6f 69 6e 74 53 77 61 70 28 70 43 75 72 2c 20  PointSwap(pCur, 
b4d0: 6a 2c 20 69 29 3b 0a 20 20 20 20 69 20 3d 20 6a  j, i);.    i = j
b4e0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 50 61  ;.    pNew = pPa
b4f0: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
b500: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
b510: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
b520: 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   RtreeSearchPoin
b530: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
b540: 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 52  ointer to it.  R
b550: 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66  eturn.** NULL if
b560: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
b570: 2f 0a 73 74 61 74 69 63 20 52 74 72 65 65 53 65  /.static RtreeSe
b580: 61 72 63 68 50 6f 69 6e 74 20 2a 72 74 72 65 65  archPoint *rtree
b590: 53 65 61 72 63 68 50 6f 69 6e 74 4e 65 77 28 0a  SearchPointNew(.
b5a0: 20 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70    RtreeCursor *p
b5b0: 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 63  Cur,    /* The c
b5c0: 75 72 73 6f 72 20 2a 2f 0a 20 20 52 74 72 65 65  ursor */.  Rtree
b5d0: 44 56 61 6c 75 65 20 72 53 63 6f 72 65 2c 20 20  DValue rScore,  
b5e0: 20 2f 2a 20 53 63 6f 72 65 20 66 6f 72 20 74 68   /* Score for th
b5f0: 65 20 6e 65 77 20 73 65 61 72 63 68 20 70 6f 69  e new search poi
b600: 6e 74 20 2a 2f 0a 20 20 75 38 20 69 4c 65 76 65  nt */.  u8 iLeve
b610: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l             /*
b620: 20 4c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6e   Level for the n
b630: 65 77 20 73 65 61 72 63 68 20 70 6f 69 6e 74 20  ew search point 
b640: 2a 2f 0a 29 7b 0a 20 20 52 74 72 65 65 53 65 61  */.){.  RtreeSea
b650: 72 63 68 50 6f 69 6e 74 20 2a 70 4e 65 77 2c 20  rchPoint *pNew, 
b660: 2a 70 46 69 72 73 74 3b 0a 20 20 70 46 69 72 73  *pFirst;.  pFirs
b670: 74 20 3d 20 72 74 72 65 65 53 65 61 72 63 68 50  t = rtreeSearchP
b680: 6f 69 6e 74 46 69 72 73 74 28 70 43 75 72 29 3b  ointFirst(pCur);
b690: 0a 20 20 70 43 75 72 2d 3e 61 6e 51 75 65 75 65  .  pCur->anQueue
b6a0: 5b 69 4c 65 76 65 6c 5d 2b 2b 3b 0a 20 20 69 66  [iLevel]++;.  if
b6b0: 28 20 70 46 69 72 73 74 3d 3d 30 0a 20 20 20 7c  ( pFirst==0.   |
b6c0: 7c 20 70 46 69 72 73 74 2d 3e 72 53 63 6f 72 65  | pFirst->rScore
b6d0: 3e 72 53 63 6f 72 65 20 0a 20 20 20 7c 7c 20 28  >rScore .   || (
b6e0: 70 46 69 72 73 74 2d 3e 72 53 63 6f 72 65 3d 3d  pFirst->rScore==
b6f0: 72 53 63 6f 72 65 20 26 26 20 70 46 69 72 73 74  rScore && pFirst
b700: 2d 3e 69 4c 65 76 65 6c 3e 69 4c 65 76 65 6c 29  ->iLevel>iLevel)
b710: 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
b720: 75 72 2d 3e 62 50 6f 69 6e 74 20 29 7b 0a 20 20  ur->bPoint ){.  
b730: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
b740: 20 20 70 4e 65 77 20 3d 20 72 74 72 65 65 45 6e    pNew = rtreeEn
b750: 71 75 65 75 65 28 70 43 75 72 2c 20 72 53 63 6f  queue(pCur, rSco
b760: 72 65 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20  re, iLevel);.   
b770: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
b780: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
b790: 20 69 69 20 3d 20 28 69 6e 74 29 28 70 4e 65 77   ii = (int)(pNew
b7a0: 20 2d 20 70 43 75 72 2d 3e 61 50 6f 69 6e 74 29   - pCur->aPoint)
b7b0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   + 1;.      if( 
b7c0: 69 69 3c 52 54 52 45 45 5f 43 41 43 48 45 5f 53  ii<RTREE_CACHE_S
b7d0: 5a 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  Z ){.        ass
b7e0: 65 72 74 28 20 70 43 75 72 2d 3e 61 4e 6f 64 65  ert( pCur->aNode
b7f0: 5b 69 69 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20  [ii]==0 );.     
b800: 20 20 20 70 43 75 72 2d 3e 61 4e 6f 64 65 5b 69     pCur->aNode[i
b810: 69 5d 20 3d 20 70 43 75 72 2d 3e 61 4e 6f 64 65  i] = pCur->aNode
b820: 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [0];.      }else
b830: 7b 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 52 65  {.        nodeRe
b840: 6c 65 61 73 65 28 52 54 52 45 45 5f 4f 46 5f 43  lease(RTREE_OF_C
b850: 55 52 53 4f 52 28 70 43 75 72 29 2c 20 70 43 75  URSOR(pCur), pCu
b860: 72 2d 3e 61 4e 6f 64 65 5b 30 5d 29 3b 0a 20 20  r->aNode[0]);.  
b870: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
b880: 2d 3e 61 4e 6f 64 65 5b 30 5d 20 3d 20 30 3b 0a  ->aNode[0] = 0;.
b890: 20 20 20 20 20 20 2a 70 4e 65 77 20 3d 20 70 43        *pNew = pC
b8a0: 75 72 2d 3e 73 50 6f 69 6e 74 3b 0a 20 20 20 20  ur->sPoint;.    
b8b0: 7d 0a 20 20 20 20 70 43 75 72 2d 3e 73 50 6f 69  }.    pCur->sPoi
b8c0: 6e 74 2e 72 53 63 6f 72 65 20 3d 20 72 53 63 6f  nt.rScore = rSco
b8d0: 72 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 50  re;.    pCur->sP
b8e0: 6f 69 6e 74 2e 69 4c 65 76 65 6c 20 3d 20 69 4c  oint.iLevel = iL
b8f0: 65 76 65 6c 3b 0a 20 20 20 20 70 43 75 72 2d 3e  evel;.    pCur->
b900: 62 50 6f 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20  bPoint = 1;.    
b910: 72 65 74 75 72 6e 20 26 70 43 75 72 2d 3e 73 50  return &pCur->sP
b920: 6f 69 6e 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oint;.  }else{. 
b930: 20 20 20 72 65 74 75 72 6e 20 72 74 72 65 65 45     return rtreeE
b940: 6e 71 75 65 75 65 28 70 43 75 72 2c 20 72 53 63  nqueue(pCur, rSc
b950: 6f 72 65 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20  ore, iLevel);.  
b960: 7d 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 20 54 72  }.}..#if 0./* Tr
b970: 61 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 66  acing routines f
b980: 6f 72 20 74 68 65 20 52 74 72 65 65 53 65 61 72  or the RtreeSear
b990: 63 68 50 6f 69 6e 74 20 71 75 65 75 65 20 2a 2f  chPoint queue */
b9a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
b9b0: 63 65 50 6f 69 6e 74 28 52 74 72 65 65 53 65 61  cePoint(RtreeSea
b9c0: 72 63 68 50 6f 69 6e 74 20 2a 70 2c 20 69 6e 74  rchPoint *p, int
b9d0: 20 69 64 78 2c 20 52 74 72 65 65 43 75 72 73 6f   idx, RtreeCurso
b9e0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
b9f0: 69 64 78 3c 30 20 29 7b 20 70 72 69 6e 74 66 28  idx<0 ){ printf(
ba00: 22 20 73 22 29 3b 20 7d 65 6c 73 65 7b 20 70 72  " s"); }else{ pr
ba10: 69 6e 74 66 28 22 25 32 64 22 2c 20 69 64 78 29  intf("%2d", idx)
ba20: 3b 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 20 25  ; }.  printf(" %
ba30: 64 2e 25 30 35 6c 6c 64 2e 25 30 32 64 20 25 67  d.%05lld.%02d %g
ba40: 20 25 64 22 2c 0a 20 20 20 20 70 2d 3e 69 4c 65   %d",.    p->iLe
ba50: 76 65 6c 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 69  vel, p->id, p->i
ba60: 43 65 6c 6c 2c 20 70 2d 3e 72 53 63 6f 72 65 2c  Cell, p->rScore,
ba70: 20 70 2d 3e 65 57 69 74 68 69 6e 0a 20 20 29 3b   p->eWithin.  );
ba80: 0a 20 20 69 64 78 2b 2b 3b 0a 20 20 69 66 28 20  .  idx++;.  if( 
ba90: 69 64 78 3c 52 54 52 45 45 5f 43 41 43 48 45 5f  idx<RTREE_CACHE_
baa0: 53 5a 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  SZ ){.    printf
bab0: 28 22 20 25 70 5c 6e 22 2c 20 70 43 75 72 2d 3e  (" %p\n", pCur->
bac0: 61 4e 6f 64 65 5b 69 64 78 5d 29 3b 0a 20 20 7d  aNode[idx]);.  }
bad0: 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74 66  else{.    printf
bae0: 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 73 74  ("\n");.  }.}.st
baf0: 61 74 69 63 20 76 6f 69 64 20 74 72 61 63 65 51  atic void traceQ
bb00: 75 65 75 65 28 52 74 72 65 65 43 75 72 73 6f 72  ueue(RtreeCursor
bb10: 20 2a 70 43 75 72 2c 20 63 6f 6e 73 74 20 63 68   *pCur, const ch
bb20: 61 72 20 2a 7a 50 72 65 66 69 78 29 7b 0a 20 20  ar *zPrefix){.  
bb30: 69 6e 74 20 69 69 3b 0a 20 20 70 72 69 6e 74 66  int ii;.  printf
bb40: 28 22 3d 3d 3d 20 25 39 73 20 22 2c 20 7a 50 72  ("=== %9s ", zPr
bb50: 65 66 69 78 29 3b 0a 20 20 69 66 28 20 70 43 75  efix);.  if( pCu
bb60: 72 2d 3e 62 50 6f 69 6e 74 20 29 7b 0a 20 20 20  r->bPoint ){.   
bb70: 20 74 72 61 63 65 50 6f 69 6e 74 28 26 70 43 75   tracePoint(&pCu
bb80: 72 2d 3e 73 50 6f 69 6e 74 2c 20 2d 31 2c 20 70  r->sPoint, -1, p
bb90: 43 75 72 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Cur);.  }.  for(
bba0: 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 6e  ii=0; ii<pCur->n
bbb0: 50 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  Point; ii++){.  
bbc0: 20 20 69 66 28 20 69 69 3e 30 20 7c 7c 20 70 43    if( ii>0 || pC
bbd0: 75 72 2d 3e 62 50 6f 69 6e 74 20 29 20 70 72 69  ur->bPoint ) pri
bbe0: 6e 74 66 28 22 20 20 20 20 20 20 20 20 20 20 20  ntf("           
bbf0: 20 20 20 22 29 3b 0a 20 20 20 20 74 72 61 63 65     ");.    trace
bc00: 50 6f 69 6e 74 28 26 70 43 75 72 2d 3e 61 50 6f  Point(&pCur->aPo
bc10: 69 6e 74 5b 69 69 5d 2c 20 69 69 2c 20 70 43 75  int[ii], ii, pCu
bc20: 72 29 3b 0a 20 20 7d 0a 7d 0a 23 20 64 65 66 69  r);.  }.}.# defi
bc30: 6e 65 20 52 54 52 45 45 5f 51 55 45 55 45 5f 54  ne RTREE_QUEUE_T
bc40: 52 41 43 45 28 41 2c 42 29 20 74 72 61 63 65 51  RACE(A,B) traceQ
bc50: 75 65 75 65 28 41 2c 42 29 0a 23 65 6c 73 65 0a  ueue(A,B).#else.
bc60: 23 20 64 65 66 69 6e 65 20 52 54 52 45 45 5f 51  # define RTREE_Q
bc70: 55 45 55 45 5f 54 52 41 43 45 28 41 2c 42 29 20  UEUE_TRACE(A,B) 
bc80: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65    /* no-op */.#e
bc90: 6e 64 69 66 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20  ndif../* Remove 
bca0: 74 68 65 20 73 65 61 72 63 68 20 70 6f 69 6e 74  the search point
bcb0: 20 77 69 74 68 20 74 68 65 20 6c 6f 77 65 73 74   with the lowest
bcc0: 20 63 75 72 72 65 6e 74 20 73 63 6f 72 65 2e 0a   current score..
bcd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
bce0: 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 50  treeSearchPointP
bcf0: 6f 70 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a  op(RtreeCursor *
bd00: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  p){.  int i, j, 
bd10: 6b 2c 20 6e 3b 0a 20 20 69 20 3d 20 31 20 2d 20  k, n;.  i = 1 - 
bd20: 70 2d 3e 62 50 6f 69 6e 74 3b 0a 20 20 61 73 73  p->bPoint;.  ass
bd30: 65 72 74 28 20 69 3d 3d 30 20 7c 7c 20 69 3d 3d  ert( i==0 || i==
bd40: 31 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4e  1 );.  if( p->aN
bd50: 6f 64 65 5b 69 5d 20 29 7b 0a 20 20 20 20 6e 6f  ode[i] ){.    no
bd60: 64 65 52 65 6c 65 61 73 65 28 52 54 52 45 45 5f  deRelease(RTREE_
bd70: 4f 46 5f 43 55 52 53 4f 52 28 70 29 2c 20 70 2d  OF_CURSOR(p), p-
bd80: 3e 61 4e 6f 64 65 5b 69 5d 29 3b 0a 20 20 20 20  >aNode[i]);.    
bd90: 70 2d 3e 61 4e 6f 64 65 5b 69 5d 20 3d 20 30 3b  p->aNode[i] = 0;
bda0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 62 50  .  }.  if( p->bP
bdb0: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  oint ){.    p->a
bdc0: 6e 51 75 65 75 65 5b 70 2d 3e 73 50 6f 69 6e 74  nQueue[p->sPoint
bdd0: 2e 69 4c 65 76 65 6c 5d 2d 2d 3b 0a 20 20 20 20  .iLevel]--;.    
bde0: 70 2d 3e 62 50 6f 69 6e 74 20 3d 20 30 3b 0a 20  p->bPoint = 0;. 
bdf0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 50   }else if( p->nP
be00: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  oint ){.    p->a
be10: 6e 51 75 65 75 65 5b 70 2d 3e 61 50 6f 69 6e 74  nQueue[p->aPoint
be20: 5b 30 5d 2e 69 4c 65 76 65 6c 5d 2d 2d 3b 0a 20  [0].iLevel]--;. 
be30: 20 20 20 6e 20 3d 20 2d 2d 70 2d 3e 6e 50 6f 69     n = --p->nPoi
be40: 6e 74 3b 0a 20 20 20 20 70 2d 3e 61 50 6f 69 6e  nt;.    p->aPoin
be50: 74 5b 30 5d 20 3d 20 70 2d 3e 61 50 6f 69 6e 74  t[0] = p->aPoint
be60: 5b 6e 5d 3b 0a 20 20 20 20 69 66 28 20 6e 3c 52  [n];.    if( n<R
be70: 54 52 45 45 5f 43 41 43 48 45 5f 53 5a 2d 31 20  TREE_CACHE_SZ-1 
be80: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4e 6f 64  ){.      p->aNod
be90: 65 5b 31 5d 20 3d 20 70 2d 3e 61 4e 6f 64 65 5b  e[1] = p->aNode[
bea0: 6e 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61  n+1];.      p->a
beb0: 4e 6f 64 65 5b 6e 2b 31 5d 20 3d 20 30 3b 0a 20  Node[n+1] = 0;. 
bec0: 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a     }.    i = 0;.
bed0: 20 20 20 20 77 68 69 6c 65 28 20 28 6a 20 3d 20      while( (j = 
bee0: 69 2a 32 2b 31 29 3c 6e 20 29 7b 0a 20 20 20 20  i*2+1)<n ){.    
bef0: 20 20 6b 20 3d 20 6a 2b 31 3b 0a 20 20 20 20 20    k = j+1;.     
bf00: 20 69 66 28 20 6b 3c 6e 20 26 26 20 72 74 72 65   if( k<n && rtre
bf10: 65 53 65 61 72 63 68 50 6f 69 6e 74 43 6f 6d 70  eSearchPointComp
bf20: 61 72 65 28 26 70 2d 3e 61 50 6f 69 6e 74 5b 6b  are(&p->aPoint[k
bf30: 5d 2c 20 26 70 2d 3e 61 50 6f 69 6e 74 5b 6a 5d  ], &p->aPoint[j]
bf40: 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  )<0 ){.        i
bf50: 66 28 20 72 74 72 65 65 53 65 61 72 63 68 50 6f  f( rtreeSearchPo
bf60: 69 6e 74 43 6f 6d 70 61 72 65 28 26 70 2d 3e 61  intCompare(&p->a
bf70: 50 6f 69 6e 74 5b 6b 5d 2c 20 26 70 2d 3e 61 50  Point[k], &p->aP
bf80: 6f 69 6e 74 5b 69 5d 29 3c 30 20 29 7b 0a 20 20  oint[i])<0 ){.  
bf90: 20 20 20 20 20 20 20 20 72 74 72 65 65 53 65 61          rtreeSea
bfa0: 72 63 68 50 6f 69 6e 74 53 77 61 70 28 70 2c 20  rchPointSwap(p, 
bfb0: 69 2c 20 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  i, k);.         
bfc0: 20 69 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20   i = k;.        
bfd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
bfe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
bff0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
c000: 20 20 20 20 20 20 20 69 66 28 20 72 74 72 65 65         if( rtree
c010: 53 65 61 72 63 68 50 6f 69 6e 74 43 6f 6d 70 61  SearchPointCompa
c020: 72 65 28 26 70 2d 3e 61 50 6f 69 6e 74 5b 6a 5d  re(&p->aPoint[j]
c030: 2c 20 26 70 2d 3e 61 50 6f 69 6e 74 5b 69 5d 29  , &p->aPoint[i])
c040: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
c050: 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  rtreeSearchPoint
c060: 53 77 61 70 28 70 2c 20 69 2c 20 6a 29 3b 0a 20  Swap(p, i, j);. 
c070: 20 20 20 20 20 20 20 20 20 69 20 3d 20 6a 3b 0a           i = j;.
c080: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c090: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c0a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c0b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
c0c0: 2f 2a 0a 2a 2a 20 43 6f 6e 74 69 6e 75 65 20 74  /*.** Continue t
c0d0: 68 65 20 73 65 61 72 63 68 20 6f 6e 20 63 75 72  he search on cur
c0e0: 73 6f 72 20 70 43 75 72 20 75 6e 74 69 6c 20 74  sor pCur until t
c0f0: 68 65 20 66 72 6f 6e 74 20 6f 66 20 74 68 65 20  he front of the 
c100: 71 75 65 75 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e  queue.** contain
c110: 73 20 61 6e 20 65 6e 74 72 79 20 73 75 69 74 61  s an entry suita
c120: 62 6c 65 20 66 6f 72 20 72 65 74 75 72 6e 69 6e  ble for returnin
c130: 67 20 61 73 20 61 20 72 65 73 75 6c 74 2d 73 65  g as a result-se
c140: 74 20 72 6f 77 2c 0a 2a 2a 20 6f 72 20 75 6e 74  t row,.** or unt
c150: 69 6c 20 74 68 65 20 52 74 72 65 65 53 65 61 72  il the RtreeSear
c160: 63 68 50 6f 69 6e 74 20 71 75 65 75 65 20 69 73  chPoint queue is
c170: 20 65 6d 70 74 79 2c 20 69 6e 64 69 63 61 74 69   empty, indicati
c180: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 71  ng that the.** q
c190: 75 65 72 79 20 68 61 73 20 63 6f 6d 70 6c 65 74  uery has complet
c1a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
c1b0: 74 20 72 74 72 65 65 53 74 65 70 54 6f 4c 65 61  t rtreeStepToLea
c1c0: 66 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70  f(RtreeCursor *p
c1d0: 43 75 72 29 7b 0a 20 20 52 74 72 65 65 53 65 61  Cur){.  RtreeSea
c1e0: 72 63 68 50 6f 69 6e 74 20 2a 70 3b 0a 20 20 52  rchPoint *p;.  R
c1f0: 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 52  tree *pRtree = R
c200: 54 52 45 45 5f 4f 46 5f 43 55 52 53 4f 52 28 70  TREE_OF_CURSOR(p
c210: 43 75 72 29 3b 0a 20 20 52 74 72 65 65 4e 6f 64  Cur);.  RtreeNod
c220: 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  e *pNode;.  int 
c230: 65 57 69 74 68 69 6e 3b 0a 20 20 69 6e 74 20 72  eWithin;.  int r
c240: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c250: 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e   int nCell;.  in
c260: 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
c270: 70 43 75 72 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  pCur->nConstrain
c280: 74 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  t;.  int ii;.  i
c290: 6e 74 20 65 49 6e 74 3b 0a 20 20 52 74 72 65 65  nt eInt;.  Rtree
c2a0: 53 65 61 72 63 68 50 6f 69 6e 74 20 78 3b 0a 0a  SearchPoint x;..
c2b0: 20 20 65 49 6e 74 20 3d 20 70 52 74 72 65 65 2d    eInt = pRtree-
c2c0: 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52  >eCoordType==RTR
c2d0: 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 3b 0a  EE_COORD_INT32;.
c2e0: 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 72 74    while( (p = rt
c2f0: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 46 69  reeSearchPointFi
c300: 72 73 74 28 70 43 75 72 29 29 21 3d 30 20 26 26  rst(pCur))!=0 &&
c310: 20 70 2d 3e 69 4c 65 76 65 6c 3e 30 20 29 7b 0a   p->iLevel>0 ){.
c320: 20 20 20 20 70 4e 6f 64 65 20 3d 20 72 74 72 65      pNode = rtre
c330: 65 4e 6f 64 65 4f 66 46 69 72 73 74 53 65 61 72  eNodeOfFirstSear
c340: 63 68 50 6f 69 6e 74 28 70 43 75 72 2c 20 26 72  chPoint(pCur, &r
c350: 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
c360: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c370: 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e  nCell = NCELL(pN
c380: 6f 64 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ode);.    assert
c390: 28 20 6e 43 65 6c 6c 3c 32 30 30 20 29 3b 0a 20  ( nCell<200 );. 
c3a0: 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 69 43 65     while( p->iCe
c3b0: 6c 6c 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  ll<nCell ){.    
c3c0: 20 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f    sqlite3_rtree_
c3d0: 64 62 6c 20 72 53 63 6f 72 65 20 3d 20 28 73 71  dbl rScore = (sq
c3e0: 6c 69 74 65 33 5f 72 74 72 65 65 5f 64 62 6c 29  lite3_rtree_dbl)
c3f0: 2d 31 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  -1;.      u8 *pC
c400: 65 6c 6c 44 61 74 61 20 3d 20 70 4e 6f 64 65 2d  ellData = pNode-
c410: 3e 7a 44 61 74 61 20 2b 20 28 34 2b 70 52 74 72  >zData + (4+pRtr
c420: 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c  ee->nBytesPerCel
c430: 6c 2a 70 2d 3e 69 43 65 6c 6c 29 3b 0a 20 20 20  l*p->iCell);.   
c440: 20 20 20 65 57 69 74 68 69 6e 20 3d 20 46 55 4c     eWithin = FUL
c450: 4c 59 5f 57 49 54 48 49 4e 3b 0a 20 20 20 20 20  LY_WITHIN;.     
c460: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43   for(ii=0; ii<nC
c470: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 69 2b 2b 29  onstraint; ii++)
c480: 7b 0a 20 20 20 20 20 20 20 20 52 74 72 65 65 43  {.        RtreeC
c490: 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73  onstraint *pCons
c4a0: 74 72 61 69 6e 74 20 3d 20 70 43 75 72 2d 3e 61  traint = pCur->a
c4b0: 43 6f 6e 73 74 72 61 69 6e 74 20 2b 20 69 69 3b  Constraint + ii;
c4c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
c4d0: 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3e 3d 52 54  nstraint->op>=RT
c4e0: 52 45 45 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20  REE_MATCH ){.   
c4f0: 20 20 20 20 20 20 20 72 63 20 3d 20 72 74 72 65         rc = rtre
c500: 65 43 61 6c 6c 62 61 63 6b 43 6f 6e 73 74 72 61  eCallbackConstra
c510: 69 6e 74 28 70 43 6f 6e 73 74 72 61 69 6e 74 2c  int(pConstraint,
c520: 20 65 49 6e 74 2c 20 70 43 65 6c 6c 44 61 74 61   eInt, pCellData
c530: 2c 20 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , p,.           
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 20 20 20 20 20 20 20 26 72 53 63              &rSc
c560: 6f 72 65 2c 20 26 65 57 69 74 68 69 6e 29 3b 0a  ore, &eWithin);.
c570: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
c580: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c590: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c5a0: 70 2d 3e 69 4c 65 76 65 6c 3d 3d 31 20 29 7b 0a  p->iLevel==1 ){.
c5b0: 20 20 20 20 20 20 20 20 20 20 72 74 72 65 65 4c            rtreeL
c5c0: 65 61 66 43 6f 6e 73 74 72 61 69 6e 74 28 70 43  eafConstraint(pC
c5d0: 6f 6e 73 74 72 61 69 6e 74 2c 20 65 49 6e 74 2c  onstraint, eInt,
c5e0: 20 70 43 65 6c 6c 44 61 74 61 2c 20 26 65 57 69   pCellData, &eWi
c5f0: 74 68 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  thin);.        }
c600: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c610: 72 74 72 65 65 4e 6f 6e 6c 65 61 66 43 6f 6e 73  rtreeNonleafCons
c620: 74 72 61 69 6e 74 28 70 43 6f 6e 73 74 72 61 69  traint(pConstrai
c630: 6e 74 2c 20 65 49 6e 74 2c 20 70 43 65 6c 6c 44  nt, eInt, pCellD
c640: 61 74 61 2c 20 26 65 57 69 74 68 69 6e 29 3b 0a  ata, &eWithin);.
c650: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c660: 20 20 69 66 28 20 65 57 69 74 68 69 6e 3d 3d 4e    if( eWithin==N
c670: 4f 54 5f 57 49 54 48 49 4e 20 29 20 62 72 65 61  OT_WITHIN ) brea
c680: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
c690: 20 70 2d 3e 69 43 65 6c 6c 2b 2b 3b 0a 20 20 20   p->iCell++;.   
c6a0: 20 20 20 69 66 28 20 65 57 69 74 68 69 6e 3d 3d     if( eWithin==
c6b0: 4e 4f 54 5f 57 49 54 48 49 4e 20 29 20 63 6f 6e  NOT_WITHIN ) con
c6c0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 78 2e 69  tinue;.      x.i
c6d0: 4c 65 76 65 6c 20 3d 20 70 2d 3e 69 4c 65 76 65  Level = p->iLeve
c6e0: 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  l - 1;.      if(
c6f0: 20 78 2e 69 4c 65 76 65 6c 20 29 7b 0a 20 20 20   x.iLevel ){.   
c700: 20 20 20 20 20 78 2e 69 64 20 3d 20 72 65 61 64       x.id = read
c710: 49 6e 74 36 34 28 70 43 65 6c 6c 44 61 74 61 29  Int64(pCellData)
c720: 3b 0a 20 20 20 20 20 20 20 20 78 2e 69 43 65 6c  ;.        x.iCel
c730: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  l = 0;.      }el
c740: 73 65 7b 0a 20 20 20 20 20 20 20 20 78 2e 69 64  se{.        x.id
c750: 20 3d 20 70 2d 3e 69 64 3b 0a 20 20 20 20 20 20   = p->id;.      
c760: 20 20 78 2e 69 43 65 6c 6c 20 3d 20 70 2d 3e 69    x.iCell = p->i
c770: 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20  Cell - 1;.      
c780: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  }.      if( p->i
c790: 43 65 6c 6c 3e 3d 6e 43 65 6c 6c 20 29 7b 0a 20  Cell>=nCell ){. 
c7a0: 20 20 20 20 20 20 20 52 54 52 45 45 5f 51 55 45         RTREE_QUE
c7b0: 55 45 5f 54 52 41 43 45 28 70 43 75 72 2c 20 22  UE_TRACE(pCur, "
c7c0: 50 4f 50 2d 53 3a 22 29 3b 0a 20 20 20 20 20 20  POP-S:");.      
c7d0: 20 20 72 74 72 65 65 53 65 61 72 63 68 50 6f 69    rtreeSearchPoi
c7e0: 6e 74 50 6f 70 28 70 43 75 72 29 3b 0a 20 20 20  ntPop(pCur);.   
c7f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
c800: 53 63 6f 72 65 3c 52 54 52 45 45 5f 5a 45 52 4f  Score<RTREE_ZERO
c810: 20 29 20 72 53 63 6f 72 65 20 3d 20 52 54 52 45   ) rScore = RTRE
c820: 45 5f 5a 45 52 4f 3b 0a 20 20 20 20 20 20 70 20  E_ZERO;.      p 
c830: 3d 20 72 74 72 65 65 53 65 61 72 63 68 50 6f 69  = rtreeSearchPoi
c840: 6e 74 4e 65 77 28 70 43 75 72 2c 20 72 53 63 6f  ntNew(pCur, rSco
c850: 72 65 2c 20 78 2e 69 4c 65 76 65 6c 29 3b 0a 20  re, x.iLevel);. 
c860: 20 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20       if( p==0 ) 
c870: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c880: 4d 45 4d 3b 0a 20 20 20 20 20 20 70 2d 3e 65 57  MEM;.      p->eW
c890: 69 74 68 69 6e 20 3d 20 28 75 38 29 65 57 69 74  ithin = (u8)eWit
c8a0: 68 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 69 64  hin;.      p->id
c8b0: 20 3d 20 78 2e 69 64 3b 0a 20 20 20 20 20 20 70   = x.id;.      p
c8c0: 2d 3e 69 43 65 6c 6c 20 3d 20 78 2e 69 43 65 6c  ->iCell = x.iCel
c8d0: 6c 3b 0a 20 20 20 20 20 20 52 54 52 45 45 5f 51  l;.      RTREE_Q
c8e0: 55 45 55 45 5f 54 52 41 43 45 28 70 43 75 72 2c  UEUE_TRACE(pCur,
c8f0: 20 22 50 55 53 48 2d 53 3a 22 29 3b 0a 20 20 20   "PUSH-S:");.   
c900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c910: 20 20 20 20 69 66 28 20 70 2d 3e 69 43 65 6c 6c      if( p->iCell
c920: 3e 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  >=nCell ){.     
c930: 20 52 54 52 45 45 5f 51 55 45 55 45 5f 54 52 41   RTREE_QUEUE_TRA
c940: 43 45 28 70 43 75 72 2c 20 22 50 4f 50 2d 53 65  CE(pCur, "POP-Se
c950: 3a 22 29 3b 0a 20 20 20 20 20 20 72 74 72 65 65  :");.      rtree
c960: 53 65 61 72 63 68 50 6f 69 6e 74 50 6f 70 28 70  SearchPointPop(p
c970: 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
c980: 20 20 70 43 75 72 2d 3e 61 74 45 4f 46 20 3d 20    pCur->atEOF = 
c990: 70 3d 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 53  p==0;.  return S
c9a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
c9b0: 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75 61  .** Rtree virtua
c9c0: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
c9d0: 4e 65 78 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  Next method..*/.
c9e0: 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65  static int rtree
c9f0: 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61  Next(sqlite3_vta
ca00: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
ca10: 75 72 73 6f 72 29 7b 0a 20 20 52 74 72 65 65 43  ursor){.  RtreeC
ca20: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 52  ursor *pCsr = (R
ca30: 74 72 65 65 43 75 72 73 6f 72 20 2a 29 70 56 74  treeCursor *)pVt
ca40: 61 62 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20  abCursor;.  int 
ca50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ca60: 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 6f 20 74 68  .  /* Move to th
ca70: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 74 68 61  e next entry tha
ca80: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 6f  t matches the co
ca90: 6e 66 69 67 75 72 65 64 20 63 6f 6e 73 74 72 61  nfigured constra
caa0: 69 6e 74 73 2e 20 2a 2f 0a 20 20 52 54 52 45 45  ints. */.  RTREE
cab0: 5f 51 55 45 55 45 5f 54 52 41 43 45 28 70 43 73  _QUEUE_TRACE(pCs
cac0: 72 2c 20 22 50 4f 50 2d 4e 78 3a 22 29 3b 0a 20  r, "POP-Nx:");. 
cad0: 20 69 66 28 20 70 43 73 72 2d 3e 62 41 75 78 56   if( pCsr->bAuxV
cae0: 61 6c 69 64 20 29 7b 0a 20 20 20 20 70 43 73 72  alid ){.    pCsr
caf0: 2d 3e 62 41 75 78 56 61 6c 69 64 20 3d 20 30 3b  ->bAuxValid = 0;
cb00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
cb10: 65 74 28 70 43 73 72 2d 3e 70 52 65 61 64 41 75  et(pCsr->pReadAu
cb20: 78 29 3b 0a 20 20 7d 0a 20 20 72 74 72 65 65 53  x);.  }.  rtreeS
cb30: 65 61 72 63 68 50 6f 69 6e 74 50 6f 70 28 70 43  earchPointPop(pC
cb40: 73 72 29 3b 0a 20 20 72 63 20 3d 20 72 74 72 65  sr);.  rc = rtre
cb50: 65 53 74 65 70 54 6f 4c 65 61 66 28 70 43 73 72  eStepToLeaf(pCsr
cb60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
cb70: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20  }../* .** Rtree 
cb80: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
cb90: 64 75 6c 65 20 78 52 6f 77 69 64 20 6d 65 74 68  dule xRowid meth
cba0: 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
cbb0: 74 20 72 74 72 65 65 52 6f 77 69 64 28 73 71 6c  t rtreeRowid(sql
cbc0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
cbd0: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20 73   *pVtabCursor, s
cbe0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f  qlite_int64 *pRo
cbf0: 77 69 64 29 7b 0a 20 20 52 74 72 65 65 43 75 72  wid){.  RtreeCur
cc00: 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 52 74 72  sor *pCsr = (Rtr
cc10: 65 65 43 75 72 73 6f 72 20 2a 29 70 56 74 61 62  eeCursor *)pVtab
cc20: 43 75 72 73 6f 72 3b 0a 20 20 52 74 72 65 65 53  Cursor;.  RtreeS
cc30: 65 61 72 63 68 50 6f 69 6e 74 20 2a 70 20 3d 20  earchPoint *p = 
cc40: 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  rtreeSearchPoint
cc50: 46 69 72 73 74 28 70 43 73 72 29 3b 0a 20 20 69  First(pCsr);.  i
cc60: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
cc70: 4b 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  K;.  RtreeNode *
cc80: 70 4e 6f 64 65 20 3d 20 72 74 72 65 65 4e 6f 64  pNode = rtreeNod
cc90: 65 4f 66 46 69 72 73 74 53 65 61 72 63 68 50 6f  eOfFirstSearchPo
cca0: 69 6e 74 28 70 43 73 72 2c 20 26 72 63 29 3b 0a  int(pCsr, &rc);.
ccb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ccc0: 5f 4f 4b 20 26 26 20 70 20 29 7b 0a 20 20 20 20  _OK && p ){.    
ccd0: 2a 70 52 6f 77 69 64 20 3d 20 6e 6f 64 65 47 65  *pRowid = nodeGe
cce0: 74 52 6f 77 69 64 28 52 54 52 45 45 5f 4f 46 5f  tRowid(RTREE_OF_
ccf0: 43 55 52 53 4f 52 28 70 43 73 72 29 2c 20 70 4e  CURSOR(pCsr), pN
cd00: 6f 64 65 2c 20 70 2d 3e 69 43 65 6c 6c 29 3b 0a  ode, p->iCell);.
cd10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
cd20: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65  .}../* .** Rtree
cd30: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
cd40: 6f 64 75 6c 65 20 78 43 6f 6c 75 6d 6e 20 6d 65  odule xColumn me
cd50: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
cd60: 69 6e 74 20 72 74 72 65 65 43 6f 6c 75 6d 6e 28  int rtreeColumn(
cd70: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
cd80: 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69 74 65  sor *cur, sqlite
cd90: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
cda0: 69 6e 74 20 69 29 7b 0a 20 20 52 74 72 65 65 20  int i){.  Rtree 
cdb0: 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65  *pRtree = (Rtree
cdc0: 20 2a 29 63 75 72 2d 3e 70 56 74 61 62 3b 0a 20   *)cur->pVtab;. 
cdd0: 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43   RtreeCursor *pC
cde0: 73 72 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f  sr = (RtreeCurso
cdf0: 72 20 2a 29 63 75 72 3b 0a 20 20 52 74 72 65 65  r *)cur;.  Rtree
ce00: 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70 20 3d  SearchPoint *p =
ce10: 20 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   rtreeSearchPoin
ce20: 74 46 69 72 73 74 28 70 43 73 72 29 3b 0a 20 20  tFirst(pCsr);.  
ce30: 52 74 72 65 65 43 6f 6f 72 64 20 63 3b 0a 20 20  RtreeCoord c;.  
ce40: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ce50: 4f 4b 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  OK;.  RtreeNode 
ce60: 2a 70 4e 6f 64 65 20 3d 20 72 74 72 65 65 4e 6f  *pNode = rtreeNo
ce70: 64 65 4f 66 46 69 72 73 74 53 65 61 72 63 68 50  deOfFirstSearchP
ce80: 6f 69 6e 74 28 70 43 73 72 2c 20 26 72 63 29 3b  oint(pCsr, &rc);
ce90: 0a 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ..  if( rc ) ret
cea0: 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 70 3d  urn rc;.  if( p=
ceb0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
cec0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 3d 3d  TE_OK;.  if( i==
ced0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
cee0: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74  _result_int64(ct
cef0: 78 2c 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28  x, nodeGetRowid(
cf00: 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 70  pRtree, pNode, p
cf10: 2d 3e 69 43 65 6c 6c 29 29 3b 0a 20 20 7d 65 6c  ->iCell));.  }el
cf20: 73 65 20 69 66 28 20 69 3c 3d 70 52 74 72 65 65  se if( i<=pRtree
cf30: 2d 3e 6e 44 69 6d 32 20 29 7b 0a 20 20 20 20 6e  ->nDim2 ){.    n
cf40: 6f 64 65 47 65 74 43 6f 6f 72 64 28 70 52 74 72  odeGetCoord(pRtr
cf50: 65 65 2c 20 70 4e 6f 64 65 2c 20 70 2d 3e 69 43  ee, pNode, p->iC
cf60: 65 6c 6c 2c 20 69 2d 31 2c 20 26 63 29 3b 0a 23  ell, i-1, &c);.#
cf70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 52 54  ifndef SQLITE_RT
cf80: 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20  REE_INT_ONLY.   
cf90: 20 69 66 28 20 70 52 74 72 65 65 2d 3e 65 43 6f   if( pRtree->eCo
cfa0: 6f 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f 43  ordType==RTREE_C
cfb0: 4f 4f 52 44 5f 52 45 41 4c 33 32 20 29 7b 0a 20  OORD_REAL32 ){. 
cfc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
cfd0: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 74 78 2c 20  ult_double(ctx, 
cfe0: 63 2e 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  c.f);.    }else.
cff0: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
d000: 20 20 20 61 73 73 65 72 74 28 20 70 52 74 72 65     assert( pRtre
d010: 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52  e->eCoordType==R
d020: 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32  TREE_COORD_INT32
d030: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
d040: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78  3_result_int(ctx
d050: 2c 20 63 2e 69 29 3b 0a 20 20 20 20 7d 0a 20 20  , c.i);.    }.  
d060: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 21  }else{.    if( !
d070: 70 43 73 72 2d 3e 62 41 75 78 56 61 6c 69 64 20  pCsr->bAuxValid 
d080: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73  ){.      if( pCs
d090: 72 2d 3e 70 52 65 61 64 41 75 78 3d 3d 30 20 29  r->pReadAux==0 )
d0a0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
d0b0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
d0c0: 33 28 70 52 74 72 65 65 2d 3e 64 62 2c 20 70 52  3(pRtree->db, pR
d0d0: 74 72 65 65 2d 3e 7a 52 65 61 64 41 75 78 53 71  tree->zReadAuxSq
d0e0: 6c 2c 20 2d 31 2c 20 30 2c 0a 20 20 20 20 20 20  l, -1, 0,.      
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 20 20 20 20 26 70 43 73 72 2d            &pCsr-
d110: 3e 70 52 65 61 64 41 75 78 2c 20 30 29 3b 0a 20  >pReadAux, 0);. 
d120: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
d130: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
d140: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
d150: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 73 72  _bind_int64(pCsr
d160: 2d 3e 70 52 65 61 64 41 75 78 2c 20 31 2c 20 0a  ->pReadAux, 1, .
d170: 20 20 20 20 20 20 20 20 20 20 6e 6f 64 65 47 65            nodeGe
d180: 74 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70  tRowid(pRtree, p
d190: 4e 6f 64 65 2c 20 70 2d 3e 69 43 65 6c 6c 29 29  Node, p->iCell))
d1a0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d1b0: 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d 3e  ite3_step(pCsr->
d1c0: 70 52 65 61 64 41 75 78 29 3b 0a 20 20 20 20 20  pReadAux);.     
d1d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d1e0: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ROW ){.        p
d1f0: 43 73 72 2d 3e 62 41 75 78 56 61 6c 69 64 20 3d  Csr->bAuxValid =
d200: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
d210: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d220: 5f 72 65 73 65 74 28 70 43 73 72 2d 3e 70 52 65  _reset(pCsr->pRe
d230: 61 64 41 75 78 29 3b 0a 20 20 20 20 20 20 20 20  adAux);.        
d240: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
d250: 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ONE ) rc = SQLIT
d260: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 72 65  E_OK;.        re
d270: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
d280: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d290: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
d2a0: 63 74 78 2c 0a 20 20 20 20 20 20 20 20 20 73 71  ctx,.         sq
d2b0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
d2c0: 75 65 28 70 43 73 72 2d 3e 70 52 65 61 64 41 75  ue(pCsr->pReadAu
d2d0: 78 2c 20 69 20 2d 20 70 52 74 72 65 65 2d 3e 6e  x, i - pRtree->n
d2e0: 44 69 6d 32 20 2b 20 31 29 29 3b 0a 20 20 7d 20  Dim2 + 1));.  } 
d2f0: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
d300: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  E_OK;.}../* .** 
d310: 55 73 65 20 6e 6f 64 65 41 63 71 75 69 72 65 28  Use nodeAcquire(
d320: 29 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  ) to obtain the 
d330: 6c 65 61 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69  leaf node contai
d340: 6e 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ning the record 
d350: 77 69 74 68 20 0a 2a 2a 20 72 6f 77 69 64 20 69  with .** rowid i
d360: 52 6f 77 69 64 2e 20 49 66 20 73 75 63 63 65 73  Rowid. If succes
d370: 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 4c 65 61  sful, set *ppLea
d380: 66 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  f to point to th
d390: 65 20 6e 6f 64 65 20 61 6e 64 0a 2a 2a 20 72 65  e node and.** re
d3a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
d3b0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
d3c0: 75 63 68 20 72 65 63 6f 72 64 20 69 6e 20 74 68  uch record in th
d3d0: 65 20 74 61 62 6c 65 2c 20 73 65 74 0a 2a 2a 20  e table, set.** 
d3e0: 2a 70 70 4c 65 61 66 20 74 6f 20 30 20 61 6e 64  *ppLeaf to 0 and
d3f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d400: 4b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  K. If an error o
d410: 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 4c 65  ccurs, set *ppLe
d420: 61 66 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e  af.** to zero an
d430: 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  d return an SQLi
d440: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
d450: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
d460: 64 4c 65 61 66 4e 6f 64 65 28 0a 20 20 52 74 72  dLeafNode(.  Rtr
d470: 65 65 20 2a 70 52 74 72 65 65 2c 20 20 20 20 20  ee *pRtree,     
d480: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 54 72 65           /* RTre
d490: 65 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  e to search */. 
d4a0: 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20   i64 iRowid,    
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d4c0: 54 68 65 20 72 6f 77 69 64 20 73 65 61 72 63 68  The rowid search
d4d0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 52 74 72  ing for */.  Rtr
d4e0: 65 65 4e 6f 64 65 20 2a 2a 70 70 4c 65 61 66 2c  eeNode **ppLeaf,
d4f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
d500: 65 20 74 68 65 20 6e 6f 64 65 20 68 65 72 65 20  e the node here 
d510: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
d520: 36 34 20 2a 70 69 4e 6f 64 65 20 20 20 20 20 20  64 *piNode      
d530: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 6f   /* Write the no
d540: 64 65 2d 69 64 20 68 65 72 65 20 2a 2f 0a 29 7b  de-id here */.){
d550: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 2a 70 70  .  int rc;.  *pp
d560: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Leaf = 0;.  sqli
d570: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
d580: 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69  Rtree->pReadRowi
d590: 64 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20  d, 1, iRowid);. 
d5a0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
d5b0: 70 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52  p(pRtree->pReadR
d5c0: 6f 77 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  owid)==SQLITE_RO
d5d0: 57 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4e 6f  W ){.    i64 iNo
d5e0: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  de = sqlite3_col
d5f0: 75 6d 6e 5f 69 6e 74 36 34 28 70 52 74 72 65 65  umn_int64(pRtree
d600: 2d 3e 70 52 65 61 64 52 6f 77 69 64 2c 20 30 29  ->pReadRowid, 0)
d610: 3b 0a 20 20 20 20 69 66 28 20 70 69 4e 6f 64 65  ;.    if( piNode
d620: 20 29 20 2a 70 69 4e 6f 64 65 20 3d 20 69 4e 6f   ) *piNode = iNo
d630: 64 65 3b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64  de;.    rc = nod
d640: 65 41 63 71 75 69 72 65 28 70 52 74 72 65 65 2c  eAcquire(pRtree,
d650: 20 69 4e 6f 64 65 2c 20 30 2c 20 70 70 4c 65 61   iNode, 0, ppLea
d660: 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  f);.    sqlite3_
d670: 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 52  reset(pRtree->pR
d680: 65 61 64 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  eadRowid);.  }el
d690: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
d6a0: 69 74 65 33 5f 72 65 73 65 74 28 70 52 74 72 65  ite3_reset(pRtre
d6b0: 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 29 3b 0a  e->pReadRowid);.
d6c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
d6d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
d6e0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d6f0: 64 20 74 6f 20 63 6f 6e 66 69 67 75 72 65 20 74  d to configure t
d700: 68 65 20 52 74 72 65 65 43 6f 6e 73 74 72 61 69  he RtreeConstrai
d710: 6e 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  nt object passed
d720: 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
d730: 64 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 61  d argument for a
d740: 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61 69 6e   MATCH constrain
d750: 74 2e 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  t. The value pas
d760: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
d770: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
d780: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d790: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
d7a0: 6f 70 65 72 61 6e 64 20 74 6f 20 74 68 65 20 4d  operand to the M
d7b0: 41 54 43 48 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  ATCH.** operator
d7c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d7d0: 64 65 73 65 72 69 61 6c 69 7a 65 47 65 6f 6d 65  deserializeGeome
d7e0: 74 72 79 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  try(sqlite3_valu
d7f0: 65 20 2a 70 56 61 6c 75 65 2c 20 52 74 72 65 65  e *pValue, Rtree
d800: 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e  Constraint *pCon
d810: 73 29 7b 0a 20 20 52 74 72 65 65 4d 61 74 63 68  s){.  RtreeMatch
d820: 41 72 67 20 2a 70 42 6c 6f 62 2c 20 2a 70 53 72  Arg *pBlob, *pSr
d830: 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42  c;       /* BLOB
d840: 20 72 65 74 75 72 6e 65 64 20 62 79 20 67 65 6f   returned by geo
d850: 6d 65 74 72 79 20 66 75 6e 63 74 69 6f 6e 20 2a  metry function *
d860: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 74 72 65  /.  sqlite3_rtre
d870: 65 5f 71 75 65 72 79 5f 69 6e 66 6f 20 2a 70 49  e_query_info *pI
d880: 6e 66 6f 3b 20 20 20 2f 2a 20 43 61 6c 6c 62 61  nfo;   /* Callba
d890: 63 6b 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ck information *
d8a0: 2f 0a 0a 20 20 70 53 72 63 20 3d 20 73 71 6c 69  /..  pSrc = sqli
d8b0: 74 65 33 5f 76 61 6c 75 65 5f 70 6f 69 6e 74 65  te3_value_pointe
d8c0: 72 28 70 56 61 6c 75 65 2c 20 22 52 74 72 65 65  r(pValue, "Rtree
d8d0: 4d 61 74 63 68 41 72 67 22 29 3b 0a 20 20 69 66  MatchArg");.  if
d8e0: 28 20 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ( pSrc==0 ) retu
d8f0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
d900: 0a 20 20 70 49 6e 66 6f 20 3d 20 28 73 71 6c 69  .  pInfo = (sqli
d910: 74 65 33 5f 72 74 72 65 65 5f 71 75 65 72 79 5f  te3_rtree_query_
d920: 69 6e 66 6f 2a 29 0a 20 20 20 20 20 20 20 20 20  info*).         
d930: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
d940: 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
d950: 2a 70 49 6e 66 6f 29 2b 70 53 72 63 2d 3e 69 53  *pInfo)+pSrc->iS
d960: 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 21 70 49  ize );.  if( !pI
d970: 6e 66 6f 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nfo ) return SQL
d980: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
d990: 73 65 74 28 70 49 6e 66 6f 2c 20 30 2c 20 73 69  set(pInfo, 0, si
d9a0: 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 29 3b 0a 20  zeof(*pInfo));. 
d9b0: 20 70 42 6c 6f 62 20 3d 20 28 52 74 72 65 65 4d   pBlob = (RtreeM
d9c0: 61 74 63 68 41 72 67 2a 29 26 70 49 6e 66 6f 5b  atchArg*)&pInfo[
d9d0: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 6c  1];.  memcpy(pBl
d9e0: 6f 62 2c 20 70 53 72 63 2c 20 70 53 72 63 2d 3e  ob, pSrc, pSrc->
d9f0: 69 53 69 7a 65 29 3b 0a 20 20 70 49 6e 66 6f 2d  iSize);.  pInfo-
da00: 3e 70 43 6f 6e 74 65 78 74 20 3d 20 70 42 6c 6f  >pContext = pBlo
da10: 62 2d 3e 63 62 2e 70 43 6f 6e 74 65 78 74 3b 0a  b->cb.pContext;.
da20: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 72 61 6d 20    pInfo->nParam 
da30: 3d 20 70 42 6c 6f 62 2d 3e 6e 50 61 72 61 6d 3b  = pBlob->nParam;
da40: 0a 20 20 70 49 6e 66 6f 2d 3e 61 50 61 72 61 6d  .  pInfo->aParam
da50: 20 3d 20 70 42 6c 6f 62 2d 3e 61 50 61 72 61 6d   = pBlob->aParam
da60: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 70 53 71 6c  ;.  pInfo->apSql
da70: 50 61 72 61 6d 20 3d 20 70 42 6c 6f 62 2d 3e 61  Param = pBlob->a
da80: 70 53 71 6c 50 61 72 61 6d 3b 0a 0a 20 20 69 66  pSqlParam;..  if
da90: 28 20 70 42 6c 6f 62 2d 3e 63 62 2e 78 47 65 6f  ( pBlob->cb.xGeo
daa0: 6d 20 29 7b 0a 20 20 20 20 70 43 6f 6e 73 2d 3e  m ){.    pCons->
dab0: 75 2e 78 47 65 6f 6d 20 3d 20 70 42 6c 6f 62 2d  u.xGeom = pBlob-
dac0: 3e 63 62 2e 78 47 65 6f 6d 3b 0a 20 20 7d 65 6c  >cb.xGeom;.  }el
dad0: 73 65 7b 0a 20 20 20 20 70 43 6f 6e 73 2d 3e 6f  se{.    pCons->o
dae0: 70 20 3d 20 52 54 52 45 45 5f 51 55 45 52 59 3b  p = RTREE_QUERY;
daf0: 0a 20 20 20 20 70 43 6f 6e 73 2d 3e 75 2e 78 51  .    pCons->u.xQ
db00: 75 65 72 79 46 75 6e 63 20 3d 20 70 42 6c 6f 62  ueryFunc = pBlob
db10: 2d 3e 63 62 2e 78 51 75 65 72 79 46 75 6e 63 3b  ->cb.xQueryFunc;
db20: 0a 20 20 7d 0a 20 20 70 43 6f 6e 73 2d 3e 70 49  .  }.  pCons->pI
db30: 6e 66 6f 20 3d 20 70 49 6e 66 6f 3b 0a 20 20 72  nfo = pInfo;.  r
db40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
db50: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65  .}../* .** Rtree
db60: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
db70: 6f 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d 65  odule xFilter me
db80: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
db90: 69 6e 74 20 72 74 72 65 65 46 69 6c 74 65 72 28  int rtreeFilter(
dba0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
dbb0: 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
dbc0: 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e  sor, .  int idxN
dbd0: 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  um, const char *
dbe0: 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72  idxStr,.  int ar
dbf0: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
dc00: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 52 74  e **argv.){.  Rt
dc10: 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52  ree *pRtree = (R
dc20: 74 72 65 65 20 2a 29 70 56 74 61 62 43 75 72 73  tree *)pVtabCurs
dc30: 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 52 74 72  or->pVtab;.  Rtr
dc40: 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  eeCursor *pCsr =
dc50: 20 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29   (RtreeCursor *)
dc60: 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 52  pVtabCursor;.  R
dc70: 74 72 65 65 4e 6f 64 65 20 2a 70 52 6f 6f 74 20  treeNode *pRoot 
dc80: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  = 0;.  int ii;. 
dc90: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
dca0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 65 6c 6c  _OK;.  int iCell
dcb0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
dcc0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
dcd0: 72 74 72 65 65 52 65 66 65 72 65 6e 63 65 28 70  rtreeReference(p
dce0: 52 74 72 65 65 29 3b 0a 0a 20 20 2f 2a 20 52 65  Rtree);..  /* Re
dcf0: 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74  set the cursor t
dd00: 6f 20 74 68 65 20 73 61 6d 65 20 73 74 61 74 65  o the same state
dd10: 20 61 73 20 72 74 72 65 65 4f 70 65 6e 28 29 20   as rtreeOpen() 
dd20: 6c 65 61 76 65 73 20 69 74 20 69 6e 2e 20 2a 2f  leaves it in. */
dd30: 0a 20 20 66 72 65 65 43 75 72 73 6f 72 43 6f 6e  .  freeCursorCon
dd40: 73 74 72 61 69 6e 74 73 28 70 43 73 72 29 3b 0a  straints(pCsr);.
dd50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
dd60: 43 73 72 2d 3e 61 50 6f 69 6e 74 29 3b 0a 20 20  Csr->aPoint);.  
dd70: 70 53 74 6d 74 20 3d 20 70 43 73 72 2d 3e 70 52  pStmt = pCsr->pR
dd80: 65 61 64 41 75 78 3b 0a 20 20 6d 65 6d 73 65 74  eadAux;.  memset
dd90: 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCsr, 0, sizeof
dda0: 28 52 74 72 65 65 43 75 72 73 6f 72 29 29 3b 0a  (RtreeCursor));.
ddb0: 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74    pCsr->base.pVt
ddc0: 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74  ab = (sqlite3_vt
ddd0: 61 62 2a 29 70 52 74 72 65 65 3b 0a 20 20 70 43  ab*)pRtree;.  pC
dde0: 73 72 2d 3e 70 52 65 61 64 41 75 78 20 3d 20 70  sr->pReadAux = p
ddf0: 53 74 6d 74 3b 0a 0a 20 20 70 43 73 72 2d 3e 69  Stmt;..  pCsr->i
de00: 53 74 72 61 74 65 67 79 20 3d 20 69 64 78 4e 75  Strategy = idxNu
de10: 6d 3b 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 3d  m;.  if( idxNum=
de20: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65  =1 ){.    /* Spe
de30: 63 69 61 6c 20 63 61 73 65 20 2d 20 6c 6f 6f 6b  cial case - look
de40: 75 70 20 62 79 20 72 6f 77 69 64 2e 20 2a 2f 0a  up by rowid. */.
de50: 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
de60: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  Leaf;        /* 
de70: 4c 65 61 66 20 6f 6e 20 77 68 69 63 68 20 74 68  Leaf on which th
de80: 65 20 72 65 71 75 69 72 65 64 20 63 65 6c 6c 20  e required cell 
de90: 72 65 73 69 64 65 73 20 2a 2f 0a 20 20 20 20 52  resides */.    R
dea0: 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20  treeSearchPoint 
deb0: 2a 70 3b 20 20 20 20 20 2f 2a 20 53 65 61 72 63  *p;     /* Searc
dec0: 68 20 70 6f 69 6e 74 20 66 6f 72 20 74 68 65 20  h point for the 
ded0: 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 36 34 20  leaf */.    i64 
dee0: 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  iRowid = sqlite3
def0: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
df00: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 36 34 20 69  v[0]);.    i64 i
df10: 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 63  Node = 0;.    rc
df20: 20 3d 20 66 69 6e 64 4c 65 61 66 4e 6f 64 65 28   = findLeafNode(
df30: 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64 2c 20  pRtree, iRowid, 
df40: 26 70 4c 65 61 66 2c 20 26 69 4e 6f 64 65 29 3b  &pLeaf, &iNode);
df50: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
df60: 49 54 45 5f 4f 4b 20 26 26 20 70 4c 65 61 66 21  ITE_OK && pLeaf!
df70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  =0 ){.      p = 
df80: 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  rtreeSearchPoint
df90: 4e 65 77 28 70 43 73 72 2c 20 52 54 52 45 45 5f  New(pCsr, RTREE_
dfa0: 5a 45 52 4f 2c 20 30 29 3b 0a 20 20 20 20 20 20  ZERO, 0);.      
dfb0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 20  assert( p!=0 ); 
dfc0: 20 2f 2a 20 41 6c 77 61 79 73 20 72 65 74 75 72   /* Always retur
dfd0: 6e 73 20 70 43 73 72 2d 3e 73 50 6f 69 6e 74 20  ns pCsr->sPoint 
dfe0: 2a 2f 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61  */.      pCsr->a
dff0: 4e 6f 64 65 5b 30 5d 20 3d 20 70 4c 65 61 66 3b  Node[0] = pLeaf;
e000: 0a 20 20 20 20 20 20 70 2d 3e 69 64 20 3d 20 69  .      p->id = i
e010: 4e 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 65  Node;.      p->e
e020: 57 69 74 68 69 6e 20 3d 20 50 41 52 54 4c 59 5f  Within = PARTLY_
e030: 57 49 54 48 49 4e 3b 0a 20 20 20 20 20 20 72 63  WITHIN;.      rc
e040: 20 3d 20 6e 6f 64 65 52 6f 77 69 64 49 6e 64 65   = nodeRowidInde
e050: 78 28 70 52 74 72 65 65 2c 20 70 4c 65 61 66 2c  x(pRtree, pLeaf,
e060: 20 69 52 6f 77 69 64 2c 20 26 69 43 65 6c 6c 29   iRowid, &iCell)
e070: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 65 6c 6c  ;.      p->iCell
e080: 20 3d 20 28 75 38 29 69 43 65 6c 6c 3b 0a 20 20   = (u8)iCell;.  
e090: 20 20 20 20 52 54 52 45 45 5f 51 55 45 55 45 5f      RTREE_QUEUE_
e0a0: 54 52 41 43 45 28 70 43 73 72 2c 20 22 50 55 53  TRACE(pCsr, "PUS
e0b0: 48 2d 46 31 3a 22 29 3b 0a 20 20 20 20 7d 65 6c  H-F1:");.    }el
e0c0: 73 65 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e  se{.      pCsr->
e0d0: 61 74 45 4f 46 20 3d 20 31 3b 0a 20 20 20 20 7d  atEOF = 1;.    }
e0e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
e0f0: 20 4e 6f 72 6d 61 6c 20 63 61 73 65 20 2d 20 72   Normal case - r
e100: 2d 74 72 65 65 20 73 63 61 6e 2e 20 53 65 74 20  -tree scan. Set 
e110: 75 70 20 74 68 65 20 52 74 72 65 65 43 75 72 73  up the RtreeCurs
e120: 6f 72 2e 61 43 6f 6e 73 74 72 61 69 6e 74 20 61  or.aConstraint a
e130: 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 77 69 74  rray .    ** wit
e140: 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  h the configured
e150: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 0a 20   constraints. . 
e160: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6e     */.    rc = n
e170: 6f 64 65 41 63 71 75 69 72 65 28 70 52 74 72 65  odeAcquire(pRtre
e180: 65 2c 20 31 2c 20 30 2c 20 26 70 52 6f 6f 74 29  e, 1, 0, &pRoot)
e190: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
e1a0: 4c 49 54 45 5f 4f 4b 20 26 26 20 61 72 67 63 3e  LITE_OK && argc>
e1b0: 30 20 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d  0 ){.      pCsr-
e1c0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 73  >aConstraint = s
e1d0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
e1e0: 73 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6e 73  sizeof(RtreeCons
e1f0: 74 72 61 69 6e 74 29 2a 61 72 67 63 29 3b 0a 20  traint)*argc);. 
e200: 20 20 20 20 20 70 43 73 72 2d 3e 6e 43 6f 6e 73       pCsr->nCons
e210: 74 72 61 69 6e 74 20 3d 20 61 72 67 63 3b 0a 20  traint = argc;. 
e220: 20 20 20 20 20 69 66 28 20 21 70 43 73 72 2d 3e       if( !pCsr->
e230: 61 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20  aConstraint ){. 
e240: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
e250: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
e260: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
e270: 65 6d 73 65 74 28 70 43 73 72 2d 3e 61 43 6f 6e  emset(pCsr->aCon
e280: 73 74 72 61 69 6e 74 2c 20 30 2c 20 73 69 7a 65  straint, 0, size
e290: 6f 66 28 52 74 72 65 65 43 6f 6e 73 74 72 61 69  of(RtreeConstrai
e2a0: 6e 74 29 2a 61 72 67 63 29 3b 0a 20 20 20 20 20  nt)*argc);.     
e2b0: 20 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2d 3e     memset(pCsr->
e2c0: 61 6e 51 75 65 75 65 2c 20 30 2c 20 73 69 7a 65  anQueue, 0, size
e2d0: 6f 66 28 75 33 32 29 2a 28 70 52 74 72 65 65 2d  of(u32)*(pRtree-
e2e0: 3e 69 44 65 70 74 68 20 2b 20 31 29 29 3b 0a 20  >iDepth + 1));. 
e2f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
e300: 69 64 78 53 74 72 3d 3d 30 20 26 26 20 61 72 67  idxStr==0 && arg
e310: 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  c==0).          
e320: 20 20 20 20 20 20 7c 7c 20 28 69 64 78 53 74 72        || (idxStr
e330: 20 26 26 20 28 69 6e 74 29 73 74 72 6c 65 6e 28   && (int)strlen(
e340: 69 64 78 53 74 72 29 3d 3d 61 72 67 63 2a 32 29  idxStr)==argc*2)
e350: 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
e360: 69 69 3d 30 3b 20 69 69 3c 61 72 67 63 3b 20 69  ii=0; ii<argc; i
e370: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
e380: 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20  RtreeConstraint 
e390: 2a 70 20 3d 20 26 70 43 73 72 2d 3e 61 43 6f 6e  *p = &pCsr->aCon
e3a0: 73 74 72 61 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  straint[ii];.   
e3b0: 20 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 69         p->op = i
e3c0: 64 78 53 74 72 5b 69 69 2a 32 5d 3b 0a 20 20 20  dxStr[ii*2];.   
e3d0: 20 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64         p->iCoord
e3e0: 20 3d 20 69 64 78 53 74 72 5b 69 69 2a 32 2b 31   = idxStr[ii*2+1
e3f0: 5d 2d 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20  ]-'0';.         
e400: 20 69 66 28 20 70 2d 3e 6f 70 3e 3d 52 54 52 45   if( p->op>=RTRE
e410: 45 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 20  E_MATCH ){.     
e420: 20 20 20 20 20 20 20 2f 2a 20 41 20 4d 41 54 43         /* A MATC
e430: 48 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20  H operator. The 
e440: 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20  right-hand-side 
e450: 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 20 74  must be a blob t
e460: 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
e470: 2a 2a 20 63 61 6e 20 62 65 20 63 61 73 74 20 69  ** can be cast i
e480: 6e 74 6f 20 61 6e 20 52 74 72 65 65 4d 61 74 63  nto an RtreeMatc
e490: 68 41 72 67 20 6f 62 6a 65 63 74 2e 20 4f 6e 65  hArg object. One
e4a0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20   created using. 
e4b0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e             ** an
e4c0: 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67   sqlite3_rtree_g
e4d0: 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b  eometry_callback
e4e0: 28 29 20 53 51 4c 20 75 73 65 72 20 66 75 6e 63  () SQL user func
e4f0: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20 20  tion..          
e500: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
e510: 20 72 63 20 3d 20 64 65 73 65 72 69 61 6c 69 7a   rc = deserializ
e520: 65 47 65 6f 6d 65 74 72 79 28 61 72 67 76 5b 69  eGeometry(argv[i
e530: 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  i], p);.        
e540: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e550: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
e560: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e570: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e580: 20 20 20 20 20 20 20 20 70 2d 3e 70 49 6e 66 6f          p->pInfo
e590: 2d 3e 6e 43 6f 6f 72 64 20 3d 20 70 52 74 72 65  ->nCoord = pRtre
e5a0: 65 2d 3e 6e 44 69 6d 32 3b 0a 20 20 20 20 20 20  e->nDim2;.      
e5b0: 20 20 20 20 20 20 70 2d 3e 70 49 6e 66 6f 2d 3e        p->pInfo->
e5c0: 61 6e 51 75 65 75 65 20 3d 20 70 43 73 72 2d 3e  anQueue = pCsr->
e5d0: 61 6e 51 75 65 75 65 3b 0a 20 20 20 20 20 20 20  anQueue;.       
e5e0: 20 20 20 20 20 70 2d 3e 70 49 6e 66 6f 2d 3e 6d       p->pInfo->m
e5f0: 78 4c 65 76 65 6c 20 3d 20 70 52 74 72 65 65 2d  xLevel = pRtree-
e600: 3e 69 44 65 70 74 68 20 2b 20 31 3b 0a 20 20 20  >iDepth + 1;.   
e610: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69         }else{.#i
e620: 66 64 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45  fdef SQLITE_RTRE
e630: 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 20  E_INT_ONLY.     
e640: 20 20 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c         p->u.rVal
e650: 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
e660: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 69 69  ue_int64(argv[ii
e670: 5d 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  ]);.#else.      
e680: 20 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75        p->u.rValu
e690: 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
e6a0: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 69 69  e_double(argv[ii
e6b0: 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ]);.#endif.     
e6c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
e6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e6e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e6f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 52 74  E_OK ){.      Rt
e700: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a  reeSearchPoint *
e710: 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  pNew;.      pNew
e720: 20 3d 20 72 74 72 65 65 53 65 61 72 63 68 50 6f   = rtreeSearchPo
e730: 69 6e 74 4e 65 77 28 70 43 73 72 2c 20 52 54 52  intNew(pCsr, RTR
e740: 45 45 5f 5a 45 52 4f 2c 20 28 75 38 29 28 70 52  EE_ZERO, (u8)(pR
e750: 74 72 65 65 2d 3e 69 44 65 70 74 68 2b 31 29 29  tree->iDepth+1))
e760: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
e770: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
e780: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
e790: 20 70 4e 65 77 2d 3e 69 64 20 3d 20 31 3b 0a 20   pNew->id = 1;. 
e7a0: 20 20 20 20 20 70 4e 65 77 2d 3e 69 43 65 6c 6c       pNew->iCell
e7b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
e7c0: 2d 3e 65 57 69 74 68 69 6e 20 3d 20 50 41 52 54  ->eWithin = PART
e7d0: 4c 59 5f 57 49 54 48 49 4e 3b 0a 20 20 20 20 20  LY_WITHIN;.     
e7e0: 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 62   assert( pCsr->b
e7f0: 50 6f 69 6e 74 3d 3d 31 20 29 3b 0a 20 20 20 20  Point==1 );.    
e800: 20 20 70 43 73 72 2d 3e 61 4e 6f 64 65 5b 30 5d    pCsr->aNode[0]
e810: 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 20 20 20 20   = pRoot;.      
e820: 70 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20  pRoot = 0;.     
e830: 20 52 54 52 45 45 5f 51 55 45 55 45 5f 54 52 41   RTREE_QUEUE_TRA
e840: 43 45 28 70 43 73 72 2c 20 22 50 55 53 48 2d 46  CE(pCsr, "PUSH-F
e850: 6d 3a 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  m:");.      rc =
e860: 20 72 74 72 65 65 53 74 65 70 54 6f 4c 65 61 66   rtreeStepToLeaf
e870: 28 70 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCsr);.    }.  
e880: 7d 0a 0a 20 20 6e 6f 64 65 52 65 6c 65 61 73 65  }..  nodeRelease
e890: 28 70 52 74 72 65 65 2c 20 70 52 6f 6f 74 29 3b  (pRtree, pRoot);
e8a0: 0a 20 20 72 74 72 65 65 52 65 6c 65 61 73 65 28  .  rtreeRelease(
e8b0: 70 52 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72  pRtree);.  retur
e8c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
e8d0: 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61 62  tree virtual tab
e8e0: 6c 65 20 6d 6f 64 75 6c 65 20 78 42 65 73 74 49  le module xBestI
e8f0: 6e 64 65 78 20 6d 65 74 68 6f 64 2e 20 54 68 65  ndex method. The
e900: 72 65 20 61 72 65 20 74 68 72 65 65 0a 2a 2a 20  re are three.** 
e910: 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74  table scan strat
e920: 65 67 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20  egies to choose 
e930: 66 72 6f 6d 20 28 69 6e 20 6f 72 64 65 72 20 66  from (in order f
e940: 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 0a 2a 2a 20  rom most to .** 
e950: 6c 65 61 73 74 20 64 65 73 69 72 61 62 6c 65 29  least desirable)
e960: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 64 78 4e 75 6d  :.**.**   idxNum
e970: 20 20 20 20 20 69 64 78 53 74 72 20 20 20 20 20       idxStr     
e980: 20 20 20 53 74 72 61 74 65 67 79 0a 2a 2a 20 20     Strategy.**  
e990: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
e9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9c0: 2d 0a 2a 2a 20 20 20 20 20 31 20 20 20 20 20 20  -.**     1      
e9d0: 20 20 55 6e 75 73 65 64 20 20 20 20 20 20 20 20    Unused        
e9e0: 44 69 72 65 63 74 20 6c 6f 6f 6b 75 70 20 62 79  Direct lookup by
e9f0: 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20 32   rowid..**     2
ea00: 20 20 20 20 20 20 20 20 53 65 65 20 62 65 6c 6f          See belo
ea10: 77 20 20 20 20 20 52 2d 74 72 65 65 20 71 75 65  w     R-tree que
ea20: 72 79 20 6f 72 20 66 75 6c 6c 2d 74 61 62 6c 65  ry or full-table
ea30: 20 73 63 61 6e 2e 0a 2a 2a 20 20 20 2d 2d 2d 2d   scan..**   ----
ea40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
ea70: 2a 2a 20 49 66 20 73 74 72 61 74 65 67 79 20 31  ** If strategy 1
ea80: 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 69   is used, then i
ea90: 64 78 53 74 72 20 69 73 20 6e 6f 74 20 6d 65 61  dxStr is not mea
eaa0: 6e 69 6e 67 66 75 6c 2e 20 49 66 20 73 74 72 61  ningful. If stra
eab0: 74 65 67 79 0a 2a 2a 20 32 20 69 73 20 75 73 65  tegy.** 2 is use
eac0: 64 2c 20 69 64 78 53 74 72 20 69 73 20 66 6f 72  d, idxStr is for
ead0: 6d 61 74 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  matted to contai
eae0: 6e 20 32 20 62 79 74 65 73 20 66 6f 72 20 65 61  n 2 bytes for ea
eaf0: 63 68 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  ch .** constrain
eb00: 74 20 75 73 65 64 2e 20 54 68 65 20 66 69 72 73  t used. The firs
eb10: 74 20 74 77 6f 20 62 79 74 65 73 20 6f 66 20 69  t two bytes of i
eb20: 64 78 53 74 72 20 63 6f 72 72 65 73 70 6f 6e 64  dxStr correspond
eb30: 20 74 6f 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 73   to .** the cons
eb40: 74 72 61 69 6e 74 20 69 6e 20 73 71 6c 69 74 65  traint in sqlite
eb50: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2e 61 43 6f  3_index_info.aCo
eb60: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 5d 20  nstraintUsage[] 
eb70: 77 69 74 68 0a 2a 2a 20 28 61 72 67 76 49 6e 64  with.** (argvInd
eb80: 65 78 3d 3d 31 29 20 65 74 63 2e 0a 2a 2a 0a 2a  ex==1) etc..**.*
eb90: 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 65  * The first of e
eba0: 61 63 68 20 70 61 69 72 20 6f 66 20 62 79 74 65  ach pair of byte
ebb0: 73 20 69 6e 20 69 64 78 53 74 72 20 69 64 65 6e  s in idxStr iden
ebc0: 74 69 66 69 65 73 20 74 68 65 20 63 6f 6e 73 74  tifies the const
ebd0: 72 61 69 6e 74 0a 2a 2a 20 6f 70 65 72 61 74 6f  raint.** operato
ebe0: 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  r as follows:.**
ebf0: 0a 2a 2a 20 20 20 4f 70 65 72 61 74 6f 72 20 20  .**   Operator  
ec00: 20 20 42 79 74 65 20 56 61 6c 75 65 0a 2a 2a 20    Byte Value.** 
ec10: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
ec20: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
ec30: 20 3d 20 20 20 20 20 20 20 20 30 78 34 31 20 28   =        0x41 (
ec40: 27 41 27 29 0a 2a 2a 20 20 20 20 20 3c 3d 20 20  'A').**     <=  
ec50: 20 20 20 20 20 20 30 78 34 32 20 28 27 42 27 29        0x42 ('B')
ec60: 0a 2a 2a 20 20 20 20 20 20 3c 20 20 20 20 20 20  .**      <      
ec70: 20 20 30 78 34 33 20 28 27 43 27 29 0a 2a 2a 20    0x43 ('C').** 
ec80: 20 20 20 20 3e 3d 20 20 20 20 20 20 20 20 30 78      >=        0x
ec90: 34 34 20 28 27 44 27 29 0a 2a 2a 20 20 20 20 20  44 ('D').**     
eca0: 20 3e 20 20 20 20 20 20 20 20 30 78 34 35 20 28   >        0x45 (
ecb0: 27 45 27 29 0a 2a 2a 20 20 20 4d 41 54 43 48 20  'E').**   MATCH 
ecc0: 20 20 20 20 20 20 30 78 34 36 20 28 27 46 27 29        0x46 ('F')
ecd0: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
ece0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
ecf0: 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 6f 66  ** The second of
ed00: 20 65 61 63 68 20 70 61 69 72 20 6f 66 20 62 79   each pair of by
ed10: 74 65 73 20 69 64 65 6e 74 69 66 69 65 73 20 74  tes identifies t
ed20: 68 65 20 63 6f 6f 72 64 69 6e 61 74 65 20 63 6f  he coordinate co
ed30: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 77 68 69 63 68  lumn.** to which
ed40: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
ed50: 61 70 70 6c 69 65 73 2e 20 54 68 65 20 6c 65 66  applies. The lef
ed60: 74 6d 6f 73 74 20 63 6f 6f 72 64 69 6e 61 74 65  tmost coordinate
ed70: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 27 61   column.** is 'a
ed80: 27 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 66 72  ', the second fr
ed90: 6f 6d 20 74 68 65 20 6c 65 66 74 20 27 62 27 20  om the left 'b' 
eda0: 65 74 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  etc..*/.static i
edb0: 6e 74 20 72 74 72 65 65 42 65 73 74 49 6e 64 65  nt rtreeBestInde
edc0: 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  x(sqlite3_vtab *
edd0: 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  tab, sqlite3_ind
ede0: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
edf0: 6f 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74  o){.  Rtree *pRt
ee00: 72 65 65 20 3d 20 28 52 74 72 65 65 2a 29 74 61  ree = (Rtree*)ta
ee10: 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
ee20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
ee30: 69 3b 0a 20 20 69 6e 74 20 62 4d 61 74 63 68 20  i;.  int bMatch 
ee40: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ee50: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
ee60: 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 4d  there exists a M
ee70: 41 54 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20  ATCH constraint 
ee80: 2a 2f 0a 20 20 69 36 34 20 6e 52 6f 77 3b 20 20  */.  i64 nRow;  
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
eeb0: 64 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 20  d rows returned 
eec0: 62 79 20 74 68 69 73 20 73 63 61 6e 20 2a 2f 0a  by this scan */.
eed0: 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
eee0: 0a 20 20 63 68 61 72 20 7a 49 64 78 53 74 72 5b  .  char zIdxStr[
eef0: 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53  RTREE_MAX_DIMENS
ef00: 49 4f 4e 53 2a 38 2b 31 5d 3b 0a 20 20 6d 65 6d  IONS*8+1];.  mem
ef10: 73 65 74 28 7a 49 64 78 53 74 72 2c 20 30 2c 20  set(zIdxStr, 0, 
ef20: 73 69 7a 65 6f 66 28 7a 49 64 78 53 74 72 29 29  sizeof(zIdxStr))
ef30: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
ef40: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
ef50: 4d 41 54 43 48 20 63 6f 6e 73 74 72 61 69 6e 74  MATCH constraint
ef60: 20 2d 20 65 76 65 6e 20 61 6e 20 75 6e 75 73 61   - even an unusa
ef70: 62 6c 65 20 6f 6e 65 2e 20 49 66 20 74 68 65 72  ble one. If ther
ef80: 65 0a 20 20 2a 2a 20 69 73 2c 20 64 6f 20 6e 6f  e.  ** is, do no
ef90: 74 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 6c  t consider the l
efa0: 6f 6f 6b 75 70 2d 62 79 2d 72 6f 77 69 64 20 70  ookup-by-rowid p
efb0: 6c 61 6e 20 61 73 20 75 73 69 6e 67 20 73 75 63  lan as using suc
efc0: 68 20 61 20 70 6c 61 6e 20 77 6f 75 6c 64 0a 20  h a plan would. 
efd0: 20 2a 2a 20 72 65 71 75 69 72 65 20 74 68 65 20   ** require the 
efe0: 56 44 42 45 20 74 6f 20 65 76 61 6c 75 61 74 65  VDBE to evaluate
eff0: 20 74 68 65 20 4d 41 54 43 48 20 63 6f 6e 73 74   the MATCH const
f000: 72 61 69 6e 74 2c 20 77 68 69 63 68 20 69 73 20  raint, which is 
f010: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  not currently.  
f020: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 2a 2f 0a  ** possible. */.
f030: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
f040: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
f050: 61 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  aint; ii++){.   
f060: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 61   if( pIdxInfo->a
f070: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 69 5d 2e 6f  Constraint[ii].o
f080: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p==SQLITE_INDEX_
f090: 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
f0a0: 20 29 7b 0a 20 20 20 20 20 20 62 4d 61 74 63 68   ){.      bMatch
f0b0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
f0c0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 49  .  assert( pIdxI
f0d0: 6e 66 6f 2d 3e 69 64 78 53 74 72 3d 3d 30 20 29  nfo->idxStr==0 )
f0e0: 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
f0f0: 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
f100: 74 72 61 69 6e 74 20 26 26 20 69 49 64 78 3c 28  traint && iIdx<(
f110: 69 6e 74 29 28 73 69 7a 65 6f 66 28 7a 49 64 78  int)(sizeof(zIdx
f120: 53 74 72 29 2d 31 29 3b 20 69 69 2b 2b 29 7b 0a  Str)-1); ii++){.
f130: 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74      struct sqlit
f140: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
f150: 69 6e 74 20 2a 70 20 3d 20 26 70 49 64 78 49 6e  int *p = &pIdxIn
f160: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  fo->aConstraint[
f170: 69 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 62 4d  ii];..    if( bM
f180: 61 74 63 68 3d 3d 30 20 26 26 20 70 2d 3e 75 73  atch==0 && p->us
f190: 61 62 6c 65 20 0a 20 20 20 20 20 26 26 20 70 2d  able .     && p-
f1a0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 70  >iColumn==0 && p
f1b0: 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op==SQLITE_IND
f1c0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
f1d0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
f1e0: 2a 20 57 65 20 68 61 76 65 20 61 6e 20 65 71 75  * We have an equ
f1f0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
f200: 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 2e 20 55   on the rowid. U
f210: 73 65 20 73 74 72 61 74 65 67 79 20 31 2e 20 2a  se strategy 1. *
f220: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a  /.      int jj;.
f230: 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
f240: 6a 6a 3c 69 69 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  jj<ii; jj++){.  
f250: 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
f260: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
f270: 5b 6a 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  [jj].argvIndex =
f280: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78   0;.        pIdx
f290: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
f2a0: 74 55 73 61 67 65 5b 6a 6a 5d 2e 6f 6d 69 74 20  tUsage[jj].omit 
f2b0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
f2c0: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
f2d0: 4e 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Num = 1;.      p
f2e0: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
f2f0: 61 69 6e 74 55 73 61 67 65 5b 69 69 5d 2e 61 72  aintUsage[ii].ar
f300: 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20  gvIndex = 1;.   
f310: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
f320: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 6a  nstraintUsage[jj
f330: 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 0a 20 20 20  ].omit = 1;..   
f340: 20 20 20 2f 2a 20 54 68 69 73 20 73 74 72 61 74     /* This strat
f350: 65 67 79 20 69 6e 76 6f 6c 76 65 73 20 61 20 74  egy involves a t
f360: 77 6f 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 73  wo rowid lookups
f370: 20 6f 6e 20 61 6e 20 42 2d 54 72 65 65 20 73 74   on an B-Tree st
f380: 72 75 63 74 75 72 65 73 0a 20 20 20 20 20 20 2a  ructures.      *
f390: 2a 20 61 6e 64 20 74 68 65 6e 20 61 20 6c 69 6e  * and then a lin
f3a0: 65 61 72 20 73 65 61 72 63 68 20 6f 66 20 61 6e  ear search of an
f3b0: 20 52 2d 54 72 65 65 20 6e 6f 64 65 2e 20 54 68   R-Tree node. Th
f3c0: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 0a 20 20  is should be .  
f3d0: 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
f3e0: 64 20 61 6c 6d 6f 73 74 20 61 73 20 71 75 69 63  d almost as quic
f3f0: 6b 20 61 73 20 61 20 64 69 72 65 63 74 20 72 6f  k as a direct ro
f400: 77 69 64 20 6c 6f 6f 6b 75 70 20 28 66 6f 72 20  wid lookup (for 
f410: 77 68 69 63 68 20 0a 20 20 20 20 20 20 2a 2a 20  which .      ** 
f420: 73 71 6c 69 74 65 20 75 73 65 73 20 61 6e 20 69  sqlite uses an i
f430: 6e 74 65 72 6e 61 6c 20 63 6f 73 74 20 6f 66 20  nternal cost of 
f440: 30 2e 30 29 2e 20 49 74 20 69 73 20 65 78 70 65  0.0). It is expe
f450: 63 74 65 64 20 74 6f 20 72 65 74 75 72 6e 0a 20  cted to return. 
f460: 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
f470: 20 72 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 20 0a   row..      */ .
f480: 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
f490: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
f4a0: 33 30 2e 30 3b 0a 20 20 20 20 20 20 70 49 64 78  30.0;.      pIdx
f4b0: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
f4c0: 6f 77 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ows = 1;.      p
f4d0: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67  IdxInfo->idxFlag
f4e0: 73 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  s = SQLITE_INDEX
f4f0: 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20  _SCAN_UNIQUE;.  
f500: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f510: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
f520: 20 69 66 28 20 70 2d 3e 75 73 61 62 6c 65 0a 20   if( p->usable. 
f530: 20 20 20 26 26 20 28 28 70 2d 3e 69 43 6f 6c 75     && ((p->iColu
f540: 6d 6e 3e 30 20 26 26 20 70 2d 3e 69 43 6f 6c 75  mn>0 && p->iColu
f550: 6d 6e 3c 3d 70 52 74 72 65 65 2d 3e 6e 44 69 6d  mn<=pRtree->nDim
f560: 32 29 0a 20 20 20 20 20 20 20 20 7c 7c 20 70 2d  2).        || p-
f570: 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op==SQLITE_INDE
f580: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
f590: 43 48 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  CH).    ){.     
f5a0: 20 75 38 20 6f 70 3b 0a 20 20 20 20 20 20 73 77   u8 op;.      sw
f5b0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
f5c0: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
f5d0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
f5e0: 49 4e 54 5f 45 51 3a 20 20 20 20 6f 70 20 3d 20  INT_EQ:    op = 
f5f0: 52 54 52 45 45 5f 45 51 3b 20 20 20 20 62 72 65  RTREE_EQ;    bre
f600: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
f610: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
f620: 4e 53 54 52 41 49 4e 54 5f 47 54 3a 20 20 20 20  NSTRAINT_GT:    
f630: 6f 70 20 3d 20 52 54 52 45 45 5f 47 54 3b 20 20  op = RTREE_GT;  
f640: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
f650: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44   case SQLITE_IND
f660: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
f670: 3a 20 20 20 20 6f 70 20 3d 20 52 54 52 45 45 5f  :    op = RTREE_
f680: 4c 45 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  LE;    break;.  
f690: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
f6a0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
f6b0: 4e 54 5f 4c 54 3a 20 20 20 20 6f 70 20 3d 20 52  NT_LT:    op = R
f6c0: 54 52 45 45 5f 4c 54 3b 20 20 20 20 62 72 65 61  TREE_LT;    brea
f6d0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
f6e0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
f6f0: 53 54 52 41 49 4e 54 5f 47 45 3a 20 20 20 20 6f  STRAINT_GE:    o
f700: 70 20 3d 20 52 54 52 45 45 5f 47 45 3b 20 20 20  p = RTREE_GE;   
f710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
f720: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45  case SQLITE_INDE
f730: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
f740: 43 48 3a 20 6f 70 20 3d 20 52 54 52 45 45 5f 4d  CH: op = RTREE_M
f750: 41 54 43 48 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATCH; break;.   
f760: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20       default:   
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20 30 3b           op = 0;
f790: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
f7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f7b0: 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20  if( op ){.      
f7c0: 20 20 7a 49 64 78 53 74 72 5b 69 49 64 78 2b 2b    zIdxStr[iIdx++
f7d0: 5d 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 20 20  ] = op;.        
f7e0: 7a 49 64 78 53 74 72 5b 69 49 64 78 2b 2b 5d 20  zIdxStr[iIdx++] 
f7f0: 3d 20 28 63 68 61 72 29 28 70 2d 3e 69 43 6f 6c  = (char)(p->iCol
f800: 75 6d 6e 20 2d 20 31 20 2b 20 27 30 27 29 3b 0a  umn - 1 + '0');.
f810: 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
f820: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
f830: 67 65 5b 69 69 5d 2e 61 72 67 76 49 6e 64 65 78  ge[ii].argvIndex
f840: 20 3d 20 28 69 49 64 78 2f 32 29 3b 0a 20 20 20   = (iIdx/2);.   
f850: 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61       pIdxInfo->a
f860: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
f870: 69 69 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  ii].omit = 1;.  
f880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
f890: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
f8a0: 4e 75 6d 20 3d 20 32 3b 0a 20 20 70 49 64 78 49  Num = 2;.  pIdxI
f8b0: 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
f8c0: 64 78 53 74 72 20 3d 20 31 3b 0a 20 20 69 66 28  dxStr = 1;.  if(
f8d0: 20 69 49 64 78 3e 30 20 26 26 20 30 3d 3d 28 70   iIdx>0 && 0==(p
f8e0: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
f8f0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
f900: 66 28 22 25 73 22 2c 20 7a 49 64 78 53 74 72 29  f("%s", zIdxStr)
f910: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
f920: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f930: 7d 0a 0a 20 20 6e 52 6f 77 20 3d 20 70 52 74 72  }..  nRow = pRtr
f940: 65 65 2d 3e 6e 52 6f 77 45 73 74 20 3e 3e 20 28  ee->nRowEst >> (
f950: 69 49 64 78 2f 32 29 3b 0a 20 20 70 49 64 78 49  iIdx/2);.  pIdxI
f960: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
f970: 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 36 2e 30  st = (double)6.0
f980: 20 2a 20 28 64 6f 75 62 6c 65 29 6e 52 6f 77 3b   * (double)nRow;
f990: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
f9a0: 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 6e 52 6f  imatedRows = nRo
f9b0: 77 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w;..  return rc;
f9c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f9d0: 20 74 68 65 20 4e 2d 64 69 6d 65 6e 73 69 6f 6e   the N-dimension
f9e0: 61 6c 20 76 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  al volumn of the
f9f0: 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 69 6e 20   cell stored in 
fa00: 2a 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74  *p..*/.static Rt
fa10: 72 65 65 44 56 61 6c 75 65 20 63 65 6c 6c 41 72  reeDValue cellAr
fa20: 65 61 28 52 74 72 65 65 20 2a 70 52 74 72 65 65  ea(Rtree *pRtree
fa30: 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 29 7b  , RtreeCell *p){
fa40: 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 61  .  RtreeDValue a
fa50: 72 65 61 20 3d 20 28 52 74 72 65 65 44 56 61 6c  rea = (RtreeDVal
fa60: 75 65 29 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ue)1;.  assert( 
fa70: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3e 3d 31 20  pRtree->nDim>=1 
fa80: 26 26 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3c  && pRtree->nDim<
fa90: 3d 35 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =5 );.#ifndef SQ
faa0: 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f  LITE_RTREE_INT_O
fab0: 4e 4c 59 0a 20 20 69 66 28 20 70 52 74 72 65 65  NLY.  if( pRtree
fac0: 2d 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54  ->eCoordType==RT
fad0: 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32  REE_COORD_REAL32
fae0: 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
faf0: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 20 29 7b 0a  pRtree->nDim ){.
fb00: 20 20 20 20 20 20 63 61 73 65 20 35 3a 20 20 61        case 5:  a
fb10: 72 65 61 20 20 3d 20 70 2d 3e 61 43 6f 6f 72 64  rea  = p->aCoord
fb20: 5b 39 5d 2e 66 20 2d 20 70 2d 3e 61 43 6f 6f 72  [9].f - p->aCoor
fb30: 64 5b 38 5d 2e 66 3b 0a 20 20 20 20 20 20 63 61  d[8].f;.      ca
fb40: 73 65 20 34 3a 20 20 61 72 65 61 20 2a 3d 20 70  se 4:  area *= p
fb50: 2d 3e 61 43 6f 6f 72 64 5b 37 5d 2e 66 20 2d 20  ->aCoord[7].f - 
fb60: 70 2d 3e 61 43 6f 6f 72 64 5b 36 5d 2e 66 3b 0a  p->aCoord[6].f;.
fb70: 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 20 61        case 3:  a
fb80: 72 65 61 20 2a 3d 20 70 2d 3e 61 43 6f 6f 72 64  rea *= p->aCoord
fb90: 5b 35 5d 2e 66 20 2d 20 70 2d 3e 61 43 6f 6f 72  [5].f - p->aCoor
fba0: 64 5b 34 5d 2e 66 3b 0a 20 20 20 20 20 20 63 61  d[4].f;.      ca
fbb0: 73 65 20 32 3a 20 20 61 72 65 61 20 2a 3d 20 70  se 2:  area *= p
fbc0: 2d 3e 61 43 6f 6f 72 64 5b 33 5d 2e 66 20 2d 20  ->aCoord[3].f - 
fbd0: 70 2d 3e 61 43 6f 6f 72 64 5b 32 5d 2e 66 3b 0a  p->aCoord[2].f;.
fbe0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61        default: a
fbf0: 72 65 61 20 2a 3d 20 70 2d 3e 61 43 6f 6f 72 64  rea *= p->aCoord
fc00: 5b 31 5d 2e 66 20 2d 20 70 2d 3e 61 43 6f 6f 72  [1].f - p->aCoor
fc10: 64 5b 30 5d 2e 66 3b 0a 20 20 20 20 7d 0a 20 20  d[0].f;.    }.  
fc20: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
fc30: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 52 74  .    switch( pRt
fc40: 72 65 65 2d 3e 6e 44 69 6d 20 29 7b 0a 20 20 20  ree->nDim ){.   
fc50: 20 20 20 63 61 73 65 20 35 3a 20 20 61 72 65 61     case 5:  area
fc60: 20 20 3d 20 28 69 36 34 29 70 2d 3e 61 43 6f 6f    = (i64)p->aCoo
fc70: 72 64 5b 39 5d 2e 69 20 2d 20 28 69 36 34 29 70  rd[9].i - (i64)p
fc80: 2d 3e 61 43 6f 6f 72 64 5b 38 5d 2e 69 3b 0a 20  ->aCoord[8].i;. 
fc90: 20 20 20 20 20 63 61 73 65 20 34 3a 20 20 61 72       case 4:  ar
fca0: 65 61 20 2a 3d 20 28 69 36 34 29 70 2d 3e 61 43  ea *= (i64)p->aC
fcb0: 6f 6f 72 64 5b 37 5d 2e 69 20 2d 20 28 69 36 34  oord[7].i - (i64
fcc0: 29 70 2d 3e 61 43 6f 6f 72 64 5b 36 5d 2e 69 3b  )p->aCoord[6].i;
fcd0: 0a 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 20  .      case 3:  
fce0: 61 72 65 61 20 2a 3d 20 28 69 36 34 29 70 2d 3e  area *= (i64)p->
fcf0: 61 43 6f 6f 72 64 5b 35 5d 2e 69 20 2d 20 28 69  aCoord[5].i - (i
fd00: 36 34 29 70 2d 3e 61 43 6f 6f 72 64 5b 34 5d 2e  64)p->aCoord[4].
fd10: 69 3b 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a  i;.      case 2:
fd20: 20 20 61 72 65 61 20 2a 3d 20 28 69 36 34 29 70    area *= (i64)p
fd30: 2d 3e 61 43 6f 6f 72 64 5b 33 5d 2e 69 20 2d 20  ->aCoord[3].i - 
fd40: 28 69 36 34 29 70 2d 3e 61 43 6f 6f 72 64 5b 32  (i64)p->aCoord[2
fd50: 5d 2e 69 3b 0a 20 20 20 20 20 20 64 65 66 61 75  ].i;.      defau
fd60: 6c 74 3a 20 61 72 65 61 20 2a 3d 20 28 69 36 34  lt: area *= (i64
fd70: 29 70 2d 3e 61 43 6f 6f 72 64 5b 31 5d 2e 69 20  )p->aCoord[1].i 
fd80: 2d 20 28 69 36 34 29 70 2d 3e 61 43 6f 6f 72 64  - (i64)p->aCoord
fd90: 5b 30 5d 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  [0].i;.    }.  }
fda0: 0a 20 20 72 65 74 75 72 6e 20 61 72 65 61 3b 0a  .  return area;.
fdb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
fdc0: 74 68 65 20 6d 61 72 67 69 6e 20 6c 65 6e 67 74  the margin lengt
fdd0: 68 20 6f 66 20 63 65 6c 6c 20 70 2e 20 54 68 65  h of cell p. The
fde0: 20 6d 61 72 67 69 6e 20 6c 65 6e 67 74 68 20 69   margin length i
fdf0: 73 20 74 68 65 20 73 75 6d 0a 2a 2a 20 6f 66 20  s the sum.** of 
fe00: 74 68 65 20 6f 62 6a 65 63 74 73 20 73 69 7a 65  the objects size
fe10: 20 69 6e 20 65 61 63 68 20 64 69 6d 65 6e 73 69   in each dimensi
fe20: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74  on..*/.static Rt
fe30: 72 65 65 44 56 61 6c 75 65 20 63 65 6c 6c 4d 61  reeDValue cellMa
fe40: 72 67 69 6e 28 52 74 72 65 65 20 2a 70 52 74 72  rgin(Rtree *pRtr
fe50: 65 65 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70  ee, RtreeCell *p
fe60: 29 7b 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65  ){.  RtreeDValue
fe70: 20 6d 61 72 67 69 6e 20 3d 20 30 3b 0a 20 20 69   margin = 0;.  i
fe80: 6e 74 20 69 69 20 3d 20 70 52 74 72 65 65 2d 3e  nt ii = pRtree->
fe90: 6e 44 69 6d 32 20 2d 20 32 3b 0a 20 20 64 6f 7b  nDim2 - 2;.  do{
fea0: 0a 20 20 20 20 6d 61 72 67 69 6e 20 2b 3d 20 28  .    margin += (
feb0: 44 43 4f 4f 52 44 28 70 2d 3e 61 43 6f 6f 72 64  DCOORD(p->aCoord
fec0: 5b 69 69 2b 31 5d 29 20 2d 20 44 43 4f 4f 52 44  [ii+1]) - DCOORD
fed0: 28 70 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 29 29  (p->aCoord[ii]))
fee0: 3b 0a 20 20 20 20 69 69 20 2d 3d 20 32 3b 0a 20  ;.    ii -= 2;. 
fef0: 20 7d 77 68 69 6c 65 28 20 69 69 3e 3d 30 20 29   }while( ii>=0 )
ff00: 3b 0a 20 20 72 65 74 75 72 6e 20 6d 61 72 67 69  ;.  return margi
ff10: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f 72  n;.}../*.** Stor
ff20: 65 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 63  e the union of c
ff30: 65 6c 6c 73 20 70 31 20 61 6e 64 20 70 32 20 69  ells p1 and p2 i
ff40: 6e 20 70 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n p1..*/.static 
ff50: 76 6f 69 64 20 63 65 6c 6c 55 6e 69 6f 6e 28 52  void cellUnion(R
ff60: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74  tree *pRtree, Rt
ff70: 72 65 65 43 65 6c 6c 20 2a 70 31 2c 20 52 74 72  reeCell *p1, Rtr
ff80: 65 65 43 65 6c 6c 20 2a 70 32 29 7b 0a 20 20 69  eeCell *p2){.  i
ff90: 6e 74 20 69 69 20 3d 20 30 3b 0a 20 20 69 66 28  nt ii = 0;.  if(
ffa0: 20 70 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54   pRtree->eCoordT
ffb0: 79 70 65 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44  ype==RTREE_COORD
ffc0: 5f 52 45 41 4c 33 32 20 29 7b 0a 20 20 20 20 64  _REAL32 ){.    d
ffd0: 6f 7b 0a 20 20 20 20 20 20 70 31 2d 3e 61 43 6f  o{.      p1->aCo
ffe0: 6f 72 64 5b 69 69 5d 2e 66 20 3d 20 4d 49 4e 28  ord[ii].f = MIN(
fff0: 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e 66  p1->aCoord[ii].f
10000 2c 20 70 32 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d  , p2->aCoord[ii]
10010 2e 66 29 3b 0a 20 20 20 20 20 20 70 31 2d 3e 61  .f);.      p1->a
10020 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 66 20 3d 20  Coord[ii+1].f = 
10030 4d 41 58 28 70 31 2d 3e 61 43 6f 6f 72 64 5b 69  MAX(p1->aCoord[i
10040 69 2b 31 5d 2e 66 2c 20 70 32 2d 3e 61 43 6f 6f  i+1].f, p2->aCoo
10050 72 64 5b 69 69 2b 31 5d 2e 66 29 3b 0a 20 20 20  rd[ii+1].f);.   
10060 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20     ii += 2;.    
10070 7d 77 68 69 6c 65 28 20 69 69 3c 70 52 74 72 65  }while( ii<pRtre
10080 65 2d 3e 6e 44 69 6d 32 20 29 3b 0a 20 20 7d 65  e->nDim2 );.  }e
10090 6c 73 65 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  lse{.    do{.   
100a0 20 20 20 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69     p1->aCoord[ii
100b0 5d 2e 69 20 3d 20 4d 49 4e 28 70 31 2d 3e 61 43  ].i = MIN(p1->aC
100c0 6f 6f 72 64 5b 69 69 5d 2e 69 2c 20 70 32 2d 3e  oord[ii].i, p2->
100d0 61 43 6f 6f 72 64 5b 69 69 5d 2e 69 29 3b 0a 20  aCoord[ii].i);. 
100e0 20 20 20 20 20 70 31 2d 3e 61 43 6f 6f 72 64 5b       p1->aCoord[
100f0 69 69 2b 31 5d 2e 69 20 3d 20 4d 41 58 28 70 31  ii+1].i = MAX(p1
10100 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69  ->aCoord[ii+1].i
10110 2c 20 70 32 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b  , p2->aCoord[ii+
10120 31 5d 2e 69 29 3b 0a 20 20 20 20 20 20 69 69 20  1].i);.      ii 
10130 2b 3d 20 32 3b 0a 20 20 20 20 7d 77 68 69 6c 65  += 2;.    }while
10140 28 20 69 69 3c 70 52 74 72 65 65 2d 3e 6e 44 69  ( ii<pRtree->nDi
10150 6d 32 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  m2 );.  }.}../*.
10160 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
10170 66 20 74 68 65 20 61 72 65 61 20 63 6f 76 65 72  f the area cover
10180 65 64 20 62 79 20 70 32 20 69 73 20 61 20 73 75  ed by p2 is a su
10190 62 73 65 74 20 6f 66 20 74 68 65 20 61 72 65 61  bset of the area
101a0 20 63 6f 76 65 72 65 64 0a 2a 2a 20 62 79 20 70   covered.** by p
101b0 31 2e 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  1. False otherwi
101c0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
101d0 74 20 63 65 6c 6c 43 6f 6e 74 61 69 6e 73 28 52  t cellContains(R
101e0 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74  tree *pRtree, Rt
101f0 72 65 65 43 65 6c 6c 20 2a 70 31 2c 20 52 74 72  reeCell *p1, Rtr
10200 65 65 43 65 6c 6c 20 2a 70 32 29 7b 0a 20 20 69  eeCell *p2){.  i
10210 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 69 73 49  nt ii;.  int isI
10220 6e 74 20 3d 20 28 70 52 74 72 65 65 2d 3e 65 43  nt = (pRtree->eC
10230 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f  oordType==RTREE_
10240 43 4f 4f 52 44 5f 49 4e 54 33 32 29 3b 0a 20 20  COORD_INT32);.  
10250 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 52 74  for(ii=0; ii<pRt
10260 72 65 65 2d 3e 6e 44 69 6d 32 3b 20 69 69 2b 3d  ree->nDim2; ii+=
10270 32 29 7b 0a 20 20 20 20 52 74 72 65 65 43 6f 6f  2){.    RtreeCoo
10280 72 64 20 2a 61 31 20 3d 20 26 70 31 2d 3e 61 43  rd *a1 = &p1->aC
10290 6f 6f 72 64 5b 69 69 5d 3b 0a 20 20 20 20 52 74  oord[ii];.    Rt
102a0 72 65 65 43 6f 6f 72 64 20 2a 61 32 20 3d 20 26  reeCoord *a2 = &
102b0 70 32 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 3b 0a  p2->aCoord[ii];.
102c0 20 20 20 20 69 66 28 20 28 21 69 73 49 6e 74 20      if( (!isInt 
102d0 26 26 20 28 61 32 5b 30 5d 2e 66 3c 61 31 5b 30  && (a2[0].f<a1[0
102e0 5d 2e 66 20 7c 7c 20 61 32 5b 31 5d 2e 66 3e 61  ].f || a2[1].f>a
102f0 31 5b 31 5d 2e 66 29 29 20 0a 20 20 20 20 20 7c  1[1].f)) .     |
10300 7c 20 28 20 69 73 49 6e 74 20 26 26 20 28 61 32  | ( isInt && (a2
10310 5b 30 5d 2e 69 3c 61 31 5b 30 5d 2e 69 20 7c 7c  [0].i<a1[0].i ||
10320 20 61 32 5b 31 5d 2e 69 3e 61 31 5b 31 5d 2e 69   a2[1].i>a1[1].i
10330 29 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  )) .    ){.     
10340 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
10350 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
10360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10370 20 74 68 65 20 61 6d 6f 75 6e 74 20 63 65 6c 6c   the amount cell
10380 20 70 20 77 6f 75 6c 64 20 67 72 6f 77 20 62 79   p would grow by
10390 20 69 66 20 69 74 20 77 65 72 65 20 75 6e 69 6f   if it were unio
103a0 6e 65 64 20 77 69 74 68 20 70 43 65 6c 6c 2e 0a  ned with pCell..
103b0 2a 2f 0a 73 74 61 74 69 63 20 52 74 72 65 65 44  */.static RtreeD
103c0 56 61 6c 75 65 20 63 65 6c 6c 47 72 6f 77 74 68  Value cellGrowth
103d0 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20  (Rtree *pRtree, 
103e0 52 74 72 65 65 43 65 6c 6c 20 2a 70 2c 20 52 74  RtreeCell *p, Rt
103f0 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 29 7b  reeCell *pCell){
10400 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 61  .  RtreeDValue a
10410 72 65 61 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c  rea;.  RtreeCell
10420 20 63 65 6c 6c 3b 0a 20 20 6d 65 6d 63 70 79 28   cell;.  memcpy(
10430 26 63 65 6c 6c 2c 20 70 2c 20 73 69 7a 65 6f 66  &cell, p, sizeof
10440 28 52 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20  (RtreeCell));.  
10450 61 72 65 61 20 3d 20 63 65 6c 6c 41 72 65 61 28  area = cellArea(
10460 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 29 3b 0a  pRtree, &cell);.
10470 20 20 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74 72    cellUnion(pRtr
10480 65 65 2c 20 26 63 65 6c 6c 2c 20 70 43 65 6c 6c  ee, &cell, pCell
10490 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 63 65 6c  );.  return (cel
104a0 6c 41 72 65 61 28 70 52 74 72 65 65 2c 20 26 63  lArea(pRtree, &c
104b0 65 6c 6c 29 2d 61 72 65 61 29 3b 0a 7d 0a 0a 73  ell)-area);.}..s
104c0 74 61 74 69 63 20 52 74 72 65 65 44 56 61 6c 75  tatic RtreeDValu
104d0 65 20 63 65 6c 6c 4f 76 65 72 6c 61 70 28 0a 20  e cellOverlap(. 
104e0 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20   Rtree *pRtree, 
104f0 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 2c  .  RtreeCell *p,
10500 20 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61   .  RtreeCell *a
10510 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 6e 43 65  Cell, .  int nCe
10520 6c 6c 0a 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  ll.){.  int ii;.
10530 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 6f 76    RtreeDValue ov
10540 65 72 6c 61 70 20 3d 20 52 54 52 45 45 5f 5a 45  erlap = RTREE_ZE
10550 52 4f 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  RO;.  for(ii=0; 
10560 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b  ii<nCell; ii++){
10570 0a 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20  .    int jj;.   
10580 20 52 74 72 65 65 44 56 61 6c 75 65 20 6f 20 3d   RtreeDValue o =
10590 20 28 52 74 72 65 65 44 56 61 6c 75 65 29 31 3b   (RtreeDValue)1;
105a0 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a  .    for(jj=0; j
105b0 6a 3c 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32 3b  j<pRtree->nDim2;
105c0 20 6a 6a 2b 3d 32 29 7b 0a 20 20 20 20 20 20 52   jj+=2){.      R
105d0 74 72 65 65 44 56 61 6c 75 65 20 78 31 2c 20 78  treeDValue x1, x
105e0 32 3b 0a 20 20 20 20 20 20 78 31 20 3d 20 4d 41  2;.      x1 = MA
105f0 58 28 44 43 4f 4f 52 44 28 70 2d 3e 61 43 6f 6f  X(DCOORD(p->aCoo
10600 72 64 5b 6a 6a 5d 29 2c 20 44 43 4f 4f 52 44 28  rd[jj]), DCOORD(
10610 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f 72 64  aCell[ii].aCoord
10620 5b 6a 6a 5d 29 29 3b 0a 20 20 20 20 20 20 78 32  [jj]));.      x2
10630 20 3d 20 4d 49 4e 28 44 43 4f 4f 52 44 28 70 2d   = MIN(DCOORD(p-
10640 3e 61 43 6f 6f 72 64 5b 6a 6a 2b 31 5d 29 2c 20  >aCoord[jj+1]), 
10650 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d  DCOORD(aCell[ii]
10660 2e 61 43 6f 6f 72 64 5b 6a 6a 2b 31 5d 29 29 3b  .aCoord[jj+1]));
10670 0a 20 20 20 20 20 20 69 66 28 20 78 32 3c 78 31  .      if( x2<x1
10680 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 20 3d 20   ){.        o = 
10690 28 52 74 72 65 65 44 56 61 6c 75 65 29 30 3b 0a  (RtreeDValue)0;.
106a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
106b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
106c0 20 20 20 20 6f 20 3d 20 6f 20 2a 20 28 78 32 2d      o = o * (x2-
106d0 78 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x1);.      }.   
106e0 20 7d 0a 20 20 20 20 6f 76 65 72 6c 61 70 20 2b   }.    overlap +
106f0 3d 20 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = o;.  }.  retur
10700 6e 20 6f 76 65 72 6c 61 70 3b 0a 7d 0a 0a 0a 2f  n overlap;.}.../
10710 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
10720 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  on implements th
10730 65 20 43 68 6f 6f 73 65 4c 65 61 66 20 61 6c 67  e ChooseLeaf alg
10740 6f 72 69 74 68 6d 20 66 72 6f 6d 20 47 75 74 6d  orithm from Gutm
10750 61 6e 5b 38 34 5d 2e 0a 2a 2a 20 43 68 6f 6f 73  an[84]..** Choos
10760 65 53 75 62 54 72 65 65 20 69 6e 20 72 2a 74 72  eSubTree in r*tr
10770 65 65 20 74 65 72 6d 69 6e 6f 6c 6f 67 79 2e 0a  ee terminology..
10780 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 43 68  */.static int Ch
10790 6f 6f 73 65 4c 65 61 66 28 0a 20 20 52 74 72 65  ooseLeaf(.  Rtre
107a0 65 20 2a 70 52 74 72 65 65 2c 20 20 20 20 20 20  e *pRtree,      
107b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 74 72 65           /* Rtre
107c0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 52 74 72  e table */.  Rtr
107d0 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 20 20  eeCell *pCell,  
107e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c            /* Cel
107f0 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
10800 20 72 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   rtree */.  int 
10810 69 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20  iHeight,        
10820 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67           /* Heig
10830 68 74 20 6f 66 20 73 75 62 2d 74 72 65 65 20 72  ht of sub-tree r
10840 6f 6f 74 65 64 20 61 74 20 70 43 65 6c 6c 20 2a  ooted at pCell *
10850 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 2a  /.  RtreeNode **
10860 70 70 4c 65 61 66 20 20 20 20 20 20 20 20 20 20  ppLeaf          
10870 20 2f 2a 20 4f 55 54 3a 20 53 65 6c 65 63 74 65   /* OUT: Selecte
10880 64 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 29  d leaf page */.)
10890 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
108a0 74 20 69 69 3b 0a 20 20 52 74 72 65 65 4e 6f 64  t ii;.  RtreeNod
108b0 65 20 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  e *pNode = 0;.  
108c0 72 63 20 3d 20 6e 6f 64 65 41 63 71 75 69 72 65  rc = nodeAcquire
108d0 28 70 52 74 72 65 65 2c 20 31 2c 20 30 2c 20 26  (pRtree, 1, 0, &
108e0 70 4e 6f 64 65 29 3b 0a 0a 20 20 66 6f 72 28 69  pNode);..  for(i
108f0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
10900 4f 4b 20 26 26 20 69 69 3c 28 70 52 74 72 65 65  OK && ii<(pRtree
10910 2d 3e 69 44 65 70 74 68 2d 69 48 65 69 67 68 74  ->iDepth-iHeight
10920 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ); ii++){.    in
10930 74 20 69 43 65 6c 6c 3b 0a 20 20 20 20 73 71 6c  t iCell;.    sql
10940 69 74 65 33 5f 69 6e 74 36 34 20 69 42 65 73 74  ite3_int64 iBest
10950 20 3d 20 30 3b 0a 0a 20 20 20 20 52 74 72 65 65   = 0;..    Rtree
10960 44 56 61 6c 75 65 20 66 4d 69 6e 47 72 6f 77 74  DValue fMinGrowt
10970 68 20 3d 20 52 54 52 45 45 5f 5a 45 52 4f 3b 0a  h = RTREE_ZERO;.
10980 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
10990 66 4d 69 6e 41 72 65 61 20 3d 20 52 54 52 45 45  fMinArea = RTREE
109a0 5f 5a 45 52 4f 3b 0a 0a 20 20 20 20 69 6e 74 20  _ZERO;..    int 
109b0 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e  nCell = NCELL(pN
109c0 6f 64 65 29 3b 0a 20 20 20 20 52 74 72 65 65 43  ode);.    RtreeC
109d0 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20 20 52 74  ell cell;.    Rt
109e0 72 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64 3b  reeNode *pChild;
109f0 0a 0a 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20  ..    RtreeCell 
10a00 2a 61 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20  *aCell = 0;..   
10a10 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
10a20 68 69 6c 64 20 6e 6f 64 65 20 77 68 69 63 68 20  hild node which 
10a30 77 69 6c 6c 20 62 65 20 65 6e 6c 61 72 67 65 64  will be enlarged
10a40 20 74 68 65 20 6c 65 61 73 74 20 69 66 20 70 43   the least if pC
10a50 65 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20 69 6e  ell.    ** is in
10a60 73 65 72 74 65 64 20 69 6e 74 6f 20 69 74 2e 20  serted into it. 
10a70 52 65 73 6f 6c 76 65 20 74 69 65 73 20 62 79 20  Resolve ties by 
10a80 63 68 6f 6f 73 69 6e 67 20 74 68 65 20 65 6e 74  choosing the ent
10a90 72 79 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 74  ry with.    ** t
10aa0 68 65 20 73 6d 61 6c 6c 65 73 74 20 61 72 65 61  he smallest area
10ab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
10ac0 28 69 43 65 6c 6c 3d 30 3b 20 69 43 65 6c 6c 3c  (iCell=0; iCell<
10ad0 6e 43 65 6c 6c 3b 20 69 43 65 6c 6c 2b 2b 29 7b  nCell; iCell++){
10ae0 0a 20 20 20 20 20 20 69 6e 74 20 62 42 65 73 74  .      int bBest
10af0 20 3d 20 30 3b 0a 20 20 20 20 20 20 52 74 72 65   = 0;.      Rtre
10b00 65 44 56 61 6c 75 65 20 67 72 6f 77 74 68 3b 0a  eDValue growth;.
10b10 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75        RtreeDValu
10b20 65 20 61 72 65 61 3b 0a 20 20 20 20 20 20 6e 6f  e area;.      no
10b30 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65  deGetCell(pRtree
10b40 2c 20 70 4e 6f 64 65 2c 20 69 43 65 6c 6c 2c 20  , pNode, iCell, 
10b50 26 63 65 6c 6c 29 3b 0a 20 20 20 20 20 20 67 72  &cell);.      gr
10b60 6f 77 74 68 20 3d 20 63 65 6c 6c 47 72 6f 77 74  owth = cellGrowt
10b70 68 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c  h(pRtree, &cell,
10b80 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 61   pCell);.      a
10b90 72 65 61 20 3d 20 63 65 6c 6c 41 72 65 61 28 70  rea = cellArea(p
10ba0 52 74 72 65 65 2c 20 26 63 65 6c 6c 29 3b 0a 20  Rtree, &cell);. 
10bb0 20 20 20 20 20 69 66 28 20 69 43 65 6c 6c 3d 3d       if( iCell==
10bc0 30 7c 7c 67 72 6f 77 74 68 3c 66 4d 69 6e 47 72  0||growth<fMinGr
10bd0 6f 77 74 68 7c 7c 28 67 72 6f 77 74 68 3d 3d 66  owth||(growth==f
10be0 4d 69 6e 47 72 6f 77 74 68 20 26 26 20 61 72 65  MinGrowth && are
10bf0 61 3c 66 4d 69 6e 41 72 65 61 29 20 29 7b 0a 20  a<fMinArea) ){. 
10c00 20 20 20 20 20 20 20 62 42 65 73 74 20 3d 20 31         bBest = 1
10c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10c20 69 66 28 20 62 42 65 73 74 20 29 7b 0a 20 20 20  if( bBest ){.   
10c30 20 20 20 20 20 66 4d 69 6e 47 72 6f 77 74 68 20       fMinGrowth 
10c40 3d 20 67 72 6f 77 74 68 3b 0a 20 20 20 20 20 20  = growth;.      
10c50 20 20 66 4d 69 6e 41 72 65 61 20 3d 20 61 72 65    fMinArea = are
10c60 61 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73 74  a;.        iBest
10c70 20 3d 20 63 65 6c 6c 2e 69 52 6f 77 69 64 3b 0a   = cell.iRowid;.
10c80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
10c90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10ca0 61 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d  aCell);.    rc =
10cb0 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70 52 74   nodeAcquire(pRt
10cc0 72 65 65 2c 20 69 42 65 73 74 2c 20 70 4e 6f 64  ree, iBest, pNod
10cd0 65 2c 20 26 70 43 68 69 6c 64 29 3b 0a 20 20 20  e, &pChild);.   
10ce0 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
10cf0 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20  ree, pNode);.   
10d00 20 70 4e 6f 64 65 20 3d 20 70 43 68 69 6c 64 3b   pNode = pChild;
10d10 0a 20 20 7d 0a 0a 20 20 2a 70 70 4c 65 61 66 20  .  }..  *ppLeaf 
10d20 3d 20 70 4e 6f 64 65 3b 0a 20 20 72 65 74 75 72  = pNode;.  retur
10d30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
10d40 20 63 65 6c 6c 20 77 69 74 68 20 74 68 65 20 73   cell with the s
10d50 61 6d 65 20 63 6f 6e 74 65 6e 74 20 61 73 20 70  ame content as p
10d60 43 65 6c 6c 20 68 61 73 20 6a 75 73 74 20 62 65  Cell has just be
10d70 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
10d80 0a 2a 2a 20 74 68 65 20 6e 6f 64 65 20 70 4e 6f  .** the node pNo
10d90 64 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  de. This functio
10da0 6e 20 75 70 64 61 74 65 73 20 74 68 65 20 62 6f  n updates the bo
10db0 75 6e 64 69 6e 67 20 62 6f 78 20 63 65 6c 6c 73  unding box cells
10dc0 20 69 6e 0a 2a 2a 20 61 6c 6c 20 61 6e 63 65 73   in.** all ances
10dd0 74 6f 72 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  tor elements..*/
10de0 0a 73 74 61 74 69 63 20 69 6e 74 20 41 64 6a 75  .static int Adju
10df0 73 74 54 72 65 65 28 0a 20 20 52 74 72 65 65 20  stTree(.  Rtree 
10e00 2a 70 52 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pRtree,        
10e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10e20 74 72 65 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tree table */.  
10e30 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
10e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10e50 20 20 2f 2a 20 41 64 6a 75 73 74 20 61 6e 63 65    /* Adjust ance
10e60 73 74 72 79 20 6f 66 20 74 68 69 73 20 6e 6f 64  stry of this nod
10e70 65 2e 20 2a 2f 0a 20 20 52 74 72 65 65 43 65 6c  e. */.  RtreeCel
10e80 6c 20 2a 70 43 65 6c 6c 20 20 20 20 20 20 20 20  l *pCell        
10e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
10ea0 73 20 63 65 6c 6c 20 77 61 73 20 6a 75 73 74 20  s cell was just 
10eb0 69 6e 73 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20  inserted */.){. 
10ec0 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 20 3d 20   RtreeNode *p = 
10ed0 70 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 63 6e 74  pNode;.  int cnt
10ee0 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
10ef0 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ->pParent ){.   
10f00 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61 72   RtreeNode *pPar
10f10 65 6e 74 20 3d 20 70 2d 3e 70 50 61 72 65 6e 74  ent = p->pParent
10f20 3b 0a 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20  ;.    RtreeCell 
10f30 63 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 69 43  cell;.    int iC
10f40 65 6c 6c 3b 0a 0a 20 20 20 20 69 66 28 20 28 2b  ell;..    if( (+
10f50 2b 63 6e 74 29 3e 31 30 30 30 20 7c 7c 20 6e 6f  +cnt)>1000 || no
10f60 64 65 50 61 72 65 6e 74 49 6e 64 65 78 28 70 52  deParentIndex(pR
10f70 74 72 65 65 2c 20 70 2c 20 26 69 43 65 6c 6c 29  tree, p, &iCell)
10f80 20 20 29 7b 0a 20 20 20 20 20 20 52 54 52 45 45    ){.      RTREE
10f90 5f 49 53 5f 43 4f 52 52 55 50 54 28 70 52 74 72  _IS_CORRUPT(pRtr
10fa0 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ee);.      retur
10fb0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10fc0 5f 56 54 41 42 3b 0a 20 20 20 20 7d 0a 0a 20 20  _VTAB;.    }..  
10fd0 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70 52    nodeGetCell(pR
10fe0 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 69  tree, pParent, i
10ff0 43 65 6c 6c 2c 20 26 63 65 6c 6c 29 3b 0a 20 20  Cell, &cell);.  
11000 20 20 69 66 28 20 21 63 65 6c 6c 43 6f 6e 74 61    if( !cellConta
11010 69 6e 73 28 70 52 74 72 65 65 2c 20 26 63 65 6c  ins(pRtree, &cel
11020 6c 2c 20 70 43 65 6c 6c 29 20 29 7b 0a 20 20 20  l, pCell) ){.   
11030 20 20 20 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74     cellUnion(pRt
11040 72 65 65 2c 20 26 63 65 6c 6c 2c 20 70 43 65 6c  ree, &cell, pCel
11050 6c 29 3b 0a 20 20 20 20 20 20 6e 6f 64 65 4f 76  l);.      nodeOv
11060 65 72 77 72 69 74 65 43 65 6c 6c 28 70 52 74 72  erwriteCell(pRtr
11070 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 26 63 65  ee, pParent, &ce
11080 6c 6c 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 20 20  ll, iCell);.    
11090 7d 0a 20 0a 20 20 20 20 70 20 3d 20 70 50 61 72  }. .    p = pPar
110a0 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
110b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
110c0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 61 70 70  /*.** Write mapp
110d0 69 6e 67 20 28 69 52 6f 77 69 64 2d 3e 69 4e 6f  ing (iRowid->iNo
110e0 64 65 29 20 74 6f 20 74 68 65 20 3c 72 74 72 65  de) to the <rtre
110f0 65 3e 5f 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a  e>_rowid table..
11100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  */.static int ro
11110 77 69 64 57 72 69 74 65 28 52 74 72 65 65 20 2a  widWrite(Rtree *
11120 70 52 74 72 65 65 2c 20 73 71 6c 69 74 65 33 5f  pRtree, sqlite3_
11130 69 6e 74 36 34 20 69 52 6f 77 69 64 2c 20 73 71  int64 iRowid, sq
11140 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 6f 64  lite3_int64 iNod
11150 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  e){.  sqlite3_bi
11160 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d  nd_int64(pRtree-
11170 3e 70 57 72 69 74 65 52 6f 77 69 64 2c 20 31 2c  >pWriteRowid, 1,
11180 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69   iRowid);.  sqli
11190 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
111a0 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77  Rtree->pWriteRow
111b0 69 64 2c 20 32 2c 20 69 4e 6f 64 65 29 3b 0a 20  id, 2, iNode);. 
111c0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52   sqlite3_step(pR
111d0 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69  tree->pWriteRowi
111e0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  d);.  return sql
111f0 69 74 65 33 5f 72 65 73 65 74 28 70 52 74 72 65  ite3_reset(pRtre
11200 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 29 3b  e->pWriteRowid);
11210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
11220 6d 61 70 70 69 6e 67 20 28 69 4e 6f 64 65 2d 3e  mapping (iNode->
11230 69 50 61 72 29 20 74 6f 20 74 68 65 20 3c 72 74  iPar) to the <rt
11240 72 65 65 3e 5f 70 61 72 65 6e 74 20 74 61 62 6c  ree>_parent tabl
11250 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11260 20 70 61 72 65 6e 74 57 72 69 74 65 28 52 74 72   parentWrite(Rtr
11270 65 65 20 2a 70 52 74 72 65 65 2c 20 73 71 6c 69  ee *pRtree, sqli
11280 74 65 33 5f 69 6e 74 36 34 20 69 4e 6f 64 65 2c  te3_int64 iNode,
11290 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
112a0 50 61 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Par){.  sqlite3_
112b0 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65  bind_int64(pRtre
112c0 65 2d 3e 70 57 72 69 74 65 50 61 72 65 6e 74 2c  e->pWriteParent,
112d0 20 31 2c 20 69 4e 6f 64 65 29 3b 0a 20 20 73 71   1, iNode);.  sq
112e0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
112f0 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 50  (pRtree->pWriteP
11300 61 72 65 6e 74 2c 20 32 2c 20 69 50 61 72 29 3b  arent, 2, iPar);
11310 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
11320 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61  pRtree->pWritePa
11330 72 65 6e 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  rent);.  return 
11340 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52  sqlite3_reset(pR
11350 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61 72 65  tree->pWritePare
11360 6e 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  nt);.}..static i
11370 6e 74 20 72 74 72 65 65 49 6e 73 65 72 74 43 65  nt rtreeInsertCe
11380 6c 6c 28 52 74 72 65 65 20 2a 2c 20 52 74 72 65  ll(Rtree *, Rtre
11390 65 4e 6f 64 65 20 2a 2c 20 52 74 72 65 65 43 65  eNode *, RtreeCe
113a0 6c 6c 20 2a 2c 20 69 6e 74 29 3b 0a 0a 0a 2f 2a  ll *, int);.../*
113b0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 61 49  .** Arguments aI
113c0 64 78 2c 20 61 44 69 73 74 61 6e 63 65 20 61 6e  dx, aDistance an
113d0 64 20 61 53 70 61 72 65 20 61 6c 6c 20 70 6f 69  d aSpare all poi
113e0 6e 74 20 74 6f 20 61 72 72 61 79 73 20 6f 66 20  nt to arrays of 
113f0 73 69 7a 65 0a 2a 2a 20 6e 49 64 78 2e 20 54 68  size.** nIdx. Th
11400 65 20 61 49 64 78 20 61 72 72 61 79 20 63 6f 6e  e aIdx array con
11410 74 61 69 6e 73 20 74 68 65 20 73 65 74 20 6f 66  tains the set of
11420 20 69 6e 74 65 67 65 72 73 20 66 72 6f 6d 20 30   integers from 0
11430 20 74 6f 20 0a 2a 2a 20 28 6e 49 64 78 2d 31 29   to .** (nIdx-1)
11440 20 69 6e 20 6e 6f 20 70 61 72 74 69 63 75 6c 61   in no particula
11450 72 20 6f 72 64 65 72 2e 20 54 68 69 73 20 66 75  r order. This fu
11460 6e 63 74 69 6f 6e 20 73 6f 72 74 73 20 74 68 65  nction sorts the
11470 20 76 61 6c 75 65 73 0a 2a 2a 20 69 6e 20 61 49   values.** in aI
11480 64 78 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  dx according to 
11490 74 68 65 20 69 6e 64 65 78 65 64 20 76 61 6c 75  the indexed valu
114a0 65 73 20 69 6e 20 61 44 69 73 74 61 6e 63 65 2e  es in aDistance.
114b0 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
114c0 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 69 6e   assuming the in
114d0 70 75 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 49  puts:.**.**   aI
114e0 64 78 20 20 20 20 20 20 3d 20 7b 20 30 2c 20 20  dx      = { 0,  
114f0 20 31 2c 20 20 20 32 2c 20 20 20 33 20 7d 0a 2a   1,   2,   3 }.*
11500 2a 20 20 20 61 44 69 73 74 61 6e 63 65 20 3d 20  *   aDistance = 
11510 7b 20 35 2e 30 2c 20 32 2e 30 2c 20 37 2e 30 2c  { 5.0, 2.0, 7.0,
11520 20 36 2e 30 20 7d 0a 2a 2a 0a 2a 2a 20 74 68 69   6.0 }.**.** thi
11530 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
11540 74 68 65 20 61 49 64 78 20 61 72 72 61 79 20 74  the aIdx array t
11550 6f 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a  o contain:.**.**
11560 20 20 20 61 49 64 78 20 20 20 20 20 20 3d 20 7b     aIdx      = {
11570 20 30 2c 20 20 20 31 2c 20 20 20 32 2c 20 20 20   0,   1,   2,   
11580 33 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 53  3 }.**.** The aS
11590 70 61 72 65 20 61 72 72 61 79 20 69 73 20 75 73  pare array is us
115a0 65 64 20 61 73 20 74 65 6d 70 6f 72 61 72 79 20  ed as temporary 
115b0 77 6f 72 6b 69 6e 67 20 73 70 61 63 65 20 62 79  working space by
115c0 20 74 68 65 0a 2a 2a 20 73 6f 72 74 69 6e 67 20   the.** sorting 
115d0 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2f 0a 73 74  algorithm..*/.st
115e0 61 74 69 63 20 76 6f 69 64 20 53 6f 72 74 42 79  atic void SortBy
115f0 44 69 73 74 61 6e 63 65 28 0a 20 20 69 6e 74 20  Distance(.  int 
11600 2a 61 49 64 78 2c 20 0a 20 20 69 6e 74 20 6e 49  *aIdx, .  int nI
11610 64 78 2c 20 0a 20 20 52 74 72 65 65 44 56 61 6c  dx, .  RtreeDVal
11620 75 65 20 2a 61 44 69 73 74 61 6e 63 65 2c 20 0a  ue *aDistance, .
11630 20 20 69 6e 74 20 2a 61 53 70 61 72 65 0a 29 7b    int *aSpare.){
11640 0a 20 20 69 66 28 20 6e 49 64 78 3e 31 20 29 7b  .  if( nIdx>1 ){
11650 0a 20 20 20 20 69 6e 74 20 69 4c 65 66 74 20 3d  .    int iLeft =
11660 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52 69 67   0;.    int iRig
11670 68 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 6e 74  ht = 0;..    int
11680 20 6e 4c 65 66 74 20 3d 20 6e 49 64 78 2f 32 3b   nLeft = nIdx/2;
11690 0a 20 20 20 20 69 6e 74 20 6e 52 69 67 68 74 20  .    int nRight 
116a0 3d 20 6e 49 64 78 2d 6e 4c 65 66 74 3b 0a 20 20  = nIdx-nLeft;.  
116b0 20 20 69 6e 74 20 2a 61 4c 65 66 74 20 3d 20 61    int *aLeft = a
116c0 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 2a 61 52  Idx;.    int *aR
116d0 69 67 68 74 20 3d 20 26 61 49 64 78 5b 6e 4c 65  ight = &aIdx[nLe
116e0 66 74 5d 3b 0a 0a 20 20 20 20 53 6f 72 74 42 79  ft];..    SortBy
116f0 44 69 73 74 61 6e 63 65 28 61 4c 65 66 74 2c 20  Distance(aLeft, 
11700 6e 4c 65 66 74 2c 20 61 44 69 73 74 61 6e 63 65  nLeft, aDistance
11710 2c 20 61 53 70 61 72 65 29 3b 0a 20 20 20 20 53  , aSpare);.    S
11720 6f 72 74 42 79 44 69 73 74 61 6e 63 65 28 61 52  ortByDistance(aR
11730 69 67 68 74 2c 20 6e 52 69 67 68 74 2c 20 61 44  ight, nRight, aD
11740 69 73 74 61 6e 63 65 2c 20 61 53 70 61 72 65 29  istance, aSpare)
11750 3b 0a 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 53  ;..    memcpy(aS
11760 70 61 72 65 2c 20 61 4c 65 66 74 2c 20 73 69 7a  pare, aLeft, siz
11770 65 6f 66 28 69 6e 74 29 2a 6e 4c 65 66 74 29 3b  eof(int)*nLeft);
11780 0a 20 20 20 20 61 4c 65 66 74 20 3d 20 61 53 70  .    aLeft = aSp
11790 61 72 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  are;..    while(
117a0 20 69 4c 65 66 74 3c 6e 4c 65 66 74 20 7c 7c 20   iLeft<nLeft || 
117b0 69 52 69 67 68 74 3c 6e 52 69 67 68 74 20 29 7b  iRight<nRight ){
117c0 0a 20 20 20 20 20 20 69 66 28 20 69 4c 65 66 74  .      if( iLeft
117d0 3d 3d 6e 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ==nLeft ){.     
117e0 20 20 20 61 49 64 78 5b 69 4c 65 66 74 2b 69 52     aIdx[iLeft+iR
117f0 69 67 68 74 5d 20 3d 20 61 52 69 67 68 74 5b 69  ight] = aRight[i
11800 52 69 67 68 74 5d 3b 0a 20 20 20 20 20 20 20 20  Right];.        
11810 69 52 69 67 68 74 2b 2b 3b 0a 20 20 20 20 20 20  iRight++;.      
11820 7d 65 6c 73 65 20 69 66 28 20 69 52 69 67 68 74  }else if( iRight
11830 3d 3d 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ==nRight ){.    
11840 20 20 20 20 61 49 64 78 5b 69 4c 65 66 74 2b 69      aIdx[iLeft+i
11850 52 69 67 68 74 5d 20 3d 20 61 4c 65 66 74 5b 69  Right] = aLeft[i
11860 4c 65 66 74 5d 3b 0a 20 20 20 20 20 20 20 20 69  Left];.        i
11870 4c 65 66 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  Left++;.      }e
11880 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 52 74 72  lse{.        Rtr
11890 65 65 44 56 61 6c 75 65 20 66 4c 65 66 74 20 3d  eeDValue fLeft =
118a0 20 61 44 69 73 74 61 6e 63 65 5b 61 4c 65 66 74   aDistance[aLeft
118b0 5b 69 4c 65 66 74 5d 5d 3b 0a 20 20 20 20 20 20  [iLeft]];.      
118c0 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 66 52    RtreeDValue fR
118d0 69 67 68 74 20 3d 20 61 44 69 73 74 61 6e 63 65  ight = aDistance
118e0 5b 61 52 69 67 68 74 5b 69 52 69 67 68 74 5d 5d  [aRight[iRight]]
118f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 4c  ;.        if( fL
11900 65 66 74 3c 66 52 69 67 68 74 20 29 7b 0a 20 20  eft<fRight ){.  
11910 20 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c 65          aIdx[iLe
11920 66 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 4c 65  ft+iRight] = aLe
11930 66 74 5b 69 4c 65 66 74 5d 3b 0a 20 20 20 20 20  ft[iLeft];.     
11940 20 20 20 20 20 69 4c 65 66 74 2b 2b 3b 0a 20 20       iLeft++;.  
11950 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11960 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c 65 66         aIdx[iLef
11970 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 52 69 67  t+iRight] = aRig
11980 68 74 5b 69 52 69 67 68 74 5d 3b 0a 20 20 20 20  ht[iRight];.    
11990 20 20 20 20 20 20 69 52 69 67 68 74 2b 2b 3b 0a        iRight++;.
119a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
119b0 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20  }.    }..#if 0. 
119c0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
119d0 20 74 68 65 20 73 6f 72 74 20 77 6f 72 6b 65 64   the sort worked
119e0 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
119f0 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f  int jj;.      fo
11a00 72 28 6a 6a 3d 31 3b 20 6a 6a 3c 6e 49 64 78 3b  r(jj=1; jj<nIdx;
11a10 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
11a20 52 74 72 65 65 44 56 61 6c 75 65 20 6c 65 66 74  RtreeDValue left
11a30 20 3d 20 61 44 69 73 74 61 6e 63 65 5b 61 49 64   = aDistance[aId
11a40 78 5b 6a 6a 2d 31 5d 5d 3b 0a 20 20 20 20 20 20  x[jj-1]];.      
11a50 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 72 69    RtreeDValue ri
11a60 67 68 74 20 3d 20 61 44 69 73 74 61 6e 63 65 5b  ght = aDistance[
11a70 61 49 64 78 5b 6a 6a 5d 5d 3b 0a 20 20 20 20 20  aIdx[jj]];.     
11a80 20 20 20 61 73 73 65 72 74 28 20 6c 65 66 74 3c     assert( left<
11a90 3d 72 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20  =right );.      
11aa0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
11ab0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75   }.}../*.** Argu
11ac0 6d 65 6e 74 73 20 61 49 64 78 2c 20 61 43 65 6c  ments aIdx, aCel
11ad0 6c 20 61 6e 64 20 61 53 70 61 72 65 20 61 6c 6c  l and aSpare all
11ae0 20 70 6f 69 6e 74 20 74 6f 20 61 72 72 61 79 73   point to arrays
11af0 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 6e 49 64 78   of size.** nIdx
11b00 2e 20 54 68 65 20 61 49 64 78 20 61 72 72 61 79  . The aIdx array
11b10 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 65   contains the se
11b20 74 20 6f 66 20 69 6e 74 65 67 65 72 73 20 66 72  t of integers fr
11b30 6f 6d 20 30 20 74 6f 20 0a 2a 2a 20 28 6e 49 64  om 0 to .** (nId
11b40 78 2d 31 29 20 69 6e 20 6e 6f 20 70 61 72 74 69  x-1) in no parti
11b50 63 75 6c 61 72 20 6f 72 64 65 72 2e 20 54 68 69  cular order. Thi
11b60 73 20 66 75 6e 63 74 69 6f 6e 20 73 6f 72 74 73  s function sorts
11b70 20 74 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20 69   the values.** i
11b80 6e 20 61 49 64 78 20 61 63 63 6f 72 64 69 6e 67  n aIdx according
11b90 20 74 6f 20 64 69 6d 65 6e 73 69 6f 6e 20 69 44   to dimension iD
11ba0 69 6d 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  im of the cells 
11bb0 69 6e 20 61 43 65 6c 6c 2e 20 54 68 65 0a 2a 2a  in aCell. The.**
11bc0 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f   minimum value o
11bd0 66 20 64 69 6d 65 6e 73 69 6f 6e 20 69 44 69 6d  f dimension iDim
11be0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 66   is considered f
11bf0 69 72 73 74 2c 20 74 68 65 0a 2a 2a 20 6d 61 78  irst, the.** max
11c00 69 6d 75 6d 20 75 73 65 64 20 74 6f 20 62 72 65  imum used to bre
11c10 61 6b 20 74 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  ak ties..**.** T
11c20 68 65 20 61 53 70 61 72 65 20 61 72 72 61 79 20  he aSpare array 
11c30 69 73 20 75 73 65 64 20 61 73 20 74 65 6d 70 6f  is used as tempo
11c40 72 61 72 79 20 77 6f 72 6b 69 6e 67 20 73 70 61  rary working spa
11c50 63 65 20 62 79 20 74 68 65 0a 2a 2a 20 73 6f 72  ce by the.** sor
11c60 74 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  ting algorithm..
11c70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
11c80 6f 72 74 42 79 44 69 6d 65 6e 73 69 6f 6e 28 0a  ortByDimension(.
11c90 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
11ca0 0a 20 20 69 6e 74 20 2a 61 49 64 78 2c 20 0a 20  .  int *aIdx, . 
11cb0 20 69 6e 74 20 6e 49 64 78 2c 20 0a 20 20 69 6e   int nIdx, .  in
11cc0 74 20 69 44 69 6d 2c 20 0a 20 20 52 74 72 65 65  t iDim, .  Rtree
11cd0 43 65 6c 6c 20 2a 61 43 65 6c 6c 2c 20 0a 20 20  Cell *aCell, .  
11ce0 69 6e 74 20 2a 61 53 70 61 72 65 0a 29 7b 0a 20  int *aSpare.){. 
11cf0 20 69 66 28 20 6e 49 64 78 3e 31 20 29 7b 0a 0a   if( nIdx>1 ){..
11d00 20 20 20 20 69 6e 74 20 69 4c 65 66 74 20 3d 20      int iLeft = 
11d10 30 3b 0a 20 20 20 20 69 6e 74 20 69 52 69 67 68  0;.    int iRigh
11d20 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 6e 74 20  t = 0;..    int 
11d30 6e 4c 65 66 74 20 3d 20 6e 49 64 78 2f 32 3b 0a  nLeft = nIdx/2;.
11d40 20 20 20 20 69 6e 74 20 6e 52 69 67 68 74 20 3d      int nRight =
11d50 20 6e 49 64 78 2d 6e 4c 65 66 74 3b 0a 20 20 20   nIdx-nLeft;.   
11d60 20 69 6e 74 20 2a 61 4c 65 66 74 20 3d 20 61 49   int *aLeft = aI
11d70 64 78 3b 0a 20 20 20 20 69 6e 74 20 2a 61 52 69  dx;.    int *aRi
11d80 67 68 74 20 3d 20 26 61 49 64 78 5b 6e 4c 65 66  ght = &aIdx[nLef
11d90 74 5d 3b 0a 0a 20 20 20 20 53 6f 72 74 42 79 44  t];..    SortByD
11da0 69 6d 65 6e 73 69 6f 6e 28 70 52 74 72 65 65 2c  imension(pRtree,
11db0 20 61 4c 65 66 74 2c 20 6e 4c 65 66 74 2c 20 69   aLeft, nLeft, i
11dc0 44 69 6d 2c 20 61 43 65 6c 6c 2c 20 61 53 70 61  Dim, aCell, aSpa
11dd0 72 65 29 3b 0a 20 20 20 20 53 6f 72 74 42 79 44  re);.    SortByD
11de0 69 6d 65 6e 73 69 6f 6e 28 70 52 74 72 65 65 2c  imension(pRtree,
11df0 20 61 52 69 67 68 74 2c 20 6e 52 69 67 68 74 2c   aRight, nRight,
11e00 20 69 44 69 6d 2c 20 61 43 65 6c 6c 2c 20 61 53   iDim, aCell, aS
11e10 70 61 72 65 29 3b 0a 0a 20 20 20 20 6d 65 6d 63  pare);..    memc
11e20 70 79 28 61 53 70 61 72 65 2c 20 61 4c 65 66 74  py(aSpare, aLeft
11e30 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4c  , sizeof(int)*nL
11e40 65 66 74 29 3b 0a 20 20 20 20 61 4c 65 66 74 20  eft);.    aLeft 
11e50 3d 20 61 53 70 61 72 65 3b 0a 20 20 20 20 77 68  = aSpare;.    wh
11e60 69 6c 65 28 20 69 4c 65 66 74 3c 6e 4c 65 66 74  ile( iLeft<nLeft
11e70 20 7c 7c 20 69 52 69 67 68 74 3c 6e 52 69 67 68   || iRight<nRigh
11e80 74 20 29 7b 0a 20 20 20 20 20 20 52 74 72 65 65  t ){.      Rtree
11e90 44 56 61 6c 75 65 20 78 6c 65 66 74 31 20 3d 20  DValue xleft1 = 
11ea0 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 61 4c 65  DCOORD(aCell[aLe
11eb0 66 74 5b 69 4c 65 66 74 5d 5d 2e 61 43 6f 6f 72  ft[iLeft]].aCoor
11ec0 64 5b 69 44 69 6d 2a 32 5d 29 3b 0a 20 20 20 20  d[iDim*2]);.    
11ed0 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 78 6c    RtreeDValue xl
11ee0 65 66 74 32 20 3d 20 44 43 4f 4f 52 44 28 61 43  eft2 = DCOORD(aC
11ef0 65 6c 6c 5b 61 4c 65 66 74 5b 69 4c 65 66 74 5d  ell[aLeft[iLeft]
11f00 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 2b  ].aCoord[iDim*2+
11f10 31 5d 29 3b 0a 20 20 20 20 20 20 52 74 72 65 65  1]);.      Rtree
11f20 44 56 61 6c 75 65 20 78 72 69 67 68 74 31 20 3d  DValue xright1 =
11f30 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 61 52   DCOORD(aCell[aR
11f40 69 67 68 74 5b 69 52 69 67 68 74 5d 5d 2e 61 43  ight[iRight]].aC
11f50 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 29 3b 0a 20  oord[iDim*2]);. 
11f60 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65       RtreeDValue
11f70 20 78 72 69 67 68 74 32 20 3d 20 44 43 4f 4f 52   xright2 = DCOOR
11f80 44 28 61 43 65 6c 6c 5b 61 52 69 67 68 74 5b 69  D(aCell[aRight[i
11f90 52 69 67 68 74 5d 5d 2e 61 43 6f 6f 72 64 5b 69  Right]].aCoord[i
11fa0 44 69 6d 2a 32 2b 31 5d 29 3b 0a 20 20 20 20 20  Dim*2+1]);.     
11fb0 20 69 66 28 20 28 69 4c 65 66 74 21 3d 6e 4c 65   if( (iLeft!=nLe
11fc0 66 74 29 20 26 26 20 28 28 69 52 69 67 68 74 3d  ft) && ((iRight=
11fd0 3d 6e 52 69 67 68 74 29 0a 20 20 20 20 20 20 20  =nRight).       
11fe0 7c 7c 20 28 78 6c 65 66 74 31 3c 78 72 69 67 68  || (xleft1<xrigh
11ff0 74 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 78  t1).       || (x
12000 6c 65 66 74 31 3d 3d 78 72 69 67 68 74 31 20 26  left1==xright1 &
12010 26 20 78 6c 65 66 74 32 3c 78 72 69 67 68 74 32  & xleft2<xright2
12020 29 0a 20 20 20 20 20 20 29 29 7b 0a 20 20 20 20  ).      )){.    
12030 20 20 20 20 61 49 64 78 5b 69 4c 65 66 74 2b 69      aIdx[iLeft+i
12040 52 69 67 68 74 5d 20 3d 20 61 4c 65 66 74 5b 69  Right] = aLeft[i
12050 4c 65 66 74 5d 3b 0a 20 20 20 20 20 20 20 20 69  Left];.        i
12060 4c 65 66 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  Left++;.      }e
12070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 49 64  lse{.        aId
12080 78 5b 69 4c 65 66 74 2b 69 52 69 67 68 74 5d 20  x[iLeft+iRight] 
12090 3d 20 61 52 69 67 68 74 5b 69 52 69 67 68 74 5d  = aRight[iRight]
120a0 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74  ;.        iRight
120b0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
120c0 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20  }..#if 0.    /* 
120d0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 73  Check that the s
120e0 6f 72 74 20 77 6f 72 6b 65 64 20 2a 2f 0a 20 20  ort worked */.  
120f0 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a    {.      int jj
12100 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31  ;.      for(jj=1
12110 3b 20 6a 6a 3c 6e 49 64 78 3b 20 6a 6a 2b 2b 29  ; jj<nIdx; jj++)
12120 7b 0a 20 20 20 20 20 20 20 20 52 74 72 65 65 44  {.        RtreeD
12130 56 61 6c 75 65 20 78 6c 65 66 74 31 20 3d 20 61  Value xleft1 = a
12140 43 65 6c 6c 5b 61 49 64 78 5b 6a 6a 2d 31 5d 5d  Cell[aIdx[jj-1]]
12150 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 3b  .aCoord[iDim*2];
12160 0a 20 20 20 20 20 20 20 20 52 74 72 65 65 44 56  .        RtreeDV
12170 61 6c 75 65 20 78 6c 65 66 74 32 20 3d 20 61 43  alue xleft2 = aC
12180 65 6c 6c 5b 61 49 64 78 5b 6a 6a 2d 31 5d 5d 2e  ell[aIdx[jj-1]].
12190 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 2b 31 5d  aCoord[iDim*2+1]
121a0 3b 0a 20 20 20 20 20 20 20 20 52 74 72 65 65 44  ;.        RtreeD
121b0 56 61 6c 75 65 20 78 72 69 67 68 74 31 20 3d 20  Value xright1 = 
121c0 61 43 65 6c 6c 5b 61 49 64 78 5b 6a 6a 5d 5d 2e  aCell[aIdx[jj]].
121d0 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 3b 0a  aCoord[iDim*2];.
121e0 20 20 20 20 20 20 20 20 52 74 72 65 65 44 56 61          RtreeDVa
121f0 6c 75 65 20 78 72 69 67 68 74 32 20 3d 20 61 43  lue xright2 = aC
12200 65 6c 6c 5b 61 49 64 78 5b 6a 6a 5d 5d 2e 61 43  ell[aIdx[jj]].aC
12210 6f 6f 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 3b 0a  oord[iDim*2+1];.
12220 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12230 78 6c 65 66 74 31 3c 3d 78 72 69 67 68 74 31 20  xleft1<=xright1 
12240 26 26 20 28 78 6c 65 66 74 31 3c 78 72 69 67 68  && (xleft1<xrigh
12250 74 31 20 7c 7c 20 78 6c 65 66 74 32 3c 3d 78 72  t1 || xleft2<=xr
12260 69 67 68 74 32 29 20 29 3b 0a 20 20 20 20 20 20  ight2) );.      
12270 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
12280 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
12290 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
122a0 65 20 52 2a 2d 74 72 65 65 20 76 61 72 69 61 6e  e R*-tree varian
122b0 74 20 6f 66 20 53 70 6c 69 74 4e 6f 64 65 20 66  t of SplitNode f
122c0 72 6f 6d 20 42 65 63 6b 6d 61 6e 5b 31 39 39 30  rom Beckman[1990
122d0 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ]..*/.static int
122e0 20 73 70 6c 69 74 4e 6f 64 65 53 74 61 72 74 72   splitNodeStartr
122f0 65 65 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74  ee(.  Rtree *pRt
12300 72 65 65 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c  ree,.  RtreeCell
12310 20 2a 61 43 65 6c 6c 2c 0a 20 20 69 6e 74 20 6e   *aCell,.  int n
12320 43 65 6c 6c 2c 0a 20 20 52 74 72 65 65 4e 6f 64  Cell,.  RtreeNod
12330 65 20 2a 70 4c 65 66 74 2c 0a 20 20 52 74 72 65  e *pLeft,.  Rtre
12340 65 4e 6f 64 65 20 2a 70 52 69 67 68 74 2c 0a 20  eNode *pRight,. 
12350 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f   RtreeCell *pBbo
12360 78 4c 65 66 74 2c 0a 20 20 52 74 72 65 65 43 65  xLeft,.  RtreeCe
12370 6c 6c 20 2a 70 42 62 6f 78 52 69 67 68 74 0a 29  ll *pBboxRight.)
12380 7b 0a 20 20 69 6e 74 20 2a 2a 61 61 53 6f 72 74  {.  int **aaSort
12390 65 64 3b 0a 20 20 69 6e 74 20 2a 61 53 70 61 72  ed;.  int *aSpar
123a0 65 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20  e;.  int ii;..  
123b0 69 6e 74 20 69 42 65 73 74 44 69 6d 20 3d 20 30  int iBestDim = 0
123c0 3b 0a 20 20 69 6e 74 20 69 42 65 73 74 53 70 6c  ;.  int iBestSpl
123d0 69 74 20 3d 20 30 3b 0a 20 20 52 74 72 65 65 44  it = 0;.  RtreeD
123e0 56 61 6c 75 65 20 66 42 65 73 74 4d 61 72 67 69  Value fBestMargi
123f0 6e 20 3d 20 52 54 52 45 45 5f 5a 45 52 4f 3b 0a  n = RTREE_ZERO;.
12400 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
12410 20 6e 42 79 74 65 20 3d 20 28 70 52 74 72 65 65   nByte = (pRtree
12420 2d 3e 6e 44 69 6d 2b 31 29 2a 28 73 69 7a 65 6f  ->nDim+1)*(sizeo
12430 66 28 69 6e 74 2a 29 2b 6e 43 65 6c 6c 2a 73 69  f(int*)+nCell*si
12440 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 0a 20 20 61  zeof(int));..  a
12450 61 53 6f 72 74 65 64 20 3d 20 28 69 6e 74 20 2a  aSorted = (int *
12460 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
12470 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  64(nByte);.  if(
12480 20 21 61 61 53 6f 72 74 65 64 20 29 7b 0a 20 20   !aaSorted ){.  
12490 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
124a0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 61 53  NOMEM;.  }..  aS
124b0 70 61 72 65 20 3d 20 26 28 28 69 6e 74 20 2a 29  pare = &((int *)
124c0 26 61 61 53 6f 72 74 65 64 5b 70 52 74 72 65 65  &aaSorted[pRtree
124d0 2d 3e 6e 44 69 6d 5d 29 5b 70 52 74 72 65 65 2d  ->nDim])[pRtree-
124e0 3e 6e 44 69 6d 2a 6e 43 65 6c 6c 5d 3b 0a 20 20  >nDim*nCell];.  
124f0 6d 65 6d 73 65 74 28 61 61 53 6f 72 74 65 64 2c  memset(aaSorted,
12500 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 66 6f   0, nByte);.  fo
12510 72 28 69 69 3d 30 3b 20 69 69 3c 70 52 74 72 65  r(ii=0; ii<pRtre
12520 65 2d 3e 6e 44 69 6d 3b 20 69 69 2b 2b 29 7b 0a  e->nDim; ii++){.
12530 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20      int jj;.    
12540 61 61 53 6f 72 74 65 64 5b 69 69 5d 20 3d 20 26  aaSorted[ii] = &
12550 28 28 69 6e 74 20 2a 29 26 61 61 53 6f 72 74 65  ((int *)&aaSorte
12560 64 5b 70 52 74 72 65 65 2d 3e 6e 44 69 6d 5d 29  d[pRtree->nDim])
12570 5b 69 69 2a 6e 43 65 6c 6c 5d 3b 0a 20 20 20 20  [ii*nCell];.    
12580 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 6e 43 65  for(jj=0; jj<nCe
12590 6c 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ll; jj++){.     
125a0 20 61 61 53 6f 72 74 65 64 5b 69 69 5d 5b 6a 6a   aaSorted[ii][jj
125b0 5d 20 3d 20 6a 6a 3b 0a 20 20 20 20 7d 0a 20 20  ] = jj;.    }.  
125c0 20 20 53 6f 72 74 42 79 44 69 6d 65 6e 73 69 6f    SortByDimensio
125d0 6e 28 70 52 74 72 65 65 2c 20 61 61 53 6f 72 74  n(pRtree, aaSort
125e0 65 64 5b 69 69 5d 2c 20 6e 43 65 6c 6c 2c 20 69  ed[ii], nCell, i
125f0 69 2c 20 61 43 65 6c 6c 2c 20 61 53 70 61 72 65  i, aCell, aSpare
12600 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 69  );.  }..  for(ii
12610 3d 30 3b 20 69 69 3c 70 52 74 72 65 65 2d 3e 6e  =0; ii<pRtree->n
12620 44 69 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Dim; ii++){.    
12630 52 74 72 65 65 44 56 61 6c 75 65 20 6d 61 72 67  RtreeDValue marg
12640 69 6e 20 3d 20 52 54 52 45 45 5f 5a 45 52 4f 3b  in = RTREE_ZERO;
12650 0a 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65  .    RtreeDValue
12660 20 66 42 65 73 74 4f 76 65 72 6c 61 70 20 3d 20   fBestOverlap = 
12670 52 54 52 45 45 5f 5a 45 52 4f 3b 0a 20 20 20 20  RTREE_ZERO;.    
12680 52 74 72 65 65 44 56 61 6c 75 65 20 66 42 65 73  RtreeDValue fBes
12690 74 41 72 65 61 20 3d 20 52 54 52 45 45 5f 5a 45  tArea = RTREE_ZE
126a0 52 4f 3b 0a 20 20 20 20 69 6e 74 20 69 42 65 73  RO;.    int iBes
126b0 74 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 69  tLeft = 0;.    i
126c0 6e 74 20 6e 4c 65 66 74 3b 0a 0a 20 20 20 20 66  nt nLeft;..    f
126d0 6f 72 28 0a 20 20 20 20 20 20 6e 4c 65 66 74 3d  or(.      nLeft=
126e0 52 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70  RTREE_MINCELLS(p
126f0 52 74 72 65 65 29 3b 20 0a 20 20 20 20 20 20 6e  Rtree); .      n
12700 4c 65 66 74 3c 3d 28 6e 43 65 6c 6c 2d 52 54 52  Left<=(nCell-RTR
12710 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52 74 72  EE_MINCELLS(pRtr
12720 65 65 29 29 3b 20 0a 20 20 20 20 20 20 6e 4c 65  ee)); .      nLe
12730 66 74 2b 2b 0a 20 20 20 20 29 7b 0a 20 20 20 20  ft++.    ){.    
12740 20 20 52 74 72 65 65 43 65 6c 6c 20 6c 65 66 74    RtreeCell left
12750 3b 0a 20 20 20 20 20 20 52 74 72 65 65 43 65 6c  ;.      RtreeCel
12760 6c 20 72 69 67 68 74 3b 0a 20 20 20 20 20 20 69  l right;.      i
12770 6e 74 20 6b 6b 3b 0a 20 20 20 20 20 20 52 74 72  nt kk;.      Rtr
12780 65 65 44 56 61 6c 75 65 20 6f 76 65 72 6c 61 70  eeDValue overlap
12790 3b 0a 20 20 20 20 20 20 52 74 72 65 65 44 56 61  ;.      RtreeDVa
127a0 6c 75 65 20 61 72 65 61 3b 0a 0a 20 20 20 20 20  lue area;..     
127b0 20 6d 65 6d 63 70 79 28 26 6c 65 66 74 2c 20 26   memcpy(&left, &
127c0 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69  aCell[aaSorted[i
127d0 69 5d 5b 30 5d 5d 2c 20 73 69 7a 65 6f 66 28 52  i][0]], sizeof(R
127e0 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 20 20  treeCell));.    
127f0 20 20 6d 65 6d 63 70 79 28 26 72 69 67 68 74 2c    memcpy(&right,
12800 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64   &aCell[aaSorted
12810 5b 69 69 5d 5b 6e 43 65 6c 6c 2d 31 5d 5d 2c 20  [ii][nCell-1]], 
12820 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c  sizeof(RtreeCell
12830 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 6b  ));.      for(kk
12840 3d 31 3b 20 6b 6b 3c 28 6e 43 65 6c 6c 2d 31 29  =1; kk<(nCell-1)
12850 3b 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; kk++){.       
12860 20 69 66 28 20 6b 6b 3c 6e 4c 65 66 74 20 29 7b   if( kk<nLeft ){
12870 0a 20 20 20 20 20 20 20 20 20 20 63 65 6c 6c 55  .          cellU
12880 6e 69 6f 6e 28 70 52 74 72 65 65 2c 20 26 6c 65  nion(pRtree, &le
12890 66 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72  ft, &aCell[aaSor
128a0 74 65 64 5b 69 69 5d 5b 6b 6b 5d 5d 29 3b 0a 20  ted[ii][kk]]);. 
128b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
128c0 20 20 20 20 20 20 20 20 63 65 6c 6c 55 6e 69 6f          cellUnio
128d0 6e 28 70 52 74 72 65 65 2c 20 26 72 69 67 68 74  n(pRtree, &right
128e0 2c 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65  , &aCell[aaSorte
128f0 64 5b 69 69 5d 5b 6b 6b 5d 5d 29 3b 0a 20 20 20  d[ii][kk]]);.   
12900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12910 20 20 20 20 20 6d 61 72 67 69 6e 20 2b 3d 20 63       margin += c
12920 65 6c 6c 4d 61 72 67 69 6e 28 70 52 74 72 65 65  ellMargin(pRtree
12930 2c 20 26 6c 65 66 74 29 3b 0a 20 20 20 20 20 20  , &left);.      
12940 6d 61 72 67 69 6e 20 2b 3d 20 63 65 6c 6c 4d 61  margin += cellMa
12950 72 67 69 6e 28 70 52 74 72 65 65 2c 20 26 72 69  rgin(pRtree, &ri
12960 67 68 74 29 3b 0a 20 20 20 20 20 20 6f 76 65 72  ght);.      over
12970 6c 61 70 20 3d 20 63 65 6c 6c 4f 76 65 72 6c 61  lap = cellOverla
12980 70 28 70 52 74 72 65 65 2c 20 26 6c 65 66 74 2c  p(pRtree, &left,
12990 20 26 72 69 67 68 74 2c 20 31 29 3b 0a 20 20 20   &right, 1);.   
129a0 20 20 20 61 72 65 61 20 3d 20 63 65 6c 6c 41 72     area = cellAr
129b0 65 61 28 70 52 74 72 65 65 2c 20 26 6c 65 66 74  ea(pRtree, &left
129c0 29 20 2b 20 63 65 6c 6c 41 72 65 61 28 70 52 74  ) + cellArea(pRt
129d0 72 65 65 2c 20 26 72 69 67 68 74 29 3b 0a 20 20  ree, &right);.  
129e0 20 20 20 20 69 66 28 20 28 6e 4c 65 66 74 3d 3d      if( (nLeft==
129f0 52 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70  RTREE_MINCELLS(p
12a00 52 74 72 65 65 29 29 0a 20 20 20 20 20 20 20 7c  Rtree)).       |
12a10 7c 20 28 6f 76 65 72 6c 61 70 3c 66 42 65 73 74  | (overlap<fBest
12a20 4f 76 65 72 6c 61 70 29 0a 20 20 20 20 20 20 20  Overlap).       
12a30 7c 7c 20 28 6f 76 65 72 6c 61 70 3d 3d 66 42 65  || (overlap==fBe
12a40 73 74 4f 76 65 72 6c 61 70 20 26 26 20 61 72 65  stOverlap && are
12a50 61 3c 66 42 65 73 74 41 72 65 61 29 0a 20 20 20  a<fBestArea).   
12a60 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 42     ){.        iB
12a70 65 73 74 4c 65 66 74 20 3d 20 6e 4c 65 66 74 3b  estLeft = nLeft;
12a80 0a 20 20 20 20 20 20 20 20 66 42 65 73 74 4f 76  .        fBestOv
12a90 65 72 6c 61 70 20 3d 20 6f 76 65 72 6c 61 70 3b  erlap = overlap;
12aa0 0a 20 20 20 20 20 20 20 20 66 42 65 73 74 41 72  .        fBestAr
12ab0 65 61 20 3d 20 61 72 65 61 3b 0a 20 20 20 20 20  ea = area;.     
12ac0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
12ad0 28 20 69 69 3d 3d 30 20 7c 7c 20 6d 61 72 67 69  ( ii==0 || margi
12ae0 6e 3c 66 42 65 73 74 4d 61 72 67 69 6e 20 29 7b  n<fBestMargin ){
12af0 0a 20 20 20 20 20 20 69 42 65 73 74 44 69 6d 20  .      iBestDim 
12b00 3d 20 69 69 3b 0a 20 20 20 20 20 20 66 42 65 73  = ii;.      fBes
12b10 74 4d 61 72 67 69 6e 20 3d 20 6d 61 72 67 69 6e  tMargin = margin
12b20 3b 0a 20 20 20 20 20 20 69 42 65 73 74 53 70 6c  ;.      iBestSpl
12b30 69 74 20 3d 20 69 42 65 73 74 4c 65 66 74 3b 0a  it = iBestLeft;.
12b40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d      }.  }..  mem
12b50 63 70 79 28 70 42 62 6f 78 4c 65 66 74 2c 20 26  cpy(pBboxLeft, &
12b60 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69  aCell[aaSorted[i
12b70 42 65 73 74 44 69 6d 5d 5b 30 5d 5d 2c 20 73 69  BestDim][0]], si
12b80 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29 29  zeof(RtreeCell))
12b90 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 62 6f 78  ;.  memcpy(pBbox
12ba0 52 69 67 68 74 2c 20 26 61 43 65 6c 6c 5b 61 61  Right, &aCell[aa
12bb0 53 6f 72 74 65 64 5b 69 42 65 73 74 44 69 6d 5d  Sorted[iBestDim]
12bc0 5b 69 42 65 73 74 53 70 6c 69 74 5d 5d 2c 20 73  [iBestSplit]], s
12bd0 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29  izeof(RtreeCell)
12be0 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  );.  for(ii=0; i
12bf0 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a  i<nCell; ii++){.
12c00 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
12c10 54 61 72 67 65 74 20 3d 20 28 69 69 3c 69 42 65  Target = (ii<iBe
12c20 73 74 53 70 6c 69 74 29 3f 70 4c 65 66 74 3a 70  stSplit)?pLeft:p
12c30 52 69 67 68 74 3b 0a 20 20 20 20 52 74 72 65 65  Right;.    Rtree
12c40 43 65 6c 6c 20 2a 70 42 62 6f 78 20 3d 20 28 69  Cell *pBbox = (i
12c50 69 3c 69 42 65 73 74 53 70 6c 69 74 29 3f 70 42  i<iBestSplit)?pB
12c60 62 6f 78 4c 65 66 74 3a 70 42 62 6f 78 52 69 67  boxLeft:pBboxRig
12c70 68 74 3b 0a 20 20 20 20 52 74 72 65 65 43 65 6c  ht;.    RtreeCel
12c80 6c 20 2a 70 43 65 6c 6c 20 3d 20 26 61 43 65 6c  l *pCell = &aCel
12c90 6c 5b 61 61 53 6f 72 74 65 64 5b 69 42 65 73 74  l[aaSorted[iBest
12ca0 44 69 6d 5d 5b 69 69 5d 5d 3b 0a 20 20 20 20 6e  Dim][ii]];.    n
12cb0 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52  odeInsertCell(pR
12cc0 74 72 65 65 2c 20 70 54 61 72 67 65 74 2c 20 70  tree, pTarget, p
12cd0 43 65 6c 6c 29 3b 0a 20 20 20 20 63 65 6c 6c 55  Cell);.    cellU
12ce0 6e 69 6f 6e 28 70 52 74 72 65 65 2c 20 70 42 62  nion(pRtree, pBb
12cf0 6f 78 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a  ox, pCell);.  }.
12d00 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12d10 61 61 53 6f 72 74 65 64 29 3b 0a 20 20 72 65 74  aaSorted);.  ret
12d20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12d30 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 70  ...static int up
12d40 64 61 74 65 4d 61 70 70 69 6e 67 28 0a 20 20 52  dateMapping(.  R
12d50 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 0a 20  tree *pRtree, . 
12d60 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20   i64 iRowid, .  
12d70 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
12d80 2c 20 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74  , .  int iHeight
12d90 0a 29 7b 0a 20 20 69 6e 74 20 28 2a 78 53 65 74  .){.  int (*xSet
12da0 4d 61 70 70 69 6e 67 29 28 52 74 72 65 65 20 2a  Mapping)(Rtree *
12db0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c  , sqlite3_int64,
12dc0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b   sqlite3_int64);
12dd0 0a 20 20 78 53 65 74 4d 61 70 70 69 6e 67 20 3d  .  xSetMapping =
12de0 20 28 28 69 48 65 69 67 68 74 3d 3d 30 29 3f 72   ((iHeight==0)?r
12df0 6f 77 69 64 57 72 69 74 65 3a 70 61 72 65 6e 74  owidWrite:parent
12e00 57 72 69 74 65 29 3b 0a 20 20 69 66 28 20 69 48  Write);.  if( iH
12e10 65 69 67 68 74 3e 30 20 29 7b 0a 20 20 20 20 52  eight>0 ){.    R
12e20 74 72 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64  treeNode *pChild
12e30 20 3d 20 6e 6f 64 65 48 61 73 68 4c 6f 6f 6b 75   = nodeHashLooku
12e40 70 28 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64  p(pRtree, iRowid
12e50 29 3b 0a 20 20 20 20 69 66 28 20 70 43 68 69 6c  );.    if( pChil
12e60 64 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65 52  d ){.      nodeR
12e70 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
12e80 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 29 3b  Child->pParent);
12e90 0a 20 20 20 20 20 20 6e 6f 64 65 52 65 66 65 72  .      nodeRefer
12ea0 65 6e 63 65 28 70 4e 6f 64 65 29 3b 0a 20 20 20  ence(pNode);.   
12eb0 20 20 20 70 43 68 69 6c 64 2d 3e 70 50 61 72 65     pChild->pPare
12ec0 6e 74 20 3d 20 70 4e 6f 64 65 3b 0a 20 20 20 20  nt = pNode;.    
12ed0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 78  }.  }.  return x
12ee0 53 65 74 4d 61 70 70 69 6e 67 28 70 52 74 72 65  SetMapping(pRtre
12ef0 65 2c 20 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65  e, iRowid, pNode
12f00 2d 3e 69 4e 6f 64 65 29 3b 0a 7d 0a 0a 73 74 61  ->iNode);.}..sta
12f10 74 69 63 20 69 6e 74 20 53 70 6c 69 74 4e 6f 64  tic int SplitNod
12f20 65 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  e(.  Rtree *pRtr
12f30 65 65 2c 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  ee,.  RtreeNode 
12f40 2a 70 4e 6f 64 65 2c 0a 20 20 52 74 72 65 65 43  *pNode,.  RtreeC
12f50 65 6c 6c 20 2a 70 43 65 6c 6c 2c 0a 20 20 69 6e  ell *pCell,.  in
12f60 74 20 69 48 65 69 67 68 74 0a 29 7b 0a 20 20 69  t iHeight.){.  i
12f70 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 65 77 43  nt i;.  int newC
12f80 65 6c 6c 49 73 52 69 67 68 74 20 3d 20 30 3b 0a  ellIsRight = 0;.
12f90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12fa0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 43 65  TE_OK;.  int nCe
12fb0 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64 65  ll = NCELL(pNode
12fc0 29 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a  );.  RtreeCell *
12fd0 61 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 2a 61 69  aCell;.  int *ai
12fe0 55 73 65 64 3b 0a 0a 20 20 52 74 72 65 65 4e 6f  Used;..  RtreeNo
12ff0 64 65 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 20  de *pLeft = 0;. 
13000 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 52 69 67   RtreeNode *pRig
13010 68 74 20 3d 20 30 3b 0a 0a 20 20 52 74 72 65 65  ht = 0;..  Rtree
13020 43 65 6c 6c 20 6c 65 66 74 62 62 6f 78 3b 0a 20  Cell leftbbox;. 
13030 20 52 74 72 65 65 43 65 6c 6c 20 72 69 67 68 74   RtreeCell right
13040 62 62 6f 78 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  bbox;..  /* Allo
13050 63 61 74 65 20 61 6e 20 61 72 72 61 79 20 61 6e  cate an array an
13060 64 20 70 6f 70 75 6c 61 74 65 20 69 74 20 77 69  d populate it wi
13070 74 68 20 61 20 63 6f 70 79 20 6f 66 20 70 43 65  th a copy of pCe
13080 6c 6c 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6c 6c  ll and .  ** all
13090 20 63 65 6c 6c 73 20 66 72 6f 6d 20 6e 6f 64 65   cells from node
130a0 20 70 4c 65 66 74 2e 20 54 68 65 6e 20 7a 65 72   pLeft. Then zer
130b0 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6e  o the original n
130c0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 43 65 6c  ode..  */.  aCel
130d0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  l = sqlite3_mall
130e0 6f 63 36 34 28 28 73 69 7a 65 6f 66 28 52 74 72  oc64((sizeof(Rtr
130f0 65 65 43 65 6c 6c 29 2b 73 69 7a 65 6f 66 28 69  eeCell)+sizeof(i
13100 6e 74 29 29 2a 28 6e 43 65 6c 6c 2b 31 29 29 3b  nt))*(nCell+1));
13110 0a 20 20 69 66 28 20 21 61 43 65 6c 6c 20 29 7b  .  if( !aCell ){
13120 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13130 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
13140 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a   splitnode_out;.
13150 20 20 7d 0a 20 20 61 69 55 73 65 64 20 3d 20 28    }.  aiUsed = (
13160 69 6e 74 20 2a 29 26 61 43 65 6c 6c 5b 6e 43 65  int *)&aCell[nCe
13170 6c 6c 2b 31 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  ll+1];.  memset(
13180 61 69 55 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f  aiUsed, 0, sizeo
13190 66 28 69 6e 74 29 2a 28 6e 43 65 6c 6c 2b 31 29  f(int)*(nCell+1)
131a0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
131b0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
131c0 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70 52 74   nodeGetCell(pRt
131d0 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69 2c 20 26  ree, pNode, i, &
131e0 61 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20  aCell[i]);.  }. 
131f0 20 6e 6f 64 65 5a 65 72 6f 28 70 52 74 72 65 65   nodeZero(pRtree
13200 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 6d 65 6d 63  , pNode);.  memc
13210 70 79 28 26 61 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(&aCell[nCell]
13220 2c 20 70 43 65 6c 6c 2c 20 73 69 7a 65 6f 66 28  , pCell, sizeof(
13230 52 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 6e  RtreeCell));.  n
13240 43 65 6c 6c 2b 2b 3b 0a 0a 20 20 69 66 28 20 70  Cell++;..  if( p
13250 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29  Node->iNode==1 )
13260 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 6e  {.    pRight = n
13270 6f 64 65 4e 65 77 28 70 52 74 72 65 65 2c 20 70  odeNew(pRtree, p
13280 4e 6f 64 65 29 3b 0a 20 20 20 20 70 4c 65 66 74  Node);.    pLeft
13290 20 3d 20 6e 6f 64 65 4e 65 77 28 70 52 74 72 65   = nodeNew(pRtre
132a0 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 70  e, pNode);.    p
132b0 52 74 72 65 65 2d 3e 69 44 65 70 74 68 2b 2b 3b  Rtree->iDepth++;
132c0 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 69 73 44 69  .    pNode->isDi
132d0 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 77 72 69  rty = 1;.    wri
132e0 74 65 49 6e 74 31 36 28 70 4e 6f 64 65 2d 3e 7a  teInt16(pNode->z
132f0 44 61 74 61 2c 20 70 52 74 72 65 65 2d 3e 69 44  Data, pRtree->iD
13300 65 70 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  epth);.  }else{.
13310 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4e 6f 64      pLeft = pNod
13320 65 3b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  e;.    pRight = 
13330 6e 6f 64 65 4e 65 77 28 70 52 74 72 65 65 2c 20  nodeNew(pRtree, 
13340 70 4c 65 66 74 2d 3e 70 50 61 72 65 6e 74 29 3b  pLeft->pParent);
13350 0a 20 20 20 20 70 4c 65 66 74 2d 3e 6e 52 65 66  .    pLeft->nRef
13360 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  ++;.  }..  if( !
13370 70 4c 65 66 74 20 7c 7c 20 21 70 52 69 67 68 74  pLeft || !pRight
13380 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
13390 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
133a0 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75  oto splitnode_ou
133b0 74 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74  t;.  }..  memset
133c0 28 70 4c 65 66 74 2d 3e 7a 44 61 74 61 2c 20 30  (pLeft->zData, 0
133d0 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53  , pRtree->iNodeS
133e0 69 7a 65 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  ize);.  memset(p
133f0 52 69 67 68 74 2d 3e 7a 44 61 74 61 2c 20 30 2c  Right->zData, 0,
13400 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69   pRtree->iNodeSi
13410 7a 65 29 3b 0a 0a 20 20 72 63 20 3d 20 73 70 6c  ze);..  rc = spl
13420 69 74 4e 6f 64 65 53 74 61 72 74 72 65 65 28 70  itNodeStartree(p
13430 52 74 72 65 65 2c 20 61 43 65 6c 6c 2c 20 6e 43  Rtree, aCell, nC
13440 65 6c 6c 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  ell, pLeft, pRig
13450 68 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht,.            
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6c 65               &le
13470 66 74 62 62 6f 78 2c 20 26 72 69 67 68 74 62 62  ftbbox, &rightbb
13480 6f 78 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ox);.  if( rc!=S
13490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
134a0 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f 6f  goto splitnode_o
134b0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e  ut;.  }..  /* En
134c0 73 75 72 65 20 62 6f 74 68 20 63 68 69 6c 64 20  sure both child 
134d0 6e 6f 64 65 73 20 68 61 76 65 20 6e 6f 64 65 20  nodes have node 
134e0 6e 75 6d 62 65 72 73 20 61 73 73 69 67 6e 65 64  numbers assigned
134f0 20 74 6f 20 74 68 65 6d 20 62 79 20 63 61 6c 6c   to them by call
13500 69 6e 67 0a 20 20 2a 2a 20 6e 6f 64 65 57 72 69  ing.  ** nodeWri
13510 74 65 28 29 2e 20 4e 6f 64 65 20 70 52 69 67 68  te(). Node pRigh
13520 74 20 61 6c 77 61 79 73 20 6e 65 65 64 73 20 61  t always needs a
13530 20 6e 6f 64 65 20 6e 75 6d 62 65 72 2c 20 61 73   node number, as
13540 20 69 74 20 77 61 73 20 63 72 65 61 74 65 64 0a   it was created.
13550 20 20 2a 2a 20 62 79 20 6e 6f 64 65 4e 65 77 28    ** by nodeNew(
13560 29 20 61 62 6f 76 65 2e 20 42 75 74 20 6e 6f 64  ) above. But nod
13570 65 20 70 4c 65 66 74 20 73 6f 6d 65 74 69 6d 65  e pLeft sometime
13580 73 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  s already has a 
13590 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  node number..  *
135a0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  * In this case a
135b0 76 6f 69 64 20 74 68 65 20 61 6c 6c 20 74 6f 20  void the all to 
135c0 6e 6f 64 65 57 72 69 74 65 28 29 2e 0a 20 20 2a  nodeWrite()..  *
135d0 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
135e0 4b 21 3d 28 72 63 20 3d 20 6e 6f 64 65 57 72 69  K!=(rc = nodeWri
135f0 74 65 28 70 52 74 72 65 65 2c 20 70 52 69 67 68  te(pRtree, pRigh
13600 74 29 29 0a 20 20 20 7c 7c 20 28 30 3d 3d 70 4c  t)).   || (0==pL
13610 65 66 74 2d 3e 69 4e 6f 64 65 20 26 26 20 53 51  eft->iNode && SQ
13620 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 6e  LITE_OK!=(rc = n
13630 6f 64 65 57 72 69 74 65 28 70 52 74 72 65 65 2c  odeWrite(pRtree,
13640 20 70 4c 65 66 74 29 29 29 0a 20 20 29 7b 0a 20   pLeft))).  ){. 
13650 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64     goto splitnod
13660 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 72 69  e_out;.  }..  ri
13670 67 68 74 62 62 6f 78 2e 69 52 6f 77 69 64 20 3d  ghtbbox.iRowid =
13680 20 70 52 69 67 68 74 2d 3e 69 4e 6f 64 65 3b 0a   pRight->iNode;.
13690 20 20 6c 65 66 74 62 62 6f 78 2e 69 52 6f 77 69    leftbbox.iRowi
136a0 64 20 3d 20 70 4c 65 66 74 2d 3e 69 4e 6f 64 65  d = pLeft->iNode
136b0 3b 0a 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  ;..  if( pNode->
136c0 69 4e 6f 64 65 3d 3d 31 20 29 7b 0a 20 20 20 20  iNode==1 ){.    
136d0 72 63 20 3d 20 72 74 72 65 65 49 6e 73 65 72 74  rc = rtreeInsert
136e0 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4c 65  Cell(pRtree, pLe
136f0 66 74 2d 3e 70 50 61 72 65 6e 74 2c 20 26 6c 65  ft->pParent, &le
13700 66 74 62 62 6f 78 2c 20 69 48 65 69 67 68 74 2b  ftbbox, iHeight+
13710 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  1);.    if( rc!=
13720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13730 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64     goto splitnod
13740 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
13750 65 6c 73 65 7b 0a 20 20 20 20 52 74 72 65 65 4e  else{.    RtreeN
13760 6f 64 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70  ode *pParent = p
13770 4c 65 66 74 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Left->pParent;. 
13780 20 20 20 69 6e 74 20 69 43 65 6c 6c 3b 0a 20 20     int iCell;.  
13790 20 20 72 63 20 3d 20 6e 6f 64 65 50 61 72 65 6e    rc = nodeParen
137a0 74 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20 70  tIndex(pRtree, p
137b0 4c 65 66 74 2c 20 26 69 43 65 6c 6c 29 3b 0a 20  Left, &iCell);. 
137c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
137d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 6f  E_OK ){.      no
137e0 64 65 4f 76 65 72 77 72 69 74 65 43 65 6c 6c 28  deOverwriteCell(
137f0 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c  pRtree, pParent,
13800 20 26 6c 65 66 74 62 62 6f 78 2c 20 69 43 65 6c   &leftbbox, iCel
13810 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41  l);.      rc = A
13820 64 6a 75 73 74 54 72 65 65 28 70 52 74 72 65 65  djustTree(pRtree
13830 2c 20 70 50 61 72 65 6e 74 2c 20 26 6c 65 66 74  , pParent, &left
13840 62 62 6f 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  bbox);.    }.   
13850 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13860 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
13870 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a   splitnode_out;.
13880 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
13890 28 72 63 20 3d 20 72 74 72 65 65 49 6e 73 65 72  (rc = rtreeInser
138a0 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 52  tCell(pRtree, pR
138b0 69 67 68 74 2d 3e 70 50 61 72 65 6e 74 2c 20 26  ight->pParent, &
138c0 72 69 67 68 74 62 62 6f 78 2c 20 69 48 65 69 67  rightbbox, iHeig
138d0 68 74 2b 31 29 29 20 29 7b 0a 20 20 20 20 67 6f  ht+1)) ){.    go
138e0 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75 74  to splitnode_out
138f0 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
13900 3b 20 69 3c 4e 43 45 4c 4c 28 70 52 69 67 68 74  ; i<NCELL(pRight
13910 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34  ); i++){.    i64
13920 20 69 52 6f 77 69 64 20 3d 20 6e 6f 64 65 47 65   iRowid = nodeGe
13930 74 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70  tRowid(pRtree, p
13940 52 69 67 68 74 2c 20 69 29 3b 0a 20 20 20 20 72  Right, i);.    r
13950 63 20 3d 20 75 70 64 61 74 65 4d 61 70 70 69 6e  c = updateMappin
13960 67 28 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64  g(pRtree, iRowid
13970 2c 20 70 52 69 67 68 74 2c 20 69 48 65 69 67 68  , pRight, iHeigh
13980 74 29 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77  t);.    if( iRow
13990 69 64 3d 3d 70 43 65 6c 6c 2d 3e 69 52 6f 77 69  id==pCell->iRowi
139a0 64 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 43 65  d ){.      newCe
139b0 6c 6c 49 73 52 69 67 68 74 20 3d 20 31 3b 0a 20  llIsRight = 1;. 
139c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
139d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
139e0 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f      goto splitno
139f0 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  de_out;.    }.  
13a00 7d 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69  }.  if( pNode->i
13a10 4e 6f 64 65 3d 3d 31 20 29 7b 0a 20 20 20 20 66  Node==1 ){.    f
13a20 6f 72 28 69 3d 30 3b 20 69 3c 4e 43 45 4c 4c 28  or(i=0; i<NCELL(
13a30 70 4c 65 66 74 29 3b 20 69 2b 2b 29 7b 0a 20 20  pLeft); i++){.  
13a40 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
13a50 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 70 52   nodeGetRowid(pR
13a60 74 72 65 65 2c 20 70 4c 65 66 74 2c 20 69 29 3b  tree, pLeft, i);
13a70 0a 20 20 20 20 20 20 72 63 20 3d 20 75 70 64 61  .      rc = upda
13a80 74 65 4d 61 70 70 69 6e 67 28 70 52 74 72 65 65  teMapping(pRtree
13a90 2c 20 69 52 6f 77 69 64 2c 20 70 4c 65 66 74 2c  , iRowid, pLeft,
13aa0 20 69 48 65 69 67 68 74 29 3b 0a 20 20 20 20 20   iHeight);.     
13ab0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13ac0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
13ad0 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75 74  to splitnode_out
13ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13af0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 65 77 43    }else if( newC
13b00 65 6c 6c 49 73 52 69 67 68 74 3d 3d 30 20 29 7b  ellIsRight==0 ){
13b10 0a 20 20 20 20 72 63 20 3d 20 75 70 64 61 74 65  .    rc = update
13b20 4d 61 70 70 69 6e 67 28 70 52 74 72 65 65 2c 20  Mapping(pRtree, 
13b30 70 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 2c 20 70  pCell->iRowid, p
13b40 4c 65 66 74 2c 20 69 48 65 69 67 68 74 29 3b 0a  Left, iHeight);.
13b50 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
13b60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13b70 72 63 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65  rc = nodeRelease
13b80 28 70 52 74 72 65 65 2c 20 70 52 69 67 68 74 29  (pRtree, pRight)
13b90 3b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 30  ;.    pRight = 0
13ba0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
13bb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13bc0 20 72 63 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73   rc = nodeReleas
13bd0 65 28 70 52 74 72 65 65 2c 20 70 4c 65 66 74 29  e(pRtree, pLeft)
13be0 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 30 3b  ;.    pLeft = 0;
13bf0 0a 20 20 7d 0a 0a 73 70 6c 69 74 6e 6f 64 65 5f  .  }..splitnode_
13c00 6f 75 74 3a 0a 20 20 6e 6f 64 65 52 65 6c 65 61  out:.  nodeRelea
13c10 73 65 28 70 52 74 72 65 65 2c 20 70 52 69 67 68  se(pRtree, pRigh
13c20 74 29 3b 0a 20 20 6e 6f 64 65 52 65 6c 65 61 73  t);.  nodeReleas
13c30 65 28 70 52 74 72 65 65 2c 20 70 4c 65 66 74 29  e(pRtree, pLeft)
13c40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
13c50 28 61 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72  (aCell);.  retur
13c60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
13c70 66 20 6e 6f 64 65 20 70 4c 65 61 66 20 69 73 20  f node pLeaf is 
13c80 6e 6f 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  not the root of 
13c90 74 68 65 20 72 2d 74 72 65 65 20 61 6e 64 20 69  the r-tree and i
13ca0 74 73 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74  ts pParent point
13cb0 65 72 20 69 73 20 0a 2a 2a 20 73 74 69 6c 6c 20  er is .** still 
13cc0 4e 55 4c 4c 2c 20 6c 6f 61 64 20 61 6c 6c 20 61  NULL, load all a
13cd0 6e 63 65 73 74 6f 72 20 6e 6f 64 65 73 20 6f 66  ncestor nodes of
13ce0 20 70 4c 65 61 66 20 69 6e 74 6f 20 6d 65 6d 6f   pLeaf into memo
13cf0 72 79 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 0a  ry and populate.
13d00 2a 2a 20 74 68 65 20 70 4c 65 61 66 2d 3e 70 50  ** the pLeaf->pP
13d10 61 72 65 6e 74 20 63 68 61 69 6e 20 61 6c 6c 20  arent chain all 
13d20 74 68 65 20 77 61 79 20 75 70 20 74 6f 20 74 68  the way up to th
13d30 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a 2a 2a 0a  e root node..**.
13d40 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f  ** This operatio
13d50 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 77 68  n is required wh
13d60 65 6e 20 61 20 72 6f 77 20 69 73 20 64 65 6c 65  en a row is dele
13d70 74 65 64 20 28 6f 72 20 75 70 64 61 74 65 64 20  ted (or updated 
13d80 2d 20 61 6e 20 75 70 64 61 74 65 0a 2a 2a 20 69  - an update.** i
13d90 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
13da0 20 61 20 64 65 6c 65 74 65 20 66 6f 6c 6c 6f 77   a delete follow
13db0 65 64 20 62 79 20 61 6e 20 69 6e 73 65 72 74 29  ed by an insert)
13dc0 2e 20 53 51 4c 69 74 65 20 70 72 6f 76 69 64 65  . SQLite provide
13dd0 73 20 74 68 65 0a 2a 2a 20 72 6f 77 69 64 20 6f  s the.** rowid o
13de0 66 20 74 68 65 20 72 6f 77 20 74 6f 20 64 65 6c  f the row to del
13df0 65 74 65 2c 20 77 68 69 63 68 20 63 61 6e 20 62  ete, which can b
13e00 65 20 75 73 65 64 20 74 6f 20 66 69 6e 64 20 74  e used to find t
13e10 68 65 20 6c 65 61 66 20 6f 6e 20 77 68 69 63 68  he leaf on which
13e20 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 72 65  .** the entry re
13e30 73 69 64 65 73 20 28 61 72 67 75 6d 65 6e 74 20  sides (argument 
13e40 70 4c 65 61 66 29 2e 20 4f 6e 63 65 20 74 68 65  pLeaf). Once the
13e50 20 6c 65 61 66 20 69 73 20 6c 6f 63 61 74 65 64   leaf is located
13e60 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
13e70 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
13e80 20 64 65 74 65 72 6d 69 6e 65 20 69 74 73 20 61   determine its a
13e90 6e 63 65 73 74 72 79 2e 0a 2a 2f 0a 73 74 61 74  ncestry..*/.stat
13ea0 69 63 20 69 6e 74 20 66 69 78 4c 65 61 66 50 61  ic int fixLeafPa
13eb0 72 65 6e 74 28 52 74 72 65 65 20 2a 70 52 74 72  rent(Rtree *pRtr
13ec0 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70  ee, RtreeNode *p
13ed0 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 72 63 20  Leaf){.  int rc 
13ee0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52  = SQLITE_OK;.  R
13ef0 74 72 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64  treeNode *pChild
13f00 20 3d 20 70 4c 65 61 66 3b 0a 20 20 77 68 69 6c   = pLeaf;.  whil
13f10 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
13f20 20 26 26 20 70 43 68 69 6c 64 2d 3e 69 4e 6f 64   && pChild->iNod
13f30 65 21 3d 31 20 26 26 20 70 43 68 69 6c 64 2d 3e  e!=1 && pChild->
13f40 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  pParent==0 ){.  
13f50 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
13f60 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
13f70 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  /* sqlite3_reset
13f80 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  () return code *
13f90 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  /.    sqlite3_bi
13fa0 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d  nd_int64(pRtree-
13fb0 3e 70 52 65 61 64 50 61 72 65 6e 74 2c 20 31 2c  >pReadParent, 1,
13fc0 20 70 43 68 69 6c 64 2d 3e 69 4e 6f 64 65 29 3b   pChild->iNode);
13fd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13fe0 33 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70  3_step(pRtree->p
13ff0 52 65 61 64 50 61 72 65 6e 74 29 3b 0a 20 20 20  ReadParent);.   
14000 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14010 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 52 74 72  ROW ){.      Rtr
14020 65 65 4e 6f 64 65 20 2a 70 54 65 73 74 3b 20 20  eeNode *pTest;  
14030 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
14040 20 74 6f 20 74 65 73 74 20 66 6f 72 20 72 65 66   to test for ref
14050 65 72 65 6e 63 65 20 6c 6f 6f 70 73 20 2a 2f 0a  erence loops */.
14060 20 20 20 20 20 20 69 36 34 20 69 4e 6f 64 65 3b        i64 iNode;
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14080 20 20 2f 2a 20 4e 6f 64 65 20 6e 75 6d 62 65 72    /* Node number
14090 20 6f 66 20 70 61 72 65 6e 74 20 6e 6f 64 65 20   of parent node 
140a0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 66  */..      /* Bef
140b0 6f 72 65 20 73 65 74 74 69 6e 67 20 70 43 68 69  ore setting pChi
140c0 6c 64 2d 3e 70 50 61 72 65 6e 74 2c 20 74 65 73  ld->pParent, tes
140d0 74 20 74 68 61 74 20 77 65 20 61 72 65 20 6e 6f  t that we are no
140e0 74 20 63 72 65 61 74 69 6e 67 20 61 0a 20 20 20  t creating a.   
140f0 20 20 20 2a 2a 20 6c 6f 6f 70 20 6f 66 20 72 65     ** loop of re
14100 66 65 72 65 6e 63 65 73 20 28 61 73 20 77 65 20  ferences (as we 
14110 77 6f 75 6c 64 20 69 66 2c 20 73 61 79 2c 20 70  would if, say, p
14120 43 68 69 6c 64 3d 3d 70 50 61 72 65 6e 74 29 2e  Child==pParent).
14130 20 57 65 20 64 6f 6e 27 74 0a 20 20 20 20 20 20   We don't.      
14140 2a 2a 20 77 61 6e 74 20 74 6f 20 64 6f 20 74 68  ** want to do th
14150 69 73 20 61 73 20 69 74 20 6c 65 61 64 73 20 74  is as it leads t
14160 6f 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  o a memory leak 
14170 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 64  when trying to d
14180 65 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  elete.      ** t
14190 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 63 6f  he referenced co
141a0 75 6e 74 65 64 20 6e 6f 64 65 20 73 74 72 75 63  unted node struc
141b0 74 75 72 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  tures..      */.
141c0 20 20 20 20 20 20 69 4e 6f 64 65 20 3d 20 73 71        iNode = sq
141d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
141e0 36 34 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64  64(pRtree->pRead
141f0 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20  Parent, 0);.    
14200 20 20 66 6f 72 28 70 54 65 73 74 3d 70 4c 65 61    for(pTest=pLea
14210 66 3b 20 70 54 65 73 74 20 26 26 20 70 54 65 73  f; pTest && pTes
14220 74 2d 3e 69 4e 6f 64 65 21 3d 69 4e 6f 64 65 3b  t->iNode!=iNode;
14230 20 70 54 65 73 74 3d 70 54 65 73 74 2d 3e 70 50   pTest=pTest->pP
14240 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  arent);.      if
14250 28 20 21 70 54 65 73 74 20 29 7b 0a 20 20 20 20  ( !pTest ){.    
14260 20 20 20 20 72 63 32 20 3d 20 6e 6f 64 65 41 63      rc2 = nodeAc
14270 71 75 69 72 65 28 70 52 74 72 65 65 2c 20 69 4e  quire(pRtree, iN
14280 6f 64 65 2c 20 30 2c 20 26 70 43 68 69 6c 64 2d  ode, 0, &pChild-
14290 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20  >pParent);.     
142a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20   }.    }.    rc 
142b0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
142c0 70 52 74 72 65 65 2d 3e 70 52 65 61 64 50 61 72  pRtree->pReadPar
142d0 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ent);.    if( rc
142e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
142f0 20 3d 20 72 63 32 3b 0a 20 20 20 20 69 66 28 20   = rc2;.    if( 
14300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14310 20 21 70 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e   !pChild->pParen
14320 74 20 29 7b 0a 20 20 20 20 20 20 52 54 52 45 45  t ){.      RTREE
14330 5f 49 53 5f 43 4f 52 52 55 50 54 28 70 52 74 72  _IS_CORRUPT(pRtr
14340 65 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ee);.      rc = 
14350 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
14360 54 41 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TAB;.    }.    p
14370 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 2d 3e  Child = pChild->
14380 70 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72  pParent;.  }.  r
14390 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
143a0 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65 43 65  tic int deleteCe
143b0 6c 6c 28 52 74 72 65 65 20 2a 2c 20 52 74 72 65  ll(Rtree *, Rtre
143c0 65 4e 6f 64 65 20 2a 2c 20 69 6e 74 2c 20 69 6e  eNode *, int, in
143d0 74 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  t);..static int 
143e0 72 65 6d 6f 76 65 4e 6f 64 65 28 52 74 72 65 65  removeNode(Rtree
143f0 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e   *pRtree, RtreeN
14400 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 69 6e 74 20  ode *pNode, int 
14410 69 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  iHeight){.  int 
14420 72 63 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20  rc;.  int rc2;. 
14430 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61 72   RtreeNode *pPar
14440 65 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ent = 0;.  int i
14450 43 65 6c 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  Cell;..  assert(
14460 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 31 20   pNode->nRef==1 
14470 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  );..  /* Remove 
14480 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65  the entry in the
14490 20 70 61 72 65 6e 74 20 63 65 6c 6c 2e 20 2a 2f   parent cell. */
144a0 0a 20 20 72 63 20 3d 20 6e 6f 64 65 50 61 72 65  .  rc = nodePare
144b0 6e 74 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20  ntIndex(pRtree, 
144c0 70 4e 6f 64 65 2c 20 26 69 43 65 6c 6c 29 3b 0a  pNode, &iCell);.
144d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
144e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 65  _OK ){.    pPare
144f0 6e 74 20 3d 20 70 4e 6f 64 65 2d 3e 70 50 61 72  nt = pNode->pPar
14500 65 6e 74 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  ent;.    pNode->
14510 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20  pParent = 0;.   
14520 20 72 63 20 3d 20 64 65 6c 65 74 65 43 65 6c 6c   rc = deleteCell
14530 28 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74  (pRtree, pParent
14540 2c 20 69 43 65 6c 6c 2c 20 69 48 65 69 67 68 74  , iCell, iHeight
14550 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 63 32 20 3d  +1);.  }.  rc2 =
14560 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
14570 72 65 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  ree, pParent);. 
14580 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14590 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  OK ){.    rc = r
145a0 63 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  c2;.  }.  if( rc
145b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
145c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
145d0 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  }..  /* Remove t
145e0 68 65 20 78 78 78 5f 6e 6f 64 65 20 65 6e 74 72  he xxx_node entr
145f0 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  y. */.  sqlite3_
14600 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65  bind_int64(pRtre
14610 65 2d 3e 70 44 65 6c 65 74 65 4e 6f 64 65 2c 20  e->pDeleteNode, 
14620 31 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29  1, pNode->iNode)
14630 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
14640 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65  (pRtree->pDelete
14650 4e 6f 64 65 29 3b 0a 20 20 69 66 28 20 53 51 4c  Node);.  if( SQL
14660 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
14670 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 74 72  lite3_reset(pRtr
14680 65 65 2d 3e 70 44 65 6c 65 74 65 4e 6f 64 65 29  ee->pDeleteNode)
14690 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
146a0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  rc;.  }..  /* Re
146b0 6d 6f 76 65 20 74 68 65 20 78 78 78 5f 70 61 72  move the xxx_par
146c0 65 6e 74 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20  ent entry. */.  
146d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
146e0 36 34 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65  64(pRtree->pDele
146f0 74 65 50 61 72 65 6e 74 2c 20 31 2c 20 70 4e 6f  teParent, 1, pNo
14700 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 73 71  de->iNode);.  sq
14710 6c 69 74 65 33 5f 73 74 65 70 28 70 52 74 72 65  lite3_step(pRtre
14720 65 2d 3e 70 44 65 6c 65 74 65 50 61 72 65 6e 74  e->pDeleteParent
14730 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
14740 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
14750 33 5f 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e  3_reset(pRtree->
14760 70 44 65 6c 65 74 65 50 61 72 65 6e 74 29 29 20  pDeleteParent)) 
14770 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
14780 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 52 65  ;.  }.  .  /* Re
14790 6d 6f 76 65 20 74 68 65 20 6e 6f 64 65 20 66 72  move the node fr
147a0 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  om the in-memory
147b0 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
147c0 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 0a 20 20 2a  link it into.  *
147d0 2a 20 74 68 65 20 52 74 72 65 65 2e 70 44 65 6c  * the Rtree.pDel
147e0 65 74 65 64 20 6c 69 73 74 2e 20 49 74 73 20 63  eted list. Its c
147f0 6f 6e 74 65 6e 74 73 20 77 69 6c 6c 20 62 65 20  ontents will be 
14800 72 65 2d 69 6e 73 65 72 74 65 64 20 6c 61 74 65  re-inserted late
14810 72 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 64  r on..  */.  nod
14820 65 48 61 73 68 44 65 6c 65 74 65 28 70 52 74 72  eHashDelete(pRtr
14830 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 70 4e  ee, pNode);.  pN
14840 6f 64 65 2d 3e 69 4e 6f 64 65 20 3d 20 69 48 65  ode->iNode = iHe
14850 69 67 68 74 3b 0a 20 20 70 4e 6f 64 65 2d 3e 70  ight;.  pNode->p
14860 4e 65 78 74 20 3d 20 70 52 74 72 65 65 2d 3e 70  Next = pRtree->p
14870 44 65 6c 65 74 65 64 3b 0a 20 20 70 4e 6f 64 65  Deleted;.  pNode
14880 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 52 74 72  ->nRef++;.  pRtr
14890 65 65 2d 3e 70 44 65 6c 65 74 65 64 20 3d 20 70  ee->pDeleted = p
148a0 4e 6f 64 65 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Node;..  return 
148b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
148c0 61 74 69 63 20 69 6e 74 20 66 69 78 42 6f 75 6e  atic int fixBoun
148d0 64 69 6e 67 42 6f 78 28 52 74 72 65 65 20 2a 70  dingBox(Rtree *p
148e0 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65  Rtree, RtreeNode
148f0 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 52 74 72 65   *pNode){.  Rtre
14900 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 20 3d  eNode *pParent =
14910 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3b   pNode->pParent;
14920 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14930 54 45 5f 4f 4b 3b 20 0a 20 20 69 66 28 20 70 50  TE_OK; .  if( pP
14940 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  arent ){.    int
14950 20 69 69 3b 20 0a 20 20 20 20 69 6e 74 20 6e 43   ii; .    int nC
14960 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64  ell = NCELL(pNod
14970 65 29 3b 0a 20 20 20 20 52 74 72 65 65 43 65 6c  e);.    RtreeCel
14980 6c 20 62 6f 78 3b 20 20 20 20 20 20 20 20 20 20  l box;          
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149a0 20 20 2f 2a 20 42 6f 75 6e 64 69 6e 67 20 62 6f    /* Bounding bo
149b0 78 20 66 6f 72 20 70 4e 6f 64 65 20 2a 2f 0a 20  x for pNode */. 
149c0 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70     nodeGetCell(p
149d0 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 30 2c  Rtree, pNode, 0,
149e0 20 26 62 6f 78 29 3b 0a 20 20 20 20 66 6f 72 28   &box);.    for(
149f0 69 69 3d 31 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20  ii=1; ii<nCell; 
14a00 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 52 74 72  ii++){.      Rtr
14a10 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20  eeCell cell;.   
14a20 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70     nodeGetCell(p
14a30 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69 69  Rtree, pNode, ii
14a40 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , &cell);.      
14a50 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65  cellUnion(pRtree
14a60 2c 20 26 62 6f 78 2c 20 26 63 65 6c 6c 29 3b 0a  , &box, &cell);.
14a70 20 20 20 20 7d 0a 20 20 20 20 62 6f 78 2e 69 52      }.    box.iR
14a80 6f 77 69 64 20 3d 20 70 4e 6f 64 65 2d 3e 69 4e  owid = pNode->iN
14a90 6f 64 65 3b 0a 20 20 20 20 72 63 20 3d 20 6e 6f  ode;.    rc = no
14aa0 64 65 50 61 72 65 6e 74 49 6e 64 65 78 28 70 52  deParentIndex(pR
14ab0 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 26 69 69  tree, pNode, &ii
14ac0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
14ad0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14ae0 20 20 6e 6f 64 65 4f 76 65 72 77 72 69 74 65 43    nodeOverwriteC
14af0 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 50 61 72  ell(pRtree, pPar
14b00 65 6e 74 2c 20 26 62 6f 78 2c 20 69 69 29 3b 0a  ent, &box, ii);.
14b10 20 20 20 20 20 20 72 63 20 3d 20 66 69 78 42 6f        rc = fixBo
14b20 75 6e 64 69 6e 67 42 6f 78 28 70 52 74 72 65 65  undingBox(pRtree
14b30 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , pParent);.    
14b40 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
14b50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
14b60 74 65 20 74 68 65 20 63 65 6c 6c 20 61 74 20 69  te the cell at i
14b70 6e 64 65 78 20 69 43 65 6c 6c 20 6f 66 20 6e 6f  ndex iCell of no
14b80 64 65 20 70 4e 6f 64 65 2e 20 41 66 74 65 72 20  de pNode. After 
14b90 72 65 6d 6f 76 69 6e 67 20 74 68 65 0a 2a 2a 20  removing the.** 
14ba0 63 65 6c 6c 2c 20 61 64 6a 75 73 74 20 74 68 65  cell, adjust the
14bb0 20 72 2d 74 72 65 65 20 64 61 74 61 20 73 74 72   r-tree data str
14bc0 75 63 74 75 72 65 20 69 66 20 72 65 71 75 69 72  ucture if requir
14bd0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14be0 74 20 64 65 6c 65 74 65 43 65 6c 6c 28 52 74 72  t deleteCell(Rtr
14bf0 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65  ee *pRtree, Rtre
14c00 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 69 6e  eNode *pNode, in
14c10 74 20 69 43 65 6c 6c 2c 20 69 6e 74 20 69 48 65  t iCell, int iHe
14c20 69 67 68 74 29 7b 0a 20 20 52 74 72 65 65 4e 6f  ight){.  RtreeNo
14c30 64 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 69  de *pParent;.  i
14c40 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 53 51  nt rc;..  if( SQ
14c50 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66  LITE_OK!=(rc = f
14c60 69 78 4c 65 61 66 50 61 72 65 6e 74 28 70 52 74  ixLeafParent(pRt
14c70 72 65 65 2c 20 70 4e 6f 64 65 29 29 20 29 7b 0a  ree, pNode)) ){.
14c80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14c90 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
14ca0 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68  the cell from th
14cb0 65 20 6e 6f 64 65 2e 20 54 68 69 73 20 63 61 6c  e node. This cal
14cc0 6c 20 6a 75 73 74 20 6d 6f 76 65 73 20 62 79 74  l just moves byt
14cd0 65 73 20 61 72 6f 75 6e 64 0a 20 20 2a 2a 20 74  es around.  ** t
14ce0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6e 6f 64  he in-memory nod
14cf0 65 20 69 6d 61 67 65 2c 20 73 6f 20 69 74 20 63  e image, so it c
14d00 61 6e 6e 6f 74 20 66 61 69 6c 2e 0a 20 20 2a 2f  annot fail..  */
14d10 0a 20 20 6e 6f 64 65 44 65 6c 65 74 65 43 65 6c  .  nodeDeleteCel
14d20 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c  l(pRtree, pNode,
14d30 20 69 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 49   iCell);..  /* I
14d40 66 20 74 68 65 20 6e 6f 64 65 20 69 73 20 6e 6f  f the node is no
14d50 74 20 74 68 65 20 74 72 65 65 20 72 6f 6f 74 20  t the tree root 
14d60 61 6e 64 20 6e 6f 77 20 68 61 73 20 6c 65 73 73  and now has less
14d70 20 74 68 61 6e 20 74 68 65 20 6d 69 6e 69 6d 75   than the minimu
14d80 6d 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  m.  ** number of
14d90 20 63 65 6c 6c 73 2c 20 72 65 6d 6f 76 65 20 69   cells, remove i
14da0 74 20 66 72 6f 6d 20 74 68 65 20 74 72 65 65 2e  t from the tree.
14db0 20 4f 74 68 65 72 77 69 73 65 2c 20 75 70 64 61   Otherwise, upda
14dc0 74 65 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  te the.  ** cell
14dd0 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 6e   in the parent n
14de0 6f 64 65 20 73 6f 20 74 68 61 74 20 69 74 20 74  ode so that it t
14df0 69 67 68 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20  ightly contains 
14e00 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  the updated.  **
14e10 20 6e 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 70 50   node..  */.  pP
14e20 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65 2d 3e 70  arent = pNode->p
14e30 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74  Parent;.  assert
14e40 28 20 70 50 61 72 65 6e 74 20 7c 7c 20 70 4e 6f  ( pParent || pNo
14e50 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29 3b 0a  de->iNode==1 );.
14e60 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b    if( pParent ){
14e70 0a 20 20 20 20 69 66 28 20 4e 43 45 4c 4c 28 70  .    if( NCELL(p
14e80 4e 6f 64 65 29 3c 52 54 52 45 45 5f 4d 49 4e 43  Node)<RTREE_MINC
14e90 45 4c 4c 53 28 70 52 74 72 65 65 29 20 29 7b 0a  ELLS(pRtree) ){.
14ea0 20 20 20 20 20 20 72 63 20 3d 20 72 65 6d 6f 76        rc = remov
14eb0 65 4e 6f 64 65 28 70 52 74 72 65 65 2c 20 70 4e  eNode(pRtree, pN
14ec0 6f 64 65 2c 20 69 48 65 69 67 68 74 29 3b 0a 20  ode, iHeight);. 
14ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14ee0 72 63 20 3d 20 66 69 78 42 6f 75 6e 64 69 6e 67  rc = fixBounding
14ef0 42 6f 78 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  Box(pRtree, pNod
14f00 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
14f10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
14f20 74 61 74 69 63 20 69 6e 74 20 52 65 69 6e 73 65  tatic int Reinse
14f30 72 74 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74  rt(.  Rtree *pRt
14f40 72 65 65 2c 20 0a 20 20 52 74 72 65 65 4e 6f 64  ree, .  RtreeNod
14f50 65 20 2a 70 4e 6f 64 65 2c 20 0a 20 20 52 74 72  e *pNode, .  Rtr
14f60 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 20 0a  eeCell *pCell, .
14f70 20 20 69 6e 74 20 69 48 65 69 67 68 74 0a 29 7b    int iHeight.){
14f80 0a 20 20 69 6e 74 20 2a 61 4f 72 64 65 72 3b 0a  .  int *aOrder;.
14f90 20 20 69 6e 74 20 2a 61 53 70 61 72 65 3b 0a 20    int *aSpare;. 
14fa0 20 52 74 72 65 65 43 65 6c 6c 20 2a 61 43 65 6c   RtreeCell *aCel
14fb0 6c 3b 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65  l;.  RtreeDValue
14fc0 20 2a 61 44 69 73 74 61 6e 63 65 3b 0a 20 20 69   *aDistance;.  i
14fd0 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 52 74 72 65  nt nCell;.  Rtre
14fe0 65 44 56 61 6c 75 65 20 61 43 65 6e 74 65 72 43  eDValue aCenterC
14ff0 6f 6f 72 64 5b 52 54 52 45 45 5f 4d 41 58 5f 44  oord[RTREE_MAX_D
15000 49 4d 45 4e 53 49 4f 4e 53 5d 3b 0a 20 20 69 6e  IMENSIONS];.  in
15010 74 20 69 44 69 6d 3b 0a 20 20 69 6e 74 20 69 69  t iDim;.  int ii
15020 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
15030 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 3b  ITE_OK;.  int n;
15040 0a 0a 20 20 6d 65 6d 73 65 74 28 61 43 65 6e 74  ..  memset(aCent
15050 65 72 43 6f 6f 72 64 2c 20 30 2c 20 73 69 7a 65  erCoord, 0, size
15060 6f 66 28 52 74 72 65 65 44 56 61 6c 75 65 29 2a  of(RtreeDValue)*
15070 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53  RTREE_MAX_DIMENS
15080 49 4f 4e 53 29 3b 0a 0a 20 20 6e 43 65 6c 6c 20  IONS);..  nCell 
15090 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 2b 31  = NCELL(pNode)+1
150a0 3b 0a 20 20 6e 20 3d 20 28 6e 43 65 6c 6c 2b 31  ;.  n = (nCell+1
150b0 29 26 28 7e 31 29 3b 0a 0a 20 20 2f 2a 20 41 6c  )&(~1);..  /* Al
150c0 6c 6f 63 61 74 65 20 74 68 65 20 62 75 66 66 65  locate the buffe
150d0 72 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20  rs used by this 
150e0 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 61  operation. The a
150f0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 0a 20 20 2a  llocation is.  *
15100 2a 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 62  * relinquished b
15110 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
15120 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  ion returns..  *
15130 2f 0a 20 20 61 43 65 6c 6c 20 3d 20 28 52 74 72  /.  aCell = (Rtr
15140 65 65 43 65 6c 6c 20 2a 29 73 71 6c 69 74 65 33  eeCell *)sqlite3
15150 5f 6d 61 6c 6c 6f 63 36 34 28 6e 20 2a 20 28 0a  _malloc64(n * (.
15160 20 20 20 20 73 69 7a 65 6f 66 28 52 74 72 65 65      sizeof(Rtree
15170 43 65 6c 6c 29 20 20 20 20 20 2b 20 20 20 20 20  Cell)     +     
15180 20 20 20 20 2f 2a 20 61 43 65 6c 6c 20 61 72 72      /* aCell arr
15190 61 79 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  ay */.    sizeof
151a0 28 69 6e 74 29 20 20 20 20 20 20 20 20 20 20 20  (int)           
151b0 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4f 72  +         /* aOr
151c0 64 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  der array */.   
151d0 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20 20   sizeof(int)    
151e0 20 20 20 20 20 20 20 2b 20 20 20 20 20 20 20 20         +        
151f0 20 2f 2a 20 61 53 70 61 72 65 20 61 72 72 61 79   /* aSpare array
15200 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 52   */.    sizeof(R
15210 74 72 65 65 44 56 61 6c 75 65 29 20 20 20 20 20  treeDValue)     
15220 20 20 20 20 20 20 20 20 2f 2a 20 61 44 69 73 74          /* aDist
15230 61 6e 63 65 20 61 72 72 61 79 20 2a 2f 0a 20 20  ance array */.  
15240 29 29 3b 0a 20 20 69 66 28 20 21 61 43 65 6c 6c  ));.  if( !aCell
15250 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15260 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
15270 0a 20 20 61 4f 72 64 65 72 20 20 20 20 3d 20 28  .  aOrder    = (
15280 69 6e 74 20 2a 29 26 61 43 65 6c 6c 5b 6e 5d 3b  int *)&aCell[n];
15290 0a 20 20 61 53 70 61 72 65 20 20 20 20 3d 20 28  .  aSpare    = (
152a0 69 6e 74 20 2a 29 26 61 4f 72 64 65 72 5b 6e 5d  int *)&aOrder[n]
152b0 3b 0a 20 20 61 44 69 73 74 61 6e 63 65 20 3d 20  ;.  aDistance = 
152c0 28 52 74 72 65 65 44 56 61 6c 75 65 20 2a 29 26  (RtreeDValue *)&
152d0 61 53 70 61 72 65 5b 6e 5d 3b 0a 0a 20 20 66 6f  aSpare[n];..  fo
152e0 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c  r(ii=0; ii<nCell
152f0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
15300 20 69 69 3d 3d 28 6e 43 65 6c 6c 2d 31 29 20 29   ii==(nCell-1) )
15310 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
15320 61 43 65 6c 6c 5b 69 69 5d 2c 20 70 43 65 6c 6c  aCell[ii], pCell
15330 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65  , sizeof(RtreeCe
15340 6c 6c 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ll));.    }else{
15350 0a 20 20 20 20 20 20 6e 6f 64 65 47 65 74 43 65  .      nodeGetCe
15360 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  ll(pRtree, pNode
15370 2c 20 69 69 2c 20 26 61 43 65 6c 6c 5b 69 69 5d  , ii, &aCell[ii]
15380 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 4f 72  );.    }.    aOr
15390 64 65 72 5b 69 69 5d 20 3d 20 69 69 3b 0a 20 20  der[ii] = ii;.  
153a0 20 20 66 6f 72 28 69 44 69 6d 3d 30 3b 20 69 44    for(iDim=0; iD
153b0 69 6d 3c 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3b  im<pRtree->nDim;
153c0 20 69 44 69 6d 2b 2b 29 7b 0a 20 20 20 20 20 20   iDim++){.      
153d0 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69  aCenterCoord[iDi
153e0 6d 5d 20 2b 3d 20 44 43 4f 4f 52 44 28 61 43 65  m] += DCOORD(aCe
153f0 6c 6c 5b 69 69 5d 2e 61 43 6f 6f 72 64 5b 69 44  ll[ii].aCoord[iD
15400 69 6d 2a 32 5d 29 3b 0a 20 20 20 20 20 20 61 43  im*2]);.      aC
15410 65 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d  enterCoord[iDim]
15420 20 2b 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c   += DCOORD(aCell
15430 5b 69 69 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d  [ii].aCoord[iDim
15440 2a 32 2b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  *2+1]);.    }.  
15450 7d 0a 20 20 66 6f 72 28 69 44 69 6d 3d 30 3b 20  }.  for(iDim=0; 
15460 69 44 69 6d 3c 70 52 74 72 65 65 2d 3e 6e 44 69  iDim<pRtree->nDi
15470 6d 3b 20 69 44 69 6d 2b 2b 29 7b 0a 20 20 20 20  m; iDim++){.    
15480 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69  aCenterCoord[iDi
15490 6d 5d 20 3d 20 28 61 43 65 6e 74 65 72 43 6f 6f  m] = (aCenterCoo
154a0 72 64 5b 69 44 69 6d 5d 2f 28 6e 43 65 6c 6c 2a  rd[iDim]/(nCell*
154b0 28 52 74 72 65 65 44 56 61 6c 75 65 29 32 29 29  (RtreeDValue)2))
154c0 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 69 3d  ;.  }..  for(ii=
154d0 30 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b  0; ii<nCell; ii+
154e0 2b 29 7b 0a 20 20 20 20 61 44 69 73 74 61 6e 63  +){.    aDistanc
154f0 65 5b 69 69 5d 20 3d 20 52 54 52 45 45 5f 5a 45  e[ii] = RTREE_ZE
15500 52 4f 3b 0a 20 20 20 20 66 6f 72 28 69 44 69 6d  RO;.    for(iDim
15510 3d 30 3b 20 69 44 69 6d 3c 70 52 74 72 65 65 2d  =0; iDim<pRtree-
15520 3e 6e 44 69 6d 3b 20 69 44 69 6d 2b 2b 29 7b 0a  >nDim; iDim++){.
15530 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75        RtreeDValu
15540 65 20 63 6f 6f 72 64 20 3d 20 28 44 43 4f 4f 52  e coord = (DCOOR
15550 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f  D(aCell[ii].aCoo
15560 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 29 20 2d 20  rd[iDim*2+1]) - 
15570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d  DCOORD(aCell[ii]
155a0 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 29  .aCoord[iDim*2])
155b0 29 3b 0a 20 20 20 20 20 20 61 44 69 73 74 61 6e  );.      aDistan
155c0 63 65 5b 69 69 5d 20 2b 3d 20 28 63 6f 6f 72 64  ce[ii] += (coord
155d0 2d 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 69 44  -aCenterCoord[iD
155e0 69 6d 5d 29 2a 28 63 6f 6f 72 64 2d 61 43 65 6e  im])*(coord-aCen
155f0 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d 29 3b  terCoord[iDim]);
15600 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 53 6f  .    }.  }..  So
15610 72 74 42 79 44 69 73 74 61 6e 63 65 28 61 4f 72  rtByDistance(aOr
15620 64 65 72 2c 20 6e 43 65 6c 6c 2c 20 61 44 69 73  der, nCell, aDis
15630 74 61 6e 63 65 2c 20 61 53 70 61 72 65 29 3b 0a  tance, aSpare);.
15640 20 20 6e 6f 64 65 5a 65 72 6f 28 70 52 74 72 65    nodeZero(pRtre
15650 65 2c 20 70 4e 6f 64 65 29 3b 0a 0a 20 20 66 6f  e, pNode);..  fo
15660 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
15670 54 45 5f 4f 4b 20 26 26 20 69 69 3c 28 6e 43 65  TE_OK && ii<(nCe
15680 6c 6c 2d 28 52 54 52 45 45 5f 4d 49 4e 43 45 4c  ll-(RTREE_MINCEL
15690 4c 53 28 70 52 74 72 65 65 29 2b 31 29 29 3b 20  LS(pRtree)+1)); 
156a0 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65  ii++){.    Rtree
156b0 43 65 6c 6c 20 2a 70 20 3d 20 26 61 43 65 6c 6c  Cell *p = &aCell
156c0 5b 61 4f 72 64 65 72 5b 69 69 5d 5d 3b 0a 20 20  [aOrder[ii]];.  
156d0 20 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c    nodeInsertCell
156e0 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
156f0 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  p);.    if( p->i
15700 52 6f 77 69 64 3d 3d 70 43 65 6c 6c 2d 3e 69 52  Rowid==pCell->iR
15710 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 69 66  owid ){.      if
15720 28 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a  ( iHeight==0 ){.
15730 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 6f 77          rc = row
15740 69 64 57 72 69 74 65 28 70 52 74 72 65 65 2c 20  idWrite(pRtree, 
15750 70 2d 3e 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65  p->iRowid, pNode
15760 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  ->iNode);.      
15770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
15780 63 20 3d 20 70 61 72 65 6e 74 57 72 69 74 65 28  c = parentWrite(
15790 70 52 74 72 65 65 2c 20 70 2d 3e 69 52 6f 77 69  pRtree, p->iRowi
157a0 64 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29  d, pNode->iNode)
157b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
157c0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
157d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
157e0 63 20 3d 20 66 69 78 42 6f 75 6e 64 69 6e 67 42  c = fixBoundingB
157f0 6f 78 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  ox(pRtree, pNode
15800 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72  );.  }.  for(; r
15810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15820 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b  ii<nCell; ii++){
15830 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 6e  .    /* Find a n
15840 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 69  ode to store thi
15850 73 20 63 65 6c 6c 20 69 6e 2e 20 70 4e 6f 64 65  s cell in. pNode
15860 2d 3e 69 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c  ->iNode currentl
15870 79 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a  y contains.    *
15880 2a 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  * the height of 
15890 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65 61  the sub-tree hea
158a0 64 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 2e  ded by the cell.
158b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 52 74 72 65  .    */.    Rtre
158c0 65 4e 6f 64 65 20 2a 70 49 6e 73 65 72 74 3b 0a  eNode *pInsert;.
158d0 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70      RtreeCell *p
158e0 20 3d 20 26 61 43 65 6c 6c 5b 61 4f 72 64 65 72   = &aCell[aOrder
158f0 5b 69 69 5d 5d 3b 0a 20 20 20 20 72 63 20 3d 20  [ii]];.    rc = 
15900 43 68 6f 6f 73 65 4c 65 61 66 28 70 52 74 72 65  ChooseLeaf(pRtre
15910 65 2c 20 70 2c 20 69 48 65 69 67 68 74 2c 20 26  e, p, iHeight, &
15920 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 69 66  pInsert);.    if
15930 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15940 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
15950 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 74 72  ;.      rc = rtr
15960 65 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74  eeInsertCell(pRt
15970 72 65 65 2c 20 70 49 6e 73 65 72 74 2c 20 70 2c  ree, pInsert, p,
15980 20 69 48 65 69 67 68 74 29 3b 0a 20 20 20 20 20   iHeight);.     
15990 20 72 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61   rc2 = nodeRelea
159a0 73 65 28 70 52 74 72 65 65 2c 20 70 49 6e 73 65  se(pRtree, pInse
159b0 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rt);.      if( r
159c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
159d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
159e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
159f0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
15a00 72 65 65 28 61 43 65 6c 6c 29 3b 0a 20 20 72 65  ree(aCell);.  re
15a10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15a20 2a 20 49 6e 73 65 72 74 20 63 65 6c 6c 20 70 43  * Insert cell pC
15a30 65 6c 6c 20 69 6e 74 6f 20 6e 6f 64 65 20 70 4e  ell into node pN
15a40 6f 64 65 2e 20 4e 6f 64 65 20 70 4e 6f 64 65 20  ode. Node pNode 
15a50 69 73 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  is the head of a
15a60 20 0a 2a 2a 20 73 75 62 74 72 65 65 20 69 48 65   .** subtree iHe
15a70 69 67 68 74 20 68 69 67 68 20 28 6c 65 61 66 20  ight high (leaf 
15a80 6e 6f 64 65 73 20 68 61 76 65 20 69 48 65 69 67  nodes have iHeig
15a90 68 74 3d 3d 30 29 2e 0a 2a 2f 0a 73 74 61 74 69  ht==0)..*/.stati
15aa0 63 20 69 6e 74 20 72 74 72 65 65 49 6e 73 65 72  c int rtreeInser
15ab0 74 43 65 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a  tCell(.  Rtree *
15ac0 70 52 74 72 65 65 2c 0a 20 20 52 74 72 65 65 4e  pRtree,.  RtreeN
15ad0 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 52 74  ode *pNode,.  Rt
15ae0 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 0a  reeCell *pCell,.
15af0 20 20 69 6e 74 20 69 48 65 69 67 68 74 0a 29 7b    int iHeight.){
15b00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15b10 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 48 65  TE_OK;.  if( iHe
15b20 69 67 68 74 3e 30 20 29 7b 0a 20 20 20 20 52 74  ight>0 ){.    Rt
15b30 72 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20  reeNode *pChild 
15b40 3d 20 6e 6f 64 65 48 61 73 68 4c 6f 6f 6b 75 70  = nodeHashLookup
15b50 28 70 52 74 72 65 65 2c 20 70 43 65 6c 6c 2d 3e  (pRtree, pCell->
15b60 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  iRowid);.    if(
15b70 20 70 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   pChild ){.     
15b80 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
15b90 72 65 65 2c 20 70 43 68 69 6c 64 2d 3e 70 50 61  ree, pChild->pPa
15ba0 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 6e 6f 64  rent);.      nod
15bb0 65 52 65 66 65 72 65 6e 63 65 28 70 4e 6f 64 65  eReference(pNode
15bc0 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d  );.      pChild-
15bd0 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65  >pParent = pNode
15be0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
15bf0 28 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c  ( nodeInsertCell
15c00 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
15c10 70 43 65 6c 6c 29 20 29 7b 0a 20 20 20 20 69 66  pCell) ){.    if
15c20 28 20 69 48 65 69 67 68 74 3c 3d 70 52 74 72 65  ( iHeight<=pRtre
15c30 65 2d 3e 69 52 65 69 6e 73 65 72 74 48 65 69 67  e->iReinsertHeig
15c40 68 74 20 7c 7c 20 70 4e 6f 64 65 2d 3e 69 4e 6f  ht || pNode->iNo
15c50 64 65 3d 3d 31 29 7b 0a 20 20 20 20 20 20 72 63  de==1){.      rc
15c60 20 3d 20 53 70 6c 69 74 4e 6f 64 65 28 70 52 74   = SplitNode(pRt
15c70 72 65 65 2c 20 70 4e 6f 64 65 2c 20 70 43 65 6c  ree, pNode, pCel
15c80 6c 2c 20 69 48 65 69 67 68 74 29 3b 0a 20 20 20  l, iHeight);.   
15c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52   }else{.      pR
15ca0 74 72 65 65 2d 3e 69 52 65 69 6e 73 65 72 74 48  tree->iReinsertH
15cb0 65 69 67 68 74 20 3d 20 69 48 65 69 67 68 74 3b  eight = iHeight;
15cc0 0a 20 20 20 20 20 20 72 63 20 3d 20 52 65 69 6e  .      rc = Rein
15cd0 73 65 72 74 28 70 52 74 72 65 65 2c 20 70 4e 6f  sert(pRtree, pNo
15ce0 64 65 2c 20 70 43 65 6c 6c 2c 20 69 48 65 69 67  de, pCell, iHeig
15cf0 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ht);.    }.  }el
15d00 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 41 64 6a  se{.    rc = Adj
15d10 75 73 74 54 72 65 65 28 70 52 74 72 65 65 2c 20  ustTree(pRtree, 
15d20 70 4e 6f 64 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pNode, pCell);. 
15d30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15d40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
15d50 28 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a  ( iHeight==0 ){.
15d60 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 6f 77          rc = row
15d70 69 64 57 72 69 74 65 28 70 52 74 72 65 65 2c 20  idWrite(pRtree, 
15d80 70 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 2c 20 70  pCell->iRowid, p
15d90 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20  Node->iNode);.  
15da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15db0 20 20 20 72 63 20 3d 20 70 61 72 65 6e 74 57 72     rc = parentWr
15dc0 69 74 65 28 70 52 74 72 65 65 2c 20 70 43 65 6c  ite(pRtree, pCel
15dd0 6c 2d 3e 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65  l->iRowid, pNode
15de0 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  ->iNode);.      
15df0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
15e00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
15e10 69 63 20 69 6e 74 20 72 65 69 6e 73 65 72 74 4e  ic int reinsertN
15e20 6f 64 65 43 6f 6e 74 65 6e 74 28 52 74 72 65 65  odeContent(Rtree
15e30 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e   *pRtree, RtreeN
15e40 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69  ode *pNode){.  i
15e50 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 20  nt ii;.  int rc 
15e60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
15e70 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c  nt nCell = NCELL
15e80 28 70 4e 6f 64 65 29 3b 0a 0a 20 20 66 6f 72 28  (pNode);..  for(
15e90 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
15ea0 5f 4f 4b 20 26 26 20 69 69 3c 6e 43 65 6c 6c 3b  _OK && ii<nCell;
15eb0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65   ii++){.    Rtre
15ec0 65 4e 6f 64 65 20 2a 70 49 6e 73 65 72 74 3b 0a  eNode *pInsert;.
15ed0 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65      RtreeCell ce
15ee0 6c 6c 3b 0a 20 20 20 20 6e 6f 64 65 47 65 74 43  ll;.    nodeGetC
15ef0 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ell(pRtree, pNod
15f00 65 2c 20 69 69 2c 20 26 63 65 6c 6c 29 3b 0a 0a  e, ii, &cell);..
15f10 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 6e 6f      /* Find a no
15f20 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 69 73  de to store this
15f30 20 63 65 6c 6c 20 69 6e 2e 20 70 4e 6f 64 65 2d   cell in. pNode-
15f40 3e 69 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  >iNode currently
15f50 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a   contains.    **
15f60 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74   the height of t
15f70 68 65 20 73 75 62 2d 74 72 65 65 20 68 65 61 64  he sub-tree head
15f80 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 2e 0a  ed by the cell..
15f90 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
15fa0 43 68 6f 6f 73 65 4c 65 61 66 28 70 52 74 72 65  ChooseLeaf(pRtre
15fb0 65 2c 20 26 63 65 6c 6c 2c 20 28 69 6e 74 29 70  e, &cell, (int)p
15fc0 4e 6f 64 65 2d 3e 69 4e 6f 64 65 2c 20 26 70 49  Node->iNode, &pI
15fd0 6e 73 65 72 74 29 3b 0a 20 20 20 20 69 66 28 20  nsert);.    if( 
15fe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15ff0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  .      int rc2;.
16000 20 20 20 20 20 20 72 63 20 3d 20 72 74 72 65 65        rc = rtree
16010 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65  InsertCell(pRtre
16020 65 2c 20 70 49 6e 73 65 72 74 2c 20 26 63 65 6c  e, pInsert, &cel
16030 6c 2c 20 28 69 6e 74 29 70 4e 6f 64 65 2d 3e 69  l, (int)pNode->i
16040 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 72 63 32  Node);.      rc2
16050 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70   = nodeRelease(p
16060 52 74 72 65 65 2c 20 70 49 6e 73 65 72 74 29 3b  Rtree, pInsert);
16070 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
16080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16090 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
160a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
160b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
160c0 2f 2a 0a 2a 2a 20 53 65 6c 65 63 74 20 61 20 63  /*.** Select a c
160d0 75 72 72 65 6e 74 6c 79 20 75 6e 75 73 65 64 20  urrently unused 
160e0 72 6f 77 69 64 20 66 6f 72 20 61 20 6e 65 77 20  rowid for a new 
160f0 72 2d 74 72 65 65 20 72 65 63 6f 72 64 2e 0a 2a  r-tree record..*
16100 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
16110 65 65 4e 65 77 52 6f 77 69 64 28 52 74 72 65 65  eeNewRowid(Rtree
16120 20 2a 70 52 74 72 65 65 2c 20 69 36 34 20 2a 70   *pRtree, i64 *p
16130 69 52 6f 77 69 64 29 7b 0a 20 20 69 6e 74 20 72  iRowid){.  int r
16140 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  c;.  sqlite3_bin
16150 64 5f 6e 75 6c 6c 28 70 52 74 72 65 65 2d 3e 70  d_null(pRtree->p
16160 57 72 69 74 65 52 6f 77 69 64 2c 20 31 29 3b 0a  WriteRowid, 1);.
16170 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
16180 75 6c 6c 28 70 52 74 72 65 65 2d 3e 70 57 72 69  ull(pRtree->pWri
16190 74 65 52 6f 77 69 64 2c 20 32 29 3b 0a 20 20 73  teRowid, 2);.  s
161a0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52 74 72  qlite3_step(pRtr
161b0 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 29  ee->pWriteRowid)
161c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
161d0 5f 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70  _reset(pRtree->p
161e0 57 72 69 74 65 52 6f 77 69 64 29 3b 0a 20 20 2a  WriteRowid);.  *
161f0 70 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  piRowid = sqlite
16200 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
16210 77 69 64 28 70 52 74 72 65 65 2d 3e 64 62 29 3b  wid(pRtree->db);
16220 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16230 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
16240 65 20 65 6e 74 72 79 20 77 69 74 68 20 72 6f 77  e entry with row
16250 69 64 3d 69 44 65 6c 65 74 65 20 66 72 6f 6d 20  id=iDelete from 
16260 74 68 65 20 72 2d 74 72 65 65 20 73 74 72 75 63  the r-tree struc
16270 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
16280 69 6e 74 20 72 74 72 65 65 44 65 6c 65 74 65 52  int rtreeDeleteR
16290 6f 77 69 64 28 52 74 72 65 65 20 2a 70 52 74 72  owid(Rtree *pRtr
162a0 65 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ee, sqlite3_int6
162b0 34 20 69 44 65 6c 65 74 65 29 7b 0a 20 20 69 6e  4 iDelete){.  in
162c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
162e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
162f0 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65    RtreeNode *pLe
16300 61 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  af = 0;         
16310 20 20 2f 2a 20 4c 65 61 66 20 6e 6f 64 65 20 63    /* Leaf node c
16320 6f 6e 74 61 69 6e 69 6e 67 20 72 65 63 6f 72 64  ontaining record
16330 20 69 44 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e   iDelete */.  in
16340 74 20 69 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t iCell;        
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16360 20 49 6e 64 65 78 20 6f 66 20 69 44 65 6c 65 74   Index of iDelet
16370 65 20 63 65 6c 6c 20 69 6e 20 70 4c 65 61 66 20  e cell in pLeaf 
16380 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  */.  RtreeNode *
16390 70 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20  pRoot = 0;      
163a0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6e 6f 64       /* Root nod
163b0 65 20 6f 66 20 72 74 72 65 65 20 73 74 72 75 63  e of rtree struc
163c0 74 75 72 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 4f  ture */...  /* O
163d0 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
163e0 65 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6e 6f  e to the root no
163f0 64 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  de to initialize
16400 20 52 74 72 65 65 2e 69 44 65 70 74 68 20 2a 2f   Rtree.iDepth */
16410 0a 20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71 75  .  rc = nodeAcqu
16420 69 72 65 28 70 52 74 72 65 65 2c 20 31 2c 20 30  ire(pRtree, 1, 0
16430 2c 20 26 70 52 6f 6f 74 29 3b 0a 0a 20 20 2f 2a  , &pRoot);..  /*
16440 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65   Obtain a refere
16450 6e 63 65 20 74 6f 20 74 68 65 20 6c 65 61 66 20  nce to the leaf 
16460 6e 6f 64 65 20 74 68 61 74 20 63 6f 6e 74 61 69  node that contai
16470 6e 73 20 74 68 65 20 65 6e 74 72 79 20 0a 20 20  ns the entry .  
16480 2a 2a 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64  ** about to be d
16490 65 6c 65 74 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  eleted. .  */.  
164a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
164b0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 69  K ){.    rc = fi
164c0 6e 64 4c 65 61 66 4e 6f 64 65 28 70 52 74 72 65  ndLeafNode(pRtre
164d0 65 2c 20 69 44 65 6c 65 74 65 2c 20 26 70 4c 65  e, iDelete, &pLe
164e0 61 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 23 69 66  af, 0);.  }..#if
164f0 64 65 66 20 43 4f 52 52 55 50 54 5f 44 42 0a 20  def CORRUPT_DB. 
16500 20 61 73 73 65 72 74 28 20 70 4c 65 61 66 21 3d   assert( pLeaf!=
16510 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 || rc!=SQLITE_
16520 4f 4b 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  OK || CORRUPT_DB
16530 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
16540 20 44 65 6c 65 74 65 20 74 68 65 20 63 65 6c 6c   Delete the cell
16550 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 66 72 6f   in question fro
16560 6d 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 2e  m the leaf node.
16570 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
16580 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 65 61 66  LITE_OK && pLeaf
16590 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
165a0 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 6f  .    rc = nodeRo
165b0 77 69 64 49 6e 64 65 78 28 70 52 74 72 65 65 2c  widIndex(pRtree,
165c0 20 70 4c 65 61 66 2c 20 69 44 65 6c 65 74 65 2c   pLeaf, iDelete,
165d0 20 26 69 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66   &iCell);.    if
165e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
165f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65  ){.      rc = de
16600 6c 65 74 65 43 65 6c 6c 28 70 52 74 72 65 65 2c  leteCell(pRtree,
16610 20 70 4c 65 61 66 2c 20 69 43 65 6c 6c 2c 20 30   pLeaf, iCell, 0
16620 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32  );.    }.    rc2
16630 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70   = nodeRelease(p
16640 52 74 72 65 65 2c 20 70 4c 65 61 66 29 3b 0a 20  Rtree, pLeaf);. 
16650 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
16670 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20   = rc2;.    }.  
16680 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  }..  /* Delete t
16690 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
166a0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 3c 72   entry in the <r
166b0 74 72 65 65 3e 5f 72 6f 77 69 64 20 74 61 62 6c  tree>_rowid tabl
166c0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  e. */.  if( rc==
166d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
166e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
166f0 74 36 34 28 70 52 74 72 65 65 2d 3e 70 44 65 6c  t64(pRtree->pDel
16700 65 74 65 52 6f 77 69 64 2c 20 31 2c 20 69 44 65  eteRowid, 1, iDe
16710 6c 65 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  lete);.    sqlit
16720 65 33 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e  e3_step(pRtree->
16730 70 44 65 6c 65 74 65 52 6f 77 69 64 29 3b 0a 20  pDeleteRowid);. 
16740 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
16750 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 44  reset(pRtree->pD
16760 65 6c 65 74 65 52 6f 77 69 64 29 3b 0a 20 20 7d  eleteRowid);.  }
16770 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
16780 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6e 6f  the root node no
16790 77 20 68 61 73 20 65 78 61 63 74 6c 79 20 6f 6e  w has exactly on
167a0 65 20 63 68 69 6c 64 2e 20 49 66 20 73 6f 2c 20  e child. If so, 
167b0 72 65 6d 6f 76 65 0a 20 20 2a 2a 20 69 74 2c 20  remove.  ** it, 
167c0 73 63 68 65 64 75 6c 65 20 74 68 65 20 63 6f 6e  schedule the con
167d0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 68 69  tents of the chi
167e0 6c 64 20 66 6f 72 20 72 65 69 6e 73 65 72 74 69  ld for reinserti
167f0 6f 6e 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 64  on and .  ** red
16800 75 63 65 20 74 68 65 20 74 72 65 65 20 68 65 69  uce the tree hei
16810 67 68 74 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2a  ght by one..  **
16820 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71  .  ** This is eq
16830 75 69 76 61 6c 65 6e 74 20 74 6f 20 63 6f 70 79  uivalent to copy
16840 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
16850 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 69 6e   of the child in
16860 74 6f 0a 20 20 2a 2a 20 74 68 65 20 72 6f 6f 74  to.  ** the root
16870 20 6e 6f 64 65 20 28 74 68 65 20 6f 70 65 72 61   node (the opera
16880 74 69 6f 6e 20 74 68 61 74 20 47 75 74 6d 61 6e  tion that Gutman
16890 27 73 20 70 61 70 65 72 20 73 61 79 73 20 74 6f  's paper says to
168a0 20 70 65 72 66 6f 72 6d 20 0a 20 20 2a 2a 20 69   perform .  ** i
168b0 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 29  n this scenario)
168c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
168d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52  =SQLITE_OK && pR
168e0 74 72 65 65 2d 3e 69 44 65 70 74 68 3e 30 20 26  tree->iDepth>0 &
168f0 26 20 4e 43 45 4c 4c 28 70 52 6f 6f 74 29 3d 3d  & NCELL(pRoot)==
16900 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  1 ){.    int rc2
16910 3b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20  ;.    RtreeNode 
16920 2a 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20  *pChild = 0;.   
16930 20 69 36 34 20 69 43 68 69 6c 64 20 3d 20 6e 6f   i64 iChild = no
16940 64 65 47 65 74 52 6f 77 69 64 28 70 52 74 72 65  deGetRowid(pRtre
16950 65 2c 20 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  e, pRoot, 0);.  
16960 20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71 75 69    rc = nodeAcqui
16970 72 65 28 70 52 74 72 65 65 2c 20 69 43 68 69 6c  re(pRtree, iChil
16980 64 2c 20 70 52 6f 6f 74 2c 20 26 70 43 68 69 6c  d, pRoot, &pChil
16990 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
169a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
169b0 20 20 20 72 63 20 3d 20 72 65 6d 6f 76 65 4e 6f     rc = removeNo
169c0 64 65 28 70 52 74 72 65 65 2c 20 70 43 68 69 6c  de(pRtree, pChil
169d0 64 2c 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74  d, pRtree->iDept
169e0 68 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  h-1);.    }.    
169f0 72 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73  rc2 = nodeReleas
16a00 65 28 70 52 74 72 65 65 2c 20 70 43 68 69 6c 64  e(pRtree, pChild
16a10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
16a20 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
16a30 72 63 32 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  rc2;.    if( rc=
16a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16a50 20 20 20 20 70 52 74 72 65 65 2d 3e 69 44 65 70      pRtree->iDep
16a60 74 68 2d 2d 3b 0a 20 20 20 20 20 20 77 72 69 74  th--;.      writ
16a70 65 49 6e 74 31 36 28 70 52 6f 6f 74 2d 3e 7a 44  eInt16(pRoot->zD
16a80 61 74 61 2c 20 70 52 74 72 65 65 2d 3e 69 44 65  ata, pRtree->iDe
16a90 70 74 68 29 3b 0a 20 20 20 20 20 20 70 52 6f 6f  pth);.      pRoo
16aa0 74 2d 3e 69 73 44 69 72 74 79 20 3d 20 31 3b 0a  t->isDirty = 1;.
16ab0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16ac0 52 65 2d 69 6e 73 65 72 74 20 74 68 65 20 63 6f  Re-insert the co
16ad0 6e 74 65 6e 74 73 20 6f 66 20 61 6e 79 20 75 6e  ntents of any un
16ae0 64 65 72 66 75 6c 6c 20 6e 6f 64 65 73 20 72 65  derfull nodes re
16af0 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 74  moved from the t
16b00 72 65 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 4c  ree. */.  for(pL
16b10 65 61 66 3d 70 52 74 72 65 65 2d 3e 70 44 65 6c  eaf=pRtree->pDel
16b20 65 74 65 64 3b 20 70 4c 65 61 66 3b 20 70 4c 65  eted; pLeaf; pLe
16b30 61 66 3d 70 52 74 72 65 65 2d 3e 70 44 65 6c 65  af=pRtree->pDele
16b40 74 65 64 29 7b 0a 20 20 20 20 69 66 28 20 72 63  ted){.    if( rc
16b50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16b60 20 20 20 20 20 72 63 20 3d 20 72 65 69 6e 73 65       rc = reinse
16b70 72 74 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52  rtNodeContent(pR
16b80 74 72 65 65 2c 20 70 4c 65 61 66 29 3b 0a 20 20  tree, pLeaf);.  
16b90 20 20 7d 0a 20 20 20 20 70 52 74 72 65 65 2d 3e    }.    pRtree->
16ba0 70 44 65 6c 65 74 65 64 20 3d 20 70 4c 65 61 66  pDeleted = pLeaf
16bb0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 52 74  ->pNext;.    pRt
16bc0 72 65 65 2d 3e 6e 4e 6f 64 65 52 65 66 2d 2d 3b  ree->nNodeRef--;
16bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16be0 65 28 70 4c 65 61 66 29 3b 0a 20 20 7d 0a 0a 20  e(pLeaf);.  }.. 
16bf0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
16c00 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
16c10 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 2a 2f 0a 20   root node. */. 
16c20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16c30 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e  OK ){.    rc = n
16c40 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65  odeRelease(pRtre
16c50 65 2c 20 70 52 6f 6f 74 29 3b 0a 20 20 7d 65 6c  e, pRoot);.  }el
16c60 73 65 7b 0a 20 20 20 20 6e 6f 64 65 52 65 6c 65  se{.    nodeRele
16c70 61 73 65 28 70 52 74 72 65 65 2c 20 70 52 6f 6f  ase(pRtree, pRoo
16c80 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  t);.  }..  retur
16c90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
16ca0 6f 75 6e 64 69 6e 67 20 63 6f 6e 73 74 61 6e 74  ounding constant
16cb0 73 20 66 6f 72 20 66 6c 6f 61 74 2d 3e 64 6f 75  s for float->dou
16cc0 62 6c 65 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 0a  ble conversion..
16cd0 2a 2f 0a 23 64 65 66 69 6e 65 20 52 4e 44 54 4f  */.#define RNDTO
16ce0 57 41 52 44 53 20 20 28 31 2e 30 20 2d 20 31 2e  WARDS  (1.0 - 1.
16cf0 30 2f 38 33 38 38 36 30 38 2e 30 29 20 20 2f 2a  0/8388608.0)  /*
16d00 20 52 6f 75 6e 64 20 74 6f 77 61 72 64 73 20 7a   Round towards z
16d10 65 72 6f 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52  ero */.#define R
16d20 4e 44 41 57 41 59 20 20 20 20 20 28 31 2e 30 20  NDAWAY     (1.0 
16d30 2b 20 31 2e 30 2f 38 33 38 38 36 30 38 2e 30 29  + 1.0/8388608.0)
16d40 20 20 2f 2a 20 52 6f 75 6e 64 20 61 77 61 79 20    /* Round away 
16d50 66 72 6f 6d 20 7a 65 72 6f 20 2a 2f 0a 0a 23 69  from zero */..#i
16d60 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
16d70 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59  E_RTREE_INT_ONLY
16d80 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  )./*.** Convert 
16d90 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
16da0 20 69 6e 74 6f 20 61 6e 20 52 74 72 65 65 56 61   into an RtreeVa
16db0 6c 75 65 20 28 70 72 65 73 75 6d 61 62 6c 79 20  lue (presumably 
16dc0 61 20 66 6c 6f 61 74 29 0a 2a 2a 20 77 68 69 6c  a float).** whil
16dd0 65 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f  e taking care to
16de0 20 72 6f 75 6e 64 20 74 6f 77 61 72 64 20 6e 65   round toward ne
16df0 67 61 74 69 76 65 20 6f 72 20 70 6f 73 69 74 69  gative or positi
16e00 76 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  ve, respectively
16e10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74 72 65  ..*/.static Rtre
16e20 65 56 61 6c 75 65 20 72 74 72 65 65 56 61 6c 75  eValue rtreeValu
16e30 65 44 6f 77 6e 28 73 71 6c 69 74 65 33 5f 76 61  eDown(sqlite3_va
16e40 6c 75 65 20 2a 76 29 7b 0a 20 20 64 6f 75 62 6c  lue *v){.  doubl
16e50 65 20 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  e d = sqlite3_va
16e60 6c 75 65 5f 64 6f 75 62 6c 65 28 76 29 3b 0a 20  lue_double(v);. 
16e70 20 66 6c 6f 61 74 20 66 20 3d 20 28 66 6c 6f 61   float f = (floa
16e80 74 29 64 3b 0a 20 20 69 66 28 20 66 3e 64 20 29  t)d;.  if( f>d )
16e90 7b 0a 20 20 20 20 66 20 3d 20 28 66 6c 6f 61 74  {.    f = (float
16ea0 29 28 64 2a 28 64 3c 30 20 3f 20 52 4e 44 41 57  )(d*(d<0 ? RNDAW
16eb0 41 59 20 3a 20 52 4e 44 54 4f 57 41 52 44 53 29  AY : RNDTOWARDS)
16ec0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16ed0 66 3b 0a 7d 0a 73 74 61 74 69 63 20 52 74 72 65  f;.}.static Rtre
16ee0 65 56 61 6c 75 65 20 72 74 72 65 65 56 61 6c 75  eValue rtreeValu
16ef0 65 55 70 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  eUp(sqlite3_valu
16f00 65 20 2a 76 29 7b 0a 20 20 64 6f 75 62 6c 65 20  e *v){.  double 
16f10 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
16f20 65 5f 64 6f 75 62 6c 65 28 76 29 3b 0a 20 20 66  e_double(v);.  f
16f30 6c 6f 61 74 20 66 20 3d 20 28 66 6c 6f 61 74 29  loat f = (float)
16f40 64 3b 0a 20 20 69 66 28 20 66 3c 64 20 29 7b 0a  d;.  if( f<d ){.
16f50 20 20 20 20 66 20 3d 20 28 66 6c 6f 61 74 29 28      f = (float)(
16f60 64 2a 28 64 3c 30 20 3f 20 52 4e 44 54 4f 57 41  d*(d<0 ? RNDTOWA
16f70 52 44 53 20 3a 20 52 4e 44 41 57 41 59 29 29 3b  RDS : RNDAWAY));
16f80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b  .  }.  return f;
16f90 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
16fa0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 52 54 52  fined(SQLITE_RTR
16fb0 45 45 5f 49 4e 54 5f 4f 4e 4c 59 29 20 2a 2f 0a  EE_INT_ONLY) */.
16fc0 0a 2f 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74 72 61  ./*.** A constra
16fd0 69 6e 74 20 68 61 73 20 66 61 69 6c 65 64 20 77  int has failed w
16fe0 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 61  hile inserting a
16ff0 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 72 74 72   row into an rtr
17000 65 65 20 74 61 62 6c 65 2e 20 0a 2a 2a 20 41 73  ee table. .** As
17010 73 75 6d 69 6e 67 20 6e 6f 20 4f 4f 4d 20 65 72  suming no OOM er
17020 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
17030 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74   function sets t
17040 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
17050 20 0a 2a 2a 20 28 61 74 20 70 52 74 72 65 65 2d   .** (at pRtree-
17060 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 29 20 74  >base.zErrMsg) t
17070 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  o an appropriate
17080 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72   value and retur
17090 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  ns.** SQLITE_CON
170a0 53 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20 50  STRAINT..**.** P
170b0 61 72 61 6d 65 74 65 72 20 69 43 6f 6c 20 69 73  arameter iCol is
170c0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
170d0 65 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75 6d  e leftmost colum
170e0 6e 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  n involved in th
170f0 65 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20  e.** constraint 
17100 66 61 69 6c 75 72 65 2e 20 49 66 20 69 74 20 69  failure. If it i
17110 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  s 0, then the co
17120 6e 73 74 72 61 69 6e 74 20 74 68 61 74 20 66 61  nstraint that fa
17130 69 6c 65 64 20 69 73 0a 2a 2a 20 74 68 65 20 75  iled is.** the u
17140 6e 69 71 75 65 20 63 6f 6e 73 74 72 61 69 6e 74  nique constraint
17150 20 6f 6e 20 74 68 65 20 69 64 20 63 6f 6c 75 6d   on the id colum
17160 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  n. Otherwise, it
17170 20 69 73 20 74 68 65 20 72 74 72 65 65 0a 2a 2a   is the rtree.**
17180 20 28 63 31 3c 3d 63 32 29 20 63 6f 6e 73 74 72   (c1<=c2) constr
17190 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20  aint on columns 
171a0 69 43 6f 6c 20 61 6e 64 20 69 43 6f 6c 2b 31 20  iCol and iCol+1 
171b0 74 68 61 74 20 68 61 73 20 66 61 69 6c 65 64 2e  that has failed.
171c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
171d0 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
171e0 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
171f0 64 20 69 6e 73 74 65 61 64 20 6f 66 20 53 51 4c  d instead of SQL
17200 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 0a  ITE_CONSTRAINT..
17210 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74  */.static int rt
17220 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 45 72 72  reeConstraintErr
17230 6f 72 28 52 74 72 65 65 20 2a 70 52 74 72 65 65  or(Rtree *pRtree
17240 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 73  , int iCol){.  s
17250 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
17260 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  mt = 0;.  char *
17270 7a 53 71 6c 3b 20 0a 20 20 69 6e 74 20 72 63 3b  zSql; .  int rc;
17280 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ..  assert( iCol
17290 3d 3d 30 20 7c 7c 20 69 43 6f 6c 25 32 20 29 3b  ==0 || iCol%2 );
172a0 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
172b0 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
172c0 54 20 2a 20 46 52 4f 4d 20 25 51 2e 25 51 22 2c  T * FROM %Q.%Q",
172d0 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52   pRtree->zDb, pR
172e0 74 72 65 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  tree->zName);.  
172f0 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20  if( zSql ){.    
17300 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
17310 70 61 72 65 5f 76 32 28 70 52 74 72 65 65 2d 3e  pare_v2(pRtree->
17320 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
17330 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Stmt, 0);.  }els
17340 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
17350 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
17360 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
17370 6c 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  l);..  if( rc==S
17380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17390 69 66 28 20 69 43 6f 6c 3d 3d 30 20 29 7b 0a 20  if( iCol==0 ){. 
173a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
173b0 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zCol = sqlite3_
173c0 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
173d0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 52 74  t, 0);.      pRt
173e0 72 65 65 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73  ree->base.zErrMs
173f0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
17400 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
17410 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
17420 74 20 66 61 69 6c 65 64 3a 20 25 73 2e 25 73 22  t failed: %s.%s"
17430 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c  , pRtree->zName,
17440 20 7a 43 6f 6c 0a 20 20 20 20 20 20 29 3b 0a 20   zCol.      );. 
17450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17460 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
17470 31 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  1 = sqlite3_colu
17480 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  mn_name(pStmt, i
17490 43 6f 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  Col);.      cons
174a0 74 20 63 68 61 72 20 2a 7a 43 6f 6c 32 20 3d 20  t char *zCol2 = 
174b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
174c0 61 6d 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b  ame(pStmt, iCol+
174d0 31 29 3b 0a 20 20 20 20 20 20 70 52 74 72 65 65  1);.      pRtree
174e0 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d  ->base.zErrMsg =
174f0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
17500 28 0a 20 20 20 20 20 20 20 20 20 20 22 72 74 72  (.          "rtr
17510 65 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ee constraint fa
17520 69 6c 65 64 3a 20 25 73 2e 28 25 73 3c 3d 25 73  iled: %s.(%s<=%s
17530 29 22 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d  )", pRtree->zNam
17540 65 2c 20 7a 43 6f 6c 31 2c 20 7a 43 6f 6c 32 0a  e, zCol1, zCol2.
17550 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
17560 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   }..  sqlite3_fi
17570 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
17580 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
17590 49 54 45 5f 4f 4b 20 3f 20 53 51 4c 49 54 45 5f  ITE_OK ? SQLITE_
175a0 43 4f 4e 53 54 52 41 49 4e 54 20 3a 20 72 63 29  CONSTRAINT : rc)
175b0 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ;.}..../*.** The
175c0 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20   xUpdate method 
175d0 66 6f 72 20 72 74 72 65 65 20 6d 6f 64 75 6c 65  for rtree module
175e0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
175f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
17600 74 72 65 65 55 70 64 61 74 65 28 0a 20 20 73 71  treeUpdate(.  sq
17610 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
17620 62 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c  b, .  int nData,
17630 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
17640 65 20 2a 2a 61 44 61 74 61 2c 20 0a 20 20 73 71  e **aData, .  sq
17650 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
17660 69 64 0a 29 7b 0a 20 20 52 74 72 65 65 20 2a 70  id.){.  Rtree *p
17670 52 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a  Rtree = (Rtree *
17680 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  )pVtab;.  int rc
17690 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
176a0 52 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 20  RtreeCell cell; 
176b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176c0 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 74 6f 20 69  /* New cell to i
176d0 6e 73 65 72 74 20 69 66 20 6e 44 61 74 61 3e 31  nsert if nData>1
176e0 20 2a 2f 0a 20 20 69 6e 74 20 62 48 61 76 65 52   */.  int bHaveR
176f0 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  owid = 0;       
17700 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
17710 31 20 61 66 74 65 72 20 6e 65 77 20 72 6f 77 69  1 after new rowi
17720 64 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  d is determined 
17730 2a 2f 0a 0a 20 20 69 66 28 20 70 52 74 72 65 65  */..  if( pRtree
17740 2d 3e 6e 4e 6f 64 65 52 65 66 20 29 7b 0a 20 20  ->nNodeRef ){.  
17750 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 77    /* Unable to w
17760 72 69 74 65 20 74 6f 20 74 68 65 20 62 74 72 65  rite to the btre
17770 65 20 77 68 69 6c 65 20 61 6e 6f 74 68 65 72 20  e while another 
17780 63 75 72 73 6f 72 20 69 73 20 72 65 61 64 69 6e  cursor is readin
17790 67 20 66 72 6f 6d 20 69 74 2c 0a 20 20 20 20 2a  g from it,.    *
177a0 2a 20 73 69 6e 63 65 20 74 68 65 20 77 72 69 74  * since the writ
177b0 65 20 6d 69 67 68 74 20 64 6f 20 61 20 72 65 62  e might do a reb
177c0 61 6c 61 6e 63 65 20 77 68 69 63 68 20 77 6f 75  alance which wou
177d0 6c 64 20 64 69 73 72 75 70 74 20 74 68 65 20 72  ld disrupt the r
177e0 65 61 64 0a 20 20 20 20 2a 2a 20 63 75 72 73 6f  ead.    ** curso
177f0 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  r. */.    return
17800 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 56   SQLITE_LOCKED_V
17810 54 41 42 3b 0a 20 20 7d 0a 20 20 72 74 72 65 65  TAB;.  }.  rtree
17820 52 65 66 65 72 65 6e 63 65 28 70 52 74 72 65 65  Reference(pRtree
17830 29 3b 0a 20 20 61 73 73 65 72 74 28 6e 44 61 74  );.  assert(nDat
17840 61 3e 3d 31 29 3b 0a 0a 20 20 63 65 6c 6c 2e 69  a>=1);..  cell.i
17850 52 6f 77 69 64 20 3d 20 30 3b 20 20 2f 2a 20 55  Rowid = 0;  /* U
17860 73 65 64 20 6f 6e 6c 79 20 74 6f 20 73 75 70 70  sed only to supp
17870 72 65 73 73 20 61 20 63 6f 6d 70 69 6c 65 72 20  ress a compiler 
17880 77 61 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 2f 2a  warning */..  /*
17890 20 43 6f 6e 73 74 72 61 69 6e 74 20 68 61 6e 64   Constraint hand
178a0 6c 69 6e 67 2e 20 41 20 77 72 69 74 65 20 6f 70  ling. A write op
178b0 65 72 61 74 69 6f 6e 20 6f 6e 20 61 6e 20 72 2d  eration on an r-
178c0 74 72 65 65 20 74 61 62 6c 65 20 6d 61 79 20 72  tree table may r
178d0 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
178e0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 66 6f 72  E_CONSTRAINT for
178f0 20 74 77 6f 20 72 65 61 73 6f 6e 73 3a 0a 20 20   two reasons:.  
17900 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 20 64  **.  **   1. A d
17910 75 70 6c 69 63 61 74 65 20 72 6f 77 69 64 20 76  uplicate rowid v
17920 61 6c 75 65 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  alue, or.  **   
17930 32 2e 20 54 68 65 20 73 75 70 70 6c 69 65 64 20  2. The supplied 
17940 64 61 74 61 20 76 69 6f 6c 61 74 65 73 20 74 68  data violates th
17950 65 20 22 78 32 3e 3d 78 31 22 20 63 6f 6e 73 74  e "x2>=x1" const
17960 72 61 69 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  raint..  **.  **
17970 20 49 6e 20 74 68 65 20 66 69 72 73 74 20 63 61   In the first ca
17980 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c  se, if the confl
17990 69 63 74 2d 68 61 6e 64 6c 69 6e 67 20 6d 6f 64  ict-handling mod
179a0 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68  e is REPLACE, th
179b0 65 6e 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e 66  en.  ** the conf
179c0 6c 69 63 74 69 6e 67 20 72 6f 77 20 63 61 6e 20  licting row can 
179d0 62 65 20 72 65 6d 6f 76 65 64 20 62 65 66 6f 72  be removed befor
179e0 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 49 6e  e proceeding. In
179f0 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a   the second.  **
17a00 20 63 61 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f   case, SQLITE_CO
17a10 4e 53 54 52 41 49 4e 54 20 6d 75 73 74 20 62 65  NSTRAINT must be
17a20 20 72 65 74 75 72 6e 65 64 20 72 65 67 61 72 64   returned regard
17a30 6c 65 73 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  less of the.  **
17a40 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 69   conflict-handli
17a50 6e 67 20 6d 6f 64 65 20 73 70 65 63 69 66 69 65  ng mode specifie
17a60 64 20 62 79 20 74 68 65 20 75 73 65 72 2e 0a 20  d by the user.. 
17a70 20 2a 2f 0a 20 20 69 66 28 20 6e 44 61 74 61 3e   */.  if( nData>
17a80 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  1 ){.    int ii;
17a90 0a 20 20 20 20 69 6e 74 20 6e 6e 20 3d 20 6e 44  .    int nn = nD
17aa0 61 74 61 20 2d 20 34 3b 0a 0a 20 20 20 20 69 66  ata - 4;..    if
17ab0 28 20 6e 6e 20 3e 20 70 52 74 72 65 65 2d 3e 6e  ( nn > pRtree->n
17ac0 44 69 6d 32 20 29 20 6e 6e 20 3d 20 70 52 74 72  Dim2 ) nn = pRtr
17ad0 65 65 2d 3e 6e 44 69 6d 32 3b 0a 20 20 20 20 2f  ee->nDim2;.    /
17ae0 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 63  * Populate the c
17af0 65 6c 6c 2e 61 43 6f 6f 72 64 5b 5d 20 61 72 72  ell.aCoord[] arr
17b00 61 79 2e 20 54 68 65 20 66 69 72 73 74 20 63 6f  ay. The first co
17b10 6f 72 64 69 6e 61 74 65 20 69 73 20 61 44 61 74  ordinate is aDat
17b20 61 5b 33 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  a[3]..    **.   
17b30 20 2a 2a 20 4e 42 3a 20 6e 44 61 74 61 20 63 61   ** NB: nData ca
17b40 6e 20 6f 6e 6c 79 20 62 65 20 6c 65 73 73 20 74  n only be less t
17b50 68 61 6e 20 6e 44 69 6d 2a 32 2b 33 20 69 66 20  han nDim*2+3 if 
17b60 74 68 65 20 72 74 72 65 65 20 69 73 20 6d 69 73  the rtree is mis
17b70 2d 64 65 63 6c 61 72 65 64 0a 20 20 20 20 2a 2a  -declared.    **
17b80 20 77 69 74 68 20 22 63 6f 6c 75 6d 6e 22 20 74   with "column" t
17b90 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65  hat are interpre
17ba0 74 65 64 20 61 73 20 74 61 62 6c 65 20 63 6f 6e  ted as table con
17bb0 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a  straints..    **
17bc0 20 45 78 61 6d 70 6c 65 3a 20 20 43 52 45 41 54   Example:  CREAT
17bd0 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
17be0 62 61 64 20 55 53 49 4e 47 20 72 74 72 65 65 28  bad USING rtree(
17bf0 78 2c 79 2c 43 48 45 43 4b 28 79 3e 35 29 29 3b  x,y,CHECK(y>5));
17c00 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 70 72 6f  .    ** This pro
17c10 62 6c 65 6d 20 77 61 73 20 64 69 73 63 6f 76 65  blem was discove
17c20 72 65 64 20 61 66 74 65 72 20 79 65 61 72 73 20  red after years 
17c30 6f 66 20 75 73 65 2c 20 73 6f 20 77 65 20 73 69  of use, so we si
17c40 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 0a 20 20  lently ignore.  
17c50 20 20 2a 2a 20 74 68 65 73 65 20 6b 69 6e 64 73    ** these kinds
17c60 20 6f 66 20 6d 69 73 64 65 63 6c 61 72 65 64 20   of misdeclared 
17c70 74 61 62 6c 65 73 20 74 6f 20 61 76 6f 69 64 20  tables to avoid 
17c80 62 72 65 61 6b 69 6e 67 20 61 6e 79 20 6c 65 67  breaking any leg
17c90 61 63 79 2e 0a 20 20 20 20 2a 2f 0a 0a 23 69 66  acy..    */..#if
17ca0 6e 64 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45  ndef SQLITE_RTRE
17cb0 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 69  E_INT_ONLY.    i
17cc0 66 28 20 70 52 74 72 65 65 2d 3e 65 43 6f 6f 72  f( pRtree->eCoor
17cd0 64 54 79 70 65 3d 3d 52 54 52 45 45 5f 43 4f 4f  dType==RTREE_COO
17ce0 52 44 5f 52 45 41 4c 33 32 20 29 7b 0a 20 20 20  RD_REAL32 ){.   
17cf0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
17d00 6e 6e 3b 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20  nn; ii+=2){.    
17d10 20 20 20 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b      cell.aCoord[
17d20 69 69 5d 2e 66 20 3d 20 72 74 72 65 65 56 61 6c  ii].f = rtreeVal
17d30 75 65 44 6f 77 6e 28 61 44 61 74 61 5b 69 69 2b  ueDown(aData[ii+
17d40 33 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 65 6c  3]);.        cel
17d50 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 66  l.aCoord[ii+1].f
17d60 20 3d 20 72 74 72 65 65 56 61 6c 75 65 55 70 28   = rtreeValueUp(
17d70 61 44 61 74 61 5b 69 69 2b 34 5d 29 3b 0a 20 20  aData[ii+4]);.  
17d80 20 20 20 20 20 20 69 66 28 20 63 65 6c 6c 2e 61        if( cell.a
17d90 43 6f 6f 72 64 5b 69 69 5d 2e 66 3e 63 65 6c 6c  Coord[ii].f>cell
17da0 2e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 66 20  .aCoord[ii+1].f 
17db0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
17dc0 3d 20 72 74 72 65 65 43 6f 6e 73 74 72 61 69 6e  = rtreeConstrain
17dd0 74 45 72 72 6f 72 28 70 52 74 72 65 65 2c 20 69  tError(pRtree, i
17de0 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
17df0 67 6f 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 3b  goto constraint;
17e00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17e10 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e   }.    }else.#en
17e20 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
17e30 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 6e 3b  for(ii=0; ii<nn;
17e40 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20   ii+=2){.       
17e50 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 5d   cell.aCoord[ii]
17e60 2e 69 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  .i = sqlite3_val
17e70 75 65 5f 69 6e 74 28 61 44 61 74 61 5b 69 69 2b  ue_int(aData[ii+
17e80 33 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 65 6c  3]);.        cel
17e90 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69  l.aCoord[ii+1].i
17ea0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
17eb0 5f 69 6e 74 28 61 44 61 74 61 5b 69 69 2b 34 5d  _int(aData[ii+4]
17ec0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
17ed0 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 5d 2e 69  ell.aCoord[ii].i
17ee0 3e 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b  >cell.aCoord[ii+
17ef0 31 5d 2e 69 20 29 7b 0a 20 20 20 20 20 20 20 20  1].i ){.        
17f00 20 20 72 63 20 3d 20 72 74 72 65 65 43 6f 6e 73    rc = rtreeCons
17f10 74 72 61 69 6e 74 45 72 72 6f 72 28 70 52 74 72  traintError(pRtr
17f20 65 65 2c 20 69 69 2b 31 29 3b 0a 20 20 20 20 20  ee, ii+1);.     
17f30 20 20 20 20 20 67 6f 74 6f 20 63 6f 6e 73 74 72       goto constr
17f40 61 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aint;.        }.
17f50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
17f60 20 20 20 2f 2a 20 49 66 20 61 20 72 6f 77 69 64     /* If a rowid
17f70 20 76 61 6c 75 65 20 77 61 73 20 73 75 70 70 6c   value was suppl
17f80 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 69 74  ied, check if it
17f90 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
17fa0 65 6e 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74  ent in .    ** t
17fb0 68 65 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c  he table. If so,
17fc0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
17fd0 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20  has failed. */. 
17fe0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
17ff0 61 6c 75 65 5f 74 79 70 65 28 61 44 61 74 61 5b  alue_type(aData[
18000 32 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  2])!=SQLITE_NULL
18010 20 29 7b 0a 20 20 20 20 20 20 63 65 6c 6c 2e 69   ){.      cell.i
18020 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
18030 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 44 61 74  value_int64(aDat
18040 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[2]);.      if(
18050 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
18060 79 70 65 28 61 44 61 74 61 5b 30 5d 29 3d 3d 53  ype(aData[0])==S
18070 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 20 20  QLITE_NULL.     
18080 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c    || sqlite3_val
18090 75 65 5f 69 6e 74 36 34 28 61 44 61 74 61 5b 30  ue_int64(aData[0
180a0 5d 29 21 3d 63 65 6c 6c 2e 69 52 6f 77 69 64 0a  ])!=cell.iRowid.
180b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
180c0 20 69 6e 74 20 73 74 65 70 72 63 3b 0a 20 20 20   int steprc;.   
180d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
180e0 64 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e  d_int64(pRtree->
180f0 70 52 65 61 64 52 6f 77 69 64 2c 20 31 2c 20 63  pReadRowid, 1, c
18100 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20  ell.iRowid);.   
18110 20 20 20 20 20 73 74 65 70 72 63 20 3d 20 73 71       steprc = sq
18120 6c 69 74 65 33 5f 73 74 65 70 28 70 52 74 72 65  lite3_step(pRtre
18130 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 29 3b 0a  e->pReadRowid);.
18140 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
18150 69 74 65 33 5f 72 65 73 65 74 28 70 52 74 72 65  ite3_reset(pRtre
18160 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 29 3b 0a  e->pReadRowid);.
18170 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
18180 54 45 5f 52 4f 57 3d 3d 73 74 65 70 72 63 20 29  TE_ROW==steprc )
18190 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
181a0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f  sqlite3_vtab_on_
181b0 63 6f 6e 66 6c 69 63 74 28 70 52 74 72 65 65 2d  conflict(pRtree-
181c0 3e 64 62 29 3d 3d 53 51 4c 49 54 45 5f 52 45 50  >db)==SQLITE_REP
181d0 4c 41 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  LACE ){.        
181e0 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 44 65      rc = rtreeDe
181f0 6c 65 74 65 52 6f 77 69 64 28 70 52 74 72 65 65  leteRowid(pRtree
18200 2c 20 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a  , cell.iRowid);.
18210 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
18220 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
18230 3d 20 72 74 72 65 65 43 6f 6e 73 74 72 61 69 6e  = rtreeConstrain
18240 74 45 72 72 6f 72 28 70 52 74 72 65 65 2c 20 30  tError(pRtree, 0
18250 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
18260 6f 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 3b 0a  oto constraint;.
18270 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18280 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18290 20 20 20 20 62 48 61 76 65 52 6f 77 69 64 20 3d      bHaveRowid =
182a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
182b0 20 2f 2a 20 49 66 20 61 44 61 74 61 5b 30 5d 20   /* If aData[0] 
182c0 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 4e 55  is not an SQL NU
182d0 4c 4c 20 76 61 6c 75 65 2c 20 69 74 20 69 73 20  LL value, it is 
182e0 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61 0a 20  the rowid of a. 
182f0 20 2a 2a 20 72 65 63 6f 72 64 20 74 6f 20 64 65   ** record to de
18300 6c 65 74 65 20 66 72 6f 6d 20 74 68 65 20 72 2d  lete from the r-
18310 74 72 65 65 20 74 61 62 6c 65 2e 20 54 68 65 20  tree table. The 
18320 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
18330 64 6f 65 73 0a 20 20 2a 2a 20 6a 75 73 74 20 74  does.  ** just t
18340 68 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hat..  */.  if( 
18350 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
18360 70 65 28 61 44 61 74 61 5b 30 5d 29 21 3d 53 51  pe(aData[0])!=SQ
18370 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
18380 20 72 63 20 3d 20 72 74 72 65 65 44 65 6c 65 74   rc = rtreeDelet
18390 65 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20 73  eRowid(pRtree, s
183a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
183b0 36 34 28 61 44 61 74 61 5b 30 5d 29 29 3b 0a 20  64(aData[0]));. 
183c0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
183d0 61 44 61 74 61 5b 5d 20 61 72 72 61 79 20 63 6f  aData[] array co
183e0 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
183f0 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 2c 20 65 6c   one element, el
18400 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 28 61 44 61  ements.  ** (aDa
18410 74 61 5b 32 5d 2e 2e 61 44 61 74 61 5b 61 72 67  ta[2]..aData[arg
18420 63 2d 31 5d 29 20 63 6f 6e 74 61 69 6e 20 61 20  c-1]) contain a 
18430 6e 65 77 20 72 65 63 6f 72 64 20 74 6f 20 69 6e  new record to in
18440 73 65 72 74 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  sert into.  ** t
18450 68 65 20 72 2d 74 72 65 65 20 73 74 72 75 63 74  he r-tree struct
18460 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ure..  */.  if( 
18470 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18480 20 6e 44 61 74 61 3e 31 20 29 7b 0a 20 20 20 20   nData>1 ){.    
18490 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
184a0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
184b0 65 20 72 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  e r-tree */.    
184c0 52 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65 61 66  RtreeNode *pLeaf
184d0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69   = 0;..    /* Fi
184e0 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 77  gure out the row
184f0 69 64 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f  id of the new ro
18500 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 48  w. */.    if( bH
18510 61 76 65 52 6f 77 69 64 3d 3d 30 20 29 7b 0a 20  aveRowid==0 ){. 
18520 20 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 4e       rc = rtreeN
18530 65 77 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20  ewRowid(pRtree, 
18540 26 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a 20  &cell.iRowid);. 
18550 20 20 20 7d 0a 20 20 20 20 2a 70 52 6f 77 69 64     }.    *pRowid
18560 20 3d 20 63 65 6c 6c 2e 69 52 6f 77 69 64 3b 0a   = cell.iRowid;.
18570 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18580 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18590 72 63 20 3d 20 43 68 6f 6f 73 65 4c 65 61 66 28  rc = ChooseLeaf(
185a0 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c 20 30  pRtree, &cell, 0
185b0 2c 20 26 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d  , &pLeaf);.    }
185c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
185d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
185e0 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20 70  int rc2;.      p
185f0 52 74 72 65 65 2d 3e 69 52 65 69 6e 73 65 72 74  Rtree->iReinsert
18600 48 65 69 67 68 74 20 3d 20 2d 31 3b 0a 20 20 20  Height = -1;.   
18610 20 20 20 72 63 20 3d 20 72 74 72 65 65 49 6e 73     rc = rtreeIns
18620 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  ertCell(pRtree, 
18630 70 4c 65 61 66 2c 20 26 63 65 6c 6c 2c 20 30 29  pLeaf, &cell, 0)
18640 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 6e 6f  ;.      rc2 = no
18650 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65  deRelease(pRtree
18660 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  , pLeaf);.      
18670 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18680 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
18690 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
186a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
186b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52  =SQLITE_OK && pR
186c0 74 72 65 65 2d 3e 6e 41 75 78 20 29 7b 0a 20 20  tree->nAux ){.  
186d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
186e0 20 2a 70 55 70 20 3d 20 70 52 74 72 65 65 2d 3e   *pUp = pRtree->
186f0 70 57 72 69 74 65 41 75 78 3b 0a 20 20 20 20 20  pWriteAux;.     
18700 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 73   int jj;.      s
18710 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
18720 34 28 70 55 70 2c 20 31 2c 20 2a 70 52 6f 77 69  4(pUp, 1, *pRowi
18730 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a  d);.      for(jj
18740 3d 30 3b 20 6a 6a 3c 70 52 74 72 65 65 2d 3e 6e  =0; jj<pRtree->n
18750 41 75 78 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Aux; jj++){.    
18760 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
18770 5f 76 61 6c 75 65 28 70 55 70 2c 20 6a 6a 2b 32  _value(pUp, jj+2
18780 2c 20 61 44 61 74 61 5b 70 52 74 72 65 65 2d 3e  , aData[pRtree->
18790 6e 44 69 6d 32 2b 33 2b 6a 6a 5d 29 3b 0a 20 20  nDim2+3+jj]);.  
187a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
187b0 74 65 33 5f 73 74 65 70 28 70 55 70 29 3b 0a 20  te3_step(pUp);. 
187c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
187d0 33 5f 72 65 73 65 74 28 70 55 70 29 3b 0a 20 20  3_reset(pUp);.  
187e0 20 20 7d 0a 20 20 7d 0a 0a 63 6f 6e 73 74 72 61    }.  }..constra
187f0 69 6e 74 3a 0a 20 20 72 74 72 65 65 52 65 6c 65  int:.  rtreeRele
18800 61 73 65 28 70 52 74 72 65 65 29 3b 0a 20 20 72  ase(pRtree);.  r
18810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18820 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 61  ** Called when a
18830 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
18840 72 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rts..*/.static i
18850 6e 74 20 72 74 72 65 65 42 65 67 69 6e 54 72 61  nt rtreeBeginTra
18860 6e 73 61 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  nsaction(sqlite3
18870 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
18880 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d   Rtree *pRtree =
18890 20 28 52 74 72 65 65 20 2a 29 70 56 74 61 62 3b   (Rtree *)pVtab;
188a0 0a 20 20 61 73 73 65 72 74 28 20 70 52 74 72 65  .  assert( pRtre
188b0 65 2d 3e 69 6e 57 72 54 72 61 6e 73 3d 3d 30 20  e->inWrTrans==0 
188c0 29 3b 0a 20 20 70 52 74 72 65 65 2d 3e 69 6e 57  );.  pRtree->inW
188d0 72 54 72 61 6e 73 2b 2b 3b 0a 20 20 72 65 74 75  rTrans++;.  retu
188e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
188f0 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68  ./*.** Called wh
18900 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
18910 20 63 6f 6d 70 6c 65 74 65 73 20 28 65 69 74 68   completes (eith
18920 65 72 20 62 79 20 43 4f 4d 4d 49 54 20 6f 72 20  er by COMMIT or 
18930 52 4f 4c 4c 42 41 43 4b 29 2e 0a 2a 2a 20 54 68  ROLLBACK)..** Th
18940 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 6f  e sqlite3_blob o
18950 62 6a 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  bject should be 
18960 72 65 6c 65 61 73 65 64 20 61 74 20 74 68 69 73  released at this
18970 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
18980 63 20 69 6e 74 20 72 74 72 65 65 45 6e 64 54 72  c int rtreeEndTr
18990 61 6e 73 61 63 74 69 6f 6e 28 73 71 6c 69 74 65  ansaction(sqlite
189a0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
189b0 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 20    Rtree *pRtree 
189c0 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74 61 62  = (Rtree *)pVtab
189d0 3b 0a 20 20 70 52 74 72 65 65 2d 3e 69 6e 57 72  ;.  pRtree->inWr
189e0 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 6e 6f 64  Trans = 0;.  nod
189f0 65 42 6c 6f 62 52 65 73 65 74 28 70 52 74 72 65  eBlobReset(pRtre
18a00 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
18a10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18a20 20 54 68 65 20 78 52 65 6e 61 6d 65 20 6d 65 74   The xRename met
18a30 68 6f 64 20 66 6f 72 20 72 74 72 65 65 20 6d 6f  hod for rtree mo
18a40 64 75 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62  dule virtual tab
18a50 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les..*/.static i
18a60 6e 74 20 72 74 72 65 65 52 65 6e 61 6d 65 28 73  nt rtreeRename(s
18a70 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
18a80 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ab, const char *
18a90 7a 4e 65 77 4e 61 6d 65 29 7b 0a 20 20 52 74 72  zNewName){.  Rtr
18aa0 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74  ee *pRtree = (Rt
18ab0 72 65 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 69  ree *)pVtab;.  i
18ac0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
18ad0 4f 4d 45 4d 3b 0a 20 20 63 68 61 72 20 2a 7a 53  OMEM;.  char *zS
18ae0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
18af0 69 6e 74 66 28 0a 20 20 20 20 22 41 4c 54 45 52  intf(.    "ALTER
18b00 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 6e 6f   TABLE %Q.'%q_no
18b10 64 65 27 20 20 20 52 45 4e 41 4d 45 20 54 4f 20  de'   RENAME TO 
18b20 5c 22 25 77 5f 6e 6f 64 65 5c 22 3b 22 0a 20 20  \"%w_node\";".  
18b30 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 25    "ALTER TABLE %
18b40 51 2e 27 25 71 5f 70 61 72 65 6e 74 27 20 52 45  Q.'%q_parent' RE
18b50 4e 41 4d 45 20 54 4f 20 5c 22 25 77 5f 70 61 72  NAME TO \"%w_par
18b60 65 6e 74 5c 22 3b 22 0a 20 20 20 20 22 41 4c 54  ent\";".    "ALT
18b70 45 52 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f  ER TABLE %Q.'%q_
18b80 72 6f 77 69 64 27 20 20 52 45 4e 41 4d 45 20 54  rowid'  RENAME T
18b90 4f 20 5c 22 25 77 5f 72 6f 77 69 64 5c 22 3b 22  O \"%w_rowid\";"
18ba0 0a 20 20 20 20 2c 20 70 52 74 72 65 65 2d 3e 7a  .    , pRtree->z
18bb0 44 62 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d  Db, pRtree->zNam
18bc0 65 2c 20 7a 4e 65 77 4e 61 6d 65 20 0a 20 20 20  e, zNewName .   
18bd0 20 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20   , pRtree->zDb, 
18be0 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20 7a  pRtree->zName, z
18bf0 4e 65 77 4e 61 6d 65 20 0a 20 20 20 20 2c 20 70  NewName .    , p
18c00 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72  Rtree->zDb, pRtr
18c10 65 65 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 65 77 4e  ee->zName, zNewN
18c20 61 6d 65 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a  ame.  );.  if( z
18c30 53 71 6c 20 29 7b 0a 20 20 20 20 6e 6f 64 65 42  Sql ){.    nodeB
18c40 6c 6f 62 52 65 73 65 74 28 70 52 74 72 65 65 29  lobReset(pRtree)
18c50 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18c60 65 33 5f 65 78 65 63 28 70 52 74 72 65 65 2d 3e  e3_exec(pRtree->
18c70 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
18c80 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
18c90 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a  free(zSql);.  }.
18ca0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18cb0 2f 2a 0a 2a 2a 20 54 68 65 20 78 53 61 76 65 70  /*.** The xSavep
18cc0 6f 69 6e 74 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  oint method..**.
18cd0 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 64  ** This module d
18ce0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
18cf0 64 6f 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 73  do anything to s
18d00 75 70 70 6f 72 74 20 73 61 76 65 70 6f 69 6e 74  upport savepoint
18d10 73 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69  s. However,.** i
18d20 74 20 75 73 65 73 20 74 68 69 73 20 68 6f 6f 6b  t uses this hook
18d30 20 74 6f 20 63 6c 6f 73 65 20 61 6e 79 20 6f 70   to close any op
18d40 65 6e 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 20  en blob handle. 
18d50 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63  This is done bec
18d60 61 75 73 65 20 61 20 0a 2a 2a 20 44 52 4f 50 20  ause a .** DROP 
18d70 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 20 2d 20  TABLE command - 
18d80 77 68 69 63 68 20 66 6f 72 74 75 6e 61 74 65 6c  which fortunatel
18d90 79 20 61 6c 77 61 79 73 20 6f 70 65 6e 73 20 61  y always opens a
18da0 20 73 61 76 65 70 6f 69 6e 74 20 2d 20 63 61 6e   savepoint - can
18db0 6e 6f 74 20 0a 2a 2a 20 73 75 63 63 65 65 64 20  not .** succeed 
18dc0 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
18dd0 20 6f 70 65 6e 20 62 6c 6f 62 20 68 61 6e 64 6c   open blob handl
18de0 65 73 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 20  es. i.e. if the 
18df0 62 6c 6f 62 20 68 61 6e 64 6c 65 20 77 65 72 65  blob handle were
18e00 0a 2a 2a 20 6e 6f 74 20 63 6c 6f 73 65 64 20 68  .** not closed h
18e10 65 72 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ere, the followi
18e20 6e 67 20 77 6f 75 6c 64 20 66 61 69 6c 3a 0a 2a  ng would fail:.*
18e30 2a 0a 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 2a 2a  *.**   BEGIN;.**
18e40 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
18e50 20 72 74 72 65 65 2e 2e 2e 0a 2a 2a 20 20 20 20   rtree....**    
18e60 20 44 52 4f 50 20 54 41 42 4c 45 20 3c 74 61 62   DROP TABLE <tab
18e70 6c 65 6e 61 6d 65 3e 3b 20 20 20 20 2d 2d 20 57  lename>;    -- W
18e80 6f 75 6c 64 20 66 61 69 6c 20 77 69 74 68 20 53  ould fail with S
18e90 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 0a 2a 2a 20  QLITE_LOCKED.** 
18ea0 20 20 43 4f 4d 4d 49 54 3b 0a 2a 2f 0a 73 74 61    COMMIT;.*/.sta
18eb0 74 69 63 20 69 6e 74 20 72 74 72 65 65 53 61 76  tic int rtreeSav
18ec0 65 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 5f 76  epoint(sqlite3_v
18ed0 74 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 20  tab *pVtab, int 
18ee0 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 52  iSavepoint){.  R
18ef0 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28  tree *pRtree = (
18f00 52 74 72 65 65 20 2a 29 70 56 74 61 62 3b 0a 20  Rtree *)pVtab;. 
18f10 20 75 38 20 69 77 74 20 3d 20 70 52 74 72 65 65   u8 iwt = pRtree
18f20 2d 3e 69 6e 57 72 54 72 61 6e 73 3b 0a 20 20 55  ->inWrTrans;.  U
18f30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
18f40 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70  iSavepoint);.  p
18f50 52 74 72 65 65 2d 3e 69 6e 57 72 54 72 61 6e 73  Rtree->inWrTrans
18f60 20 3d 20 30 3b 0a 20 20 6e 6f 64 65 42 6c 6f 62   = 0;.  nodeBlob
18f70 52 65 73 65 74 28 70 52 74 72 65 65 29 3b 0a 20  Reset(pRtree);. 
18f80 20 70 52 74 72 65 65 2d 3e 69 6e 57 72 54 72 61   pRtree->inWrTra
18f90 6e 73 20 3d 20 69 77 74 3b 0a 20 20 72 65 74 75  ns = iwt;.  retu
18fa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18fb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
18fc0 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 74  tion populates t
18fd0 68 65 20 70 52 74 72 65 65 2d 3e 6e 52 6f 77 45  he pRtree->nRowE
18fe0 73 74 20 76 61 72 69 61 62 6c 65 20 77 69 74 68  st variable with
18ff0 20 61 6e 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20   an estimate.** 
19000 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
19010 20 72 6f 77 73 20 69 6e 20 74 68 65 20 76 69 72   rows in the vir
19020 74 75 61 6c 20 74 61 62 6c 65 2e 20 49 66 20 70  tual table. If p
19030 6f 73 73 69 62 6c 65 2c 20 74 68 69 73 20 69 73  ossible, this is
19040 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 73 71 6c   based.** on sql
19050 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 2e 20  ite_stat1 data. 
19060 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 52  Otherwise, use R
19070 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57  TREE_DEFAULT_ROW
19080 45 53 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  EST..*/.static i
19090 6e 74 20 72 74 72 65 65 51 75 65 72 79 53 74 61  nt rtreeQuerySta
190a0 74 31 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  t1(sqlite3 *db, 
190b0 52 74 72 65 65 20 2a 70 52 74 72 65 65 29 7b 0a  Rtree *pRtree){.
190c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
190d0 6d 74 20 3d 20 22 53 45 4c 45 43 54 20 73 74 61  mt = "SELECT sta
190e0 74 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  t FROM %Q.sqlite
190f0 5f 73 74 61 74 31 20 57 48 45 52 45 20 74 62 6c  _stat1 WHERE tbl
19100 20 3d 20 27 25 71 5f 72 6f 77 69 64 27 22 3b 0a   = '%q_rowid'";.
19110 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
19120 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 3b  sqlite3_stmt *p;
19130 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34  .  int rc;.  i64
19140 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20 20 72 63   nRow = 0;..  rc
19150 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65   = sqlite3_table
19160 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
19170 28 0a 20 20 20 20 20 20 64 62 2c 20 70 52 74 72  (.      db, pRtr
19180 65 65 2d 3e 7a 44 62 2c 20 22 73 71 6c 69 74 65  ee->zDb, "sqlite
19190 5f 73 74 61 74 31 22 2c 30 2c 30 2c 30 2c 30 2c  _stat1",0,0,0,0,
191a0 30 2c 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  0,0.  );.  if( r
191b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
191c0 20 20 20 20 70 52 74 72 65 65 2d 3e 6e 52 6f 77      pRtree->nRow
191d0 45 73 74 20 3d 20 52 54 52 45 45 5f 44 45 46 41  Est = RTREE_DEFA
191e0 55 4c 54 5f 52 4f 57 45 53 54 3b 0a 20 20 20 20  ULT_ROWEST;.    
191f0 72 65 74 75 72 6e 20 72 63 3d 3d 53 51 4c 49 54  return rc==SQLIT
19200 45 5f 45 52 52 4f 52 20 3f 20 53 51 4c 49 54 45  E_ERROR ? SQLITE
19210 5f 4f 4b 20 3a 20 72 63 3b 0a 20 20 7d 0a 20 20  _OK : rc;.  }.  
19220 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
19230 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 70 52 74  printf(zFmt, pRt
19240 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65  ree->zDb, pRtree
19250 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
19260 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zSql==0 ){.    r
19270 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19280 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
19290 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
192a0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
192b0 20 2d 31 2c 20 26 70 2c 20 30 29 3b 0a 20 20 20   -1, &p, 0);.   
192c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
192d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
192e0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 29 3d  sqlite3_step(p)=
192f0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 6e 52  =SQLITE_ROW ) nR
19300 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ow = sqlite3_col
19310 75 6d 6e 5f 69 6e 74 36 34 28 70 2c 20 30 29 3b  umn_int64(p, 0);
19320 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
19330 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 29 3b  te3_finalize(p);
19340 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
19350 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
19360 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
19370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
19380 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19390 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
193a0 66 28 20 6e 52 6f 77 3d 3d 30 20 29 7b 0a 20 20  f( nRow==0 ){.  
193b0 20 20 20 20 20 20 70 52 74 72 65 65 2d 3e 6e 52        pRtree->nR
193c0 6f 77 45 73 74 20 3d 20 52 54 52 45 45 5f 44 45  owEst = RTREE_DE
193d0 46 41 55 4c 54 5f 52 4f 57 45 53 54 3b 0a 20 20  FAULT_ROWEST;.  
193e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
193f0 20 20 20 70 52 74 72 65 65 2d 3e 6e 52 6f 77 45     pRtree->nRowE
19400 73 74 20 3d 20 4d 41 58 28 6e 52 6f 77 2c 20 52  st = MAX(nRow, R
19410 54 52 45 45 5f 4d 49 4e 5f 52 4f 57 45 53 54 29  TREE_MIN_ROWEST)
19420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19430 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
19440 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72  (zSql);.  }..  r
19450 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
19460 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
19470 69 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65 20  if zName is the 
19480 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 20 6f 6e 65  extension on one
19490 20 6f 66 20 74 68 65 20 73 68 61 64 6f 77 20 74   of the shadow t
194a0 61 62 6c 65 73 20 75 73 65 64 0a 2a 2a 20 62 79  ables used.** by
194b0 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f   this module..*/
194c0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65  .static int rtre
194d0 65 53 68 61 64 6f 77 4e 61 6d 65 28 63 6f 6e 73  eShadowName(cons
194e0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
194f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
19500 68 61 72 20 2a 61 7a 4e 61 6d 65 5b 5d 20 3d 20  har *azName[] = 
19510 7b 0a 20 20 20 20 22 6e 6f 64 65 22 2c 20 22 70  {.    "node", "p
19520 61 72 65 6e 74 22 2c 20 22 72 6f 77 69 64 22 0a  arent", "rowid".
19530 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20    };.  unsigned 
19540 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
19550 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 4e 61 6d  ; i<sizeof(azNam
19560 65 29 2f 73 69 7a 65 6f 66 28 61 7a 4e 61 6d 65  e)/sizeof(azName
19570 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
19580 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
19590 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 7a 4e 61 6d  cmp(zName, azNam
195a0 65 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72  e[i])==0 ) retur
195b0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
195c0 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73  n 0;.}..static s
195d0 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 72 74  qlite3_module rt
195e0 72 65 65 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20  reeModule = {.  
195f0 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
19600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
19610 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 72 74 72  Version */.  rtr
19620 65 65 43 72 65 61 74 65 2c 20 20 20 20 20 20 20  eeCreate,       
19630 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65           /* xCre
19640 61 74 65 20 2d 20 63 72 65 61 74 65 20 61 20 74  ate - create a t
19650 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65 43  able */.  rtreeC
19660 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20  onnect,         
19670 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63        /* xConnec
19680 74 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61  t - connect to a
19690 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
196a0 20 2a 2f 0a 20 20 72 74 72 65 65 42 65 73 74 49   */.  rtreeBestI
196b0 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
196c0 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20    /* xBestIndex 
196d0 2d 20 44 65 74 65 72 6d 69 6e 65 20 73 65 61 72  - Determine sear
196e0 63 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20  ch strategy */. 
196f0 20 72 74 72 65 65 44 69 73 63 6f 6e 6e 65 63 74   rtreeDisconnect
19700 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
19710 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44 69  xDisconnect - Di
19720 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61 20  sconnect from a 
19730 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65  table */.  rtree
19740 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20 20  Destroy,        
19750 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72         /* xDestr
19760 6f 79 20 2d 20 44 72 6f 70 20 61 20 74 61 62 6c  oy - Drop a tabl
19770 65 20 2a 2f 0a 20 20 72 74 72 65 65 4f 70 65 6e  e */.  rtreeOpen
19780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19790 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70     /* xOpen - op
197a0 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  en a cursor */. 
197b0 20 72 74 72 65 65 43 6c 6f 73 65 2c 20 20 20 20   rtreeClose,    
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
197d0 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61  xClose - close a
197e0 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 72 74 72   cursor */.  rtr
197f0 65 65 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20  eeFilter,       
19800 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
19810 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20  ter - configure 
19820 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73  scan constraints
19830 20 2a 2f 0a 20 20 72 74 72 65 65 4e 65 78 74 2c   */.  rtreeNext,
19840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19850 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76    /* xNext - adv
19860 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  ance a cursor */
19870 0a 20 20 72 74 72 65 65 45 6f 66 2c 20 20 20 20  .  rtreeEof,    
19880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19890 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 72 74 72 65  * xEof */.  rtre
198a0 65 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  eColumn,        
198b0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75          /* xColu
198c0 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  mn - read data *
198d0 2f 0a 20 20 72 74 72 65 65 52 6f 77 69 64 2c 20  /.  rtreeRowid, 
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198f0 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64  /* xRowid - read
19900 20 64 61 74 61 20 2a 2f 0a 20 20 72 74 72 65 65   data */.  rtree
19910 55 70 64 61 74 65 2c 20 20 20 20 20 20 20 20 20  Update,         
19920 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74         /* xUpdat
19930 65 20 2d 20 77 72 69 74 65 20 64 61 74 61 20 2a  e - write data *
19940 2f 0a 20 20 72 74 72 65 65 42 65 67 69 6e 54 72  /.  rtreeBeginTr
19950 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 20  ansaction,      
19960 2f 2a 20 78 42 65 67 69 6e 20 2d 20 62 65 67 69  /* xBegin - begi
19970 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  n transaction */
19980 0a 20 20 72 74 72 65 65 45 6e 64 54 72 61 6e 73  .  rtreeEndTrans
19990 61 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 2f  action,        /
199a0 2a 20 78 53 79 6e 63 20 2d 20 73 79 6e 63 20 74  * xSync - sync t
199b0 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
199c0 72 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  rtreeEndTransact
199d0 69 6f 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  ion,        /* x
199e0 43 6f 6d 6d 69 74 20 2d 20 63 6f 6d 6d 69 74 20  Commit - commit 
199f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
19a00 20 72 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   rtreeEndTransac
19a10 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  tion,        /* 
19a20 78 52 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c  xRollback - roll
19a30 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e  back transaction
19a40 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
19a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a60 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69    /* xFindFuncti
19a70 6f 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76  on - function ov
19a80 65 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 72  erloading */.  r
19a90 74 72 65 65 52 65 6e 61 6d 65 2c 20 20 20 20 20  treeRename,     
19aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
19ab0 65 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74  ename - rename t
19ac0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74  he table */.  rt
19ad0 72 65 65 53 61 76 65 70 6f 69 6e 74 2c 20 20 20  reeSavepoint,   
19ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61            /* xSa
19af0 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20  vepoint */.  0, 
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c           /* xRel
19b20 65 61 73 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  ease */.  0,    
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b40 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61        /* xRollba
19b50 63 6b 54 6f 20 2a 2f 0a 20 20 72 74 72 65 65 53  ckTo */.  rtreeS
19b60 68 61 64 6f 77 4e 61 6d 65 20 20 20 20 20 20 20  hadowName       
19b70 20 20 20 20 20 20 2f 2a 20 78 53 68 61 64 6f 77        /* xShadow
19b80 4e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74  Name */.};..stat
19b90 69 63 20 69 6e 74 20 72 74 72 65 65 53 71 6c 49  ic int rtreeSqlI
19ba0 6e 69 74 28 0a 20 20 52 74 72 65 65 20 2a 70 52  nit(.  Rtree *pR
19bb0 74 72 65 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  tree, .  sqlite3
19bc0 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63   *db, .  const c
19bd0 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e  har *zDb, .  con
19be0 73 74 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78  st char *zPrefix
19bf0 2c 20 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  , .  int isCreat
19c00 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  e.){.  int rc = 
19c10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 23 64  SQLITE_OK;..  #d
19c20 65 66 69 6e 65 20 4e 5f 53 54 41 54 45 4d 45 4e  efine N_STATEMEN
19c30 54 20 38 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  T 8.  static con
19c40 73 74 20 63 68 61 72 20 2a 61 7a 53 71 6c 5b 4e  st char *azSql[N
19c50 5f 53 54 41 54 45 4d 45 4e 54 5d 20 3d 20 7b 0a  _STATEMENT] = {.
19c60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
19c70 20 78 78 78 5f 6e 6f 64 65 20 74 61 62 6c 65 20   xxx_node table 
19c80 2a 2f 0a 20 20 20 20 22 49 4e 53 45 52 54 20 4f  */.    "INSERT O
19c90 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27  R REPLACE INTO '
19ca0 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27 20 56 41  %q'.'%q_node' VA
19cb0 4c 55 45 53 28 3f 31 2c 20 3f 32 29 22 2c 0a 20  LUES(?1, ?2)",. 
19cc0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
19cd0 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27 20 57  '%q'.'%q_node' W
19ce0 48 45 52 45 20 6e 6f 64 65 6e 6f 20 3d 20 3f 31  HERE nodeno = ?1
19cf0 22 2c 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ",..    /* Read 
19d00 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 78 78  and write the xx
19d10 78 5f 72 6f 77 69 64 20 74 61 62 6c 65 20 2a 2f  x_rowid table */
19d20 0a 20 20 20 20 22 53 45 4c 45 43 54 20 6e 6f 64  .    "SELECT nod
19d30 65 6e 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27 25  eno FROM '%q'.'%
19d40 71 5f 72 6f 77 69 64 27 20 57 48 45 52 45 20 72  q_rowid' WHERE r
19d50 6f 77 69 64 20 3d 20 3f 31 22 2c 0a 20 20 20 20  owid = ?1",.    
19d60 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41  "INSERT OR REPLA
19d70 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71  CE INTO '%q'.'%q
19d80 5f 72 6f 77 69 64 27 20 56 41 4c 55 45 53 28 3f  _rowid' VALUES(?
19d90 31 2c 20 3f 32 29 22 2c 0a 20 20 20 20 22 44 45  1, ?2)",.    "DE
19da0 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27  LETE FROM '%q'.'
19db0 25 71 5f 72 6f 77 69 64 27 20 57 48 45 52 45 20  %q_rowid' WHERE 
19dc0 72 6f 77 69 64 20 3d 20 3f 31 22 2c 0a 0a 20 20  rowid = ?1",..  
19dd0 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72    /* Read and wr
19de0 69 74 65 20 74 68 65 20 78 78 78 5f 70 61 72 65  ite the xxx_pare
19df0 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  nt table */.    
19e00 22 53 45 4c 45 43 54 20 70 61 72 65 6e 74 6e 6f  "SELECT parentno
19e10 64 65 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71  de FROM '%q'.'%q
19e20 5f 70 61 72 65 6e 74 27 20 57 48 45 52 45 20 6e  _parent' WHERE n
19e30 6f 64 65 6e 6f 20 3d 20 3f 31 22 2c 0a 20 20 20  odeno = ?1",.   
19e40 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c   "INSERT OR REPL
19e50 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 27 25  ACE INTO '%q'.'%
19e60 71 5f 70 61 72 65 6e 74 27 20 56 41 4c 55 45 53  q_parent' VALUES
19e70 28 3f 31 2c 20 3f 32 29 22 2c 0a 20 20 20 20 22  (?1, ?2)",.    "
19e80 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27  DELETE FROM '%q'
19e90 2e 27 25 71 5f 70 61 72 65 6e 74 27 20 57 48 45  .'%q_parent' WHE
19ea0 52 45 20 6e 6f 64 65 6e 6f 20 3d 20 3f 31 22 0a  RE nodeno = ?1".
19eb0 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73    };.  sqlite3_s
19ec0 74 6d 74 20 2a 2a 61 70 70 53 74 6d 74 5b 4e 5f  tmt **appStmt[N_
19ed0 53 54 41 54 45 4d 45 4e 54 5d 3b 0a 20 20 69 6e  STATEMENT];.  in
19ee0 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  t i;.  const int
19ef0 20 66 20 3d 20 53 51 4c 49 54 45 5f 50 52 45 50   f = SQLITE_PREP
19f00 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54 7c 53  ARE_PERSISTENT|S
19f10 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 4e 4f  QLITE_PREPARE_NO
19f20 5f 56 54 41 42 3b 0a 0a 20 20 70 52 74 72 65 65  _VTAB;..  pRtree
19f30 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 20 20 69 66  ->db = db;..  if
19f40 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20  ( isCreate ){.  
19f50 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 3b    char *zCreate;
19f60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
19f70 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   *p = sqlite3_st
19f80 72 5f 6e 65 77 28 64 62 29 3b 0a 20 20 20 20 69  r_new(db);.    i
19f90 6e 74 20 69 69 3b 0a 20 20 20 20 73 71 6c 69 74  nt ii;.    sqlit
19fa0 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
19fb0 2c 0a 20 20 20 20 20 20 20 22 43 52 45 41 54 45  ,.       "CREATE
19fc0 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 2e 5c 22   TABLE \"%w\".\"
19fd0 25 77 5f 72 6f 77 69 64 5c 22 28 72 6f 77 69 64  %w_rowid\"(rowid
19fe0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
19ff0 20 4b 45 59 2c 6e 6f 64 65 6e 6f 22 2c 0a 20 20   KEY,nodeno",.  
1a000 20 20 20 20 20 7a 44 62 2c 20 7a 50 72 65 66 69       zDb, zPrefi
1a010 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  x);.    for(ii=0
1a020 3b 20 69 69 3c 70 52 74 72 65 65 2d 3e 6e 41 75  ; ii<pRtree->nAu
1a030 78 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  x; ii++){.      
1a040 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
1a050 6e 64 66 28 70 2c 22 2c 61 25 64 22 2c 69 69 29  ndf(p,",a%d",ii)
1a060 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1a070 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
1a080 70 2c 0a 20 20 20 20 20 20 22 29 3b 43 52 45 41  p,.      ");CREA
1a090 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 2e  TE TABLE \"%w\".
1a0a0 5c 22 25 77 5f 6e 6f 64 65 5c 22 28 6e 6f 64 65  \"%w_node\"(node
1a0b0 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
1a0c0 52 59 20 4b 45 59 2c 64 61 74 61 29 3b 22 2c 0a  RY KEY,data);",.
1a0d0 20 20 20 20 20 20 7a 44 62 2c 20 7a 50 72 65 66        zDb, zPref
1a0e0 69 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ix);.    sqlite3
1a0f0 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 0a  _str_appendf(p,.
1a100 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
1a110 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 70 61  E \"%w\".\"%w_pa
1a120 72 65 6e 74 5c 22 28 6e 6f 64 65 6e 6f 20 49 4e  rent\"(nodeno IN
1a130 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1a140 59 2c 70 61 72 65 6e 74 6e 6f 64 65 29 3b 22 2c  Y,parentnode);",
1a150 0a 20 20 20 20 20 20 7a 44 62 2c 20 7a 50 72 65  .      zDb, zPre
1a160 66 69 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  fix);.    sqlite
1a170 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c  3_str_appendf(p,
1a180 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20  .       "INSERT 
1a190 49 4e 54 4f 20 5c 22 25 77 5c 22 2e 5c 22 25 77  INTO \"%w\".\"%w
1a1a0 5f 6e 6f 64 65 5c 22 56 41 4c 55 45 53 28 31 2c  _node\"VALUES(1,
1a1b0 7a 65 72 6f 62 6c 6f 62 28 25 64 29 29 22 2c 0a  zeroblob(%d))",.
1a1c0 20 20 20 20 20 20 20 7a 44 62 2c 20 7a 50 72 65         zDb, zPre
1a1d0 66 69 78 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f  fix, pRtree->iNo
1a1e0 64 65 53 69 7a 65 29 3b 0a 20 20 20 20 7a 43 72  deSize);.    zCr
1a1f0 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 73  eate = sqlite3_s
1a200 74 72 5f 66 69 6e 69 73 68 28 70 29 3b 0a 20 20  tr_finish(p);.  
1a210 20 20 69 66 28 20 21 7a 43 72 65 61 74 65 20 29    if( !zCreate )
1a220 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1a230 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1a240 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
1a250 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 43 72  te3_exec(db, zCr
1a260 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  eate, 0, 0, 0);.
1a270 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a280 28 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 69  (zCreate);.    i
1a290 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a2a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1a2b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
1a2c0 20 20 61 70 70 53 74 6d 74 5b 30 5d 20 3d 20 26    appStmt[0] = &
1a2d0 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 4e 6f  pRtree->pWriteNo
1a2e0 64 65 3b 0a 20 20 61 70 70 53 74 6d 74 5b 31 5d  de;.  appStmt[1]
1a2f0 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 44 65 6c   = &pRtree->pDel
1a300 65 74 65 4e 6f 64 65 3b 0a 20 20 61 70 70 53 74  eteNode;.  appSt
1a310 6d 74 5b 32 5d 20 3d 20 26 70 52 74 72 65 65 2d  mt[2] = &pRtree-
1a320 3e 70 52 65 61 64 52 6f 77 69 64 3b 0a 20 20 61  >pReadRowid;.  a
1a330 70 70 53 74 6d 74 5b 33 5d 20 3d 20 26 70 52 74  ppStmt[3] = &pRt
1a340 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64  ree->pWriteRowid
1a350 3b 0a 20 20 61 70 70 53 74 6d 74 5b 34 5d 20 3d  ;.  appStmt[4] =
1a360 20 26 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74   &pRtree->pDelet
1a370 65 52 6f 77 69 64 3b 0a 20 20 61 70 70 53 74 6d  eRowid;.  appStm
1a380 74 5b 35 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e  t[5] = &pRtree->
1a390 70 52 65 61 64 50 61 72 65 6e 74 3b 0a 20 20 61  pReadParent;.  a
1a3a0 70 70 53 74 6d 74 5b 36 5d 20 3d 20 26 70 52 74  ppStmt[6] = &pRt
1a3b0 72 65 65 2d 3e 70 57 72 69 74 65 50 61 72 65 6e  ree->pWriteParen
1a3c0 74 3b 0a 20 20 61 70 70 53 74 6d 74 5b 37 5d 20  t;.  appStmt[7] 
1a3d0 3d 20 26 70 52 74 72 65 65 2d 3e 70 44 65 6c 65  = &pRtree->pDele
1a3e0 74 65 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20  teParent;..  rc 
1a3f0 3d 20 72 74 72 65 65 51 75 65 72 79 53 74 61 74  = rtreeQueryStat
1a400 31 28 64 62 2c 20 70 52 74 72 65 65 29 3b 0a 20  1(db, pRtree);. 
1a410 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 54   for(i=0; i<N_ST
1a420 41 54 45 4d 45 4e 54 20 26 26 20 72 63 3d 3d 53  ATEMENT && rc==S
1a430 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
1a440 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a      char *zSql;.
1a450 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1a460 7a 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 66 28  zFormat;.    if(
1a470 20 69 21 3d 33 20 7c 7c 20 70 52 74 72 65 65 2d   i!=3 || pRtree-
1a480 3e 6e 41 75 78 3d 3d 30 20 29 7b 0a 20 20 20 20  >nAux==0 ){.    
1a490 20 20 20 7a 46 6f 72 6d 61 74 20 3d 20 61 7a 53     zFormat = azS
1a4a0 71 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  ql[i];.    }else
1a4b0 20 7b 0a 20 20 20 20 20 20 20 2f 2a 20 41 6e 20   {.       /* An 
1a4c0 55 50 53 45 52 54 20 69 73 20 76 65 72 79 20 73  UPSERT is very s
1a4d0 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 74  lightly slower t
1a4e0 68 61 6e 20 52 45 50 4c 41 43 45 2c 20 62 75 74  han REPLACE, but
1a4f0 20 69 74 20 69 73 20 6e 65 65 64 65 64 0a 20 20   it is needed.  
1a500 20 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65       ** if there
1a510 20 61 72 65 20 61 75 78 69 6c 69 61 72 79 20 63   are auxiliary c
1a520 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
1a530 20 7a 46 6f 72 6d 61 74 20 3d 20 22 49 4e 53 45   zFormat = "INSE
1a540 52 54 20 49 4e 54 4f 5c 22 25 77 5c 22 2e 5c 22  RT INTO\"%w\".\"
1a550 25 77 5f 72 6f 77 69 64 5c 22 28 72 6f 77 69 64  %w_rowid\"(rowid
1a560 2c 6e 6f 64 65 6e 6f 29 56 41 4c 55 45 53 28 3f  ,nodeno)VALUES(?
1a570 31 2c 3f 32 29 22 0a 20 20 20 20 20 20 20 20 20  1,?2)".         
1a580 20 20 20 20 20 20 20 20 20 22 4f 4e 20 43 4f 4e           "ON CON
1a590 46 4c 49 43 54 28 72 6f 77 69 64 29 44 4f 20 55  FLICT(rowid)DO U
1a5a0 50 44 41 54 45 20 53 45 54 20 6e 6f 64 65 6e 6f  PDATE SET nodeno
1a5b0 3d 65 78 63 6c 75 64 65 64 2e 6e 6f 64 65 6e 6f  =excluded.nodeno
1a5c0 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ";.    }.    zSq
1a5d0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
1a5e0 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 7a 44 62  ntf(zFormat, zDb
1a5f0 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20  , zPrefix);.    
1a600 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20  if( zSql ){.    
1a610 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1a620 72 65 70 61 72 65 5f 76 33 28 64 62 2c 20 7a 53  repare_v3(db, zS
1a630 71 6c 2c 20 2d 31 2c 20 66 2c 20 61 70 70 53 74  ql, -1, f, appSt
1a640 6d 74 5b 69 5d 2c 20 30 29 3b 20 0a 20 20 20 20  mt[i], 0); .    
1a650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1a660 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1a670 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1a680 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
1a690 7d 0a 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e  }.  if( pRtree->
1a6a0 6e 41 75 78 20 29 7b 0a 20 20 20 20 70 52 74 72  nAux ){.    pRtr
1a6b0 65 65 2d 3e 7a 52 65 61 64 41 75 78 53 71 6c 20  ee->zReadAuxSql 
1a6c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1a6d0 66 28 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  f(.       "SELEC
1a6e0 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e  T * FROM \"%w\".
1a6f0 5c 22 25 77 5f 72 6f 77 69 64 5c 22 20 57 48 45  \"%w_rowid\" WHE
1a700 52 45 20 72 6f 77 69 64 3d 3f 31 22 2c 0a 20 20  RE rowid=?1",.  
1a710 20 20 20 20 20 7a 44 62 2c 20 7a 50 72 65 66 69       zDb, zPrefi
1a720 78 29 3b 0a 20 20 20 20 69 66 28 20 70 52 74 72  x);.    if( pRtr
1a730 65 65 2d 3e 7a 52 65 61 64 41 75 78 53 71 6c 3d  ee->zReadAuxSql=
1a740 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1a750 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1a760 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a770 73 71 6c 69 74 65 33 5f 73 74 72 20 2a 70 20 3d  sqlite3_str *p =
1a780 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 6e 65 77   sqlite3_str_new
1a790 28 64 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (db);.      int 
1a7a0 69 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ii;.      char *
1a7b0 7a 53 71 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  zSql;.      sqli
1a7c0 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
1a7d0 70 2c 20 22 55 50 44 41 54 45 20 5c 22 25 77 5c  p, "UPDATE \"%w\
1a7e0 22 2e 5c 22 25 77 5f 72 6f 77 69 64 5c 22 53 45  ".\"%w_rowid\"SE
1a7f0 54 20 22 2c 20 7a 44 62 2c 20 7a 50 72 65 66 69  T ", zDb, zPrefi
1a800 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  x);.      for(ii
1a810 3d 30 3b 20 69 69 3c 70 52 74 72 65 65 2d 3e 6e  =0; ii<pRtree->n
1a820 41 75 78 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Aux; ii++){.    
1a830 20 20 20 20 69 66 28 20 69 69 20 29 20 73 71 6c      if( ii ) sql
1a840 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
1a850 70 2c 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20 20  p, ",", 1);.    
1a860 20 20 20 20 69 66 28 20 69 69 3c 70 52 74 72 65      if( ii<pRtre
1a870 65 2d 3e 6e 41 75 78 4e 6f 74 4e 75 6c 6c 20 29  e->nAuxNotNull )
1a880 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1a890 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
1a8a0 70 2c 22 61 25 64 3d 63 6f 61 6c 65 73 63 65 28  p,"a%d=coalesce(
1a8b0 3f 25 64 2c 61 25 64 29 22 2c 69 69 2c 69 69 2b  ?%d,a%d)",ii,ii+
1a8c0 32 2c 69 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  2,ii);.        }
1a8d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1a8e0 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
1a8f0 6e 64 66 28 70 2c 22 61 25 64 3d 3f 25 64 22 2c  ndf(p,"a%d=?%d",
1a900 69 69 2c 69 69 2b 32 29 3b 0a 20 20 20 20 20 20  ii,ii+2);.      
1a910 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a920 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
1a930 70 65 6e 64 66 28 70 2c 20 22 20 57 48 45 52 45  pendf(p, " WHERE
1a940 20 72 6f 77 69 64 3d 3f 31 22 29 3b 0a 20 20 20   rowid=?1");.   
1a950 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
1a960 33 5f 73 74 72 5f 66 69 6e 69 73 68 28 70 29 3b  3_str_finish(p);
1a970 0a 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  .      if( zSql=
1a980 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1a990 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1a9a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a9b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a9c0 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28 64 62  e3_prepare_v3(db
1a9d0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 66 2c 20 26  , zSql, -1, f, &
1a9e0 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 41 75  pRtree->pWriteAu
1a9f0 78 2c 20 30 29 3b 20 0a 20 20 20 20 20 20 20 20  x, 0); .        
1aa00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1aa10 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1aa20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1aa30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
1aa40 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1aa50 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1aa60 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  n contains the t
1aa70 65 78 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74  ext of an SQL st
1aa80 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20  atement.** that 
1aa90 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65  returns a single
1aaa0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20   integer value. 
1aab0 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  The statement is
1aac0 20 63 6f 6d 70 69 6c 65 64 20 61 6e 64 20 65 78   compiled and ex
1aad0 65 63 75 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  ecuted.** using 
1aae0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1aaf0 69 6f 6e 20 64 62 2e 20 49 66 20 73 75 63 63 65  ion db. If succe
1ab00 73 73 66 75 6c 2c 20 74 68 65 20 69 6e 74 65 67  ssful, the integ
1ab10 65 72 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  er value returne
1ab20 64 0a 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20  d.** is written 
1ab30 74 6f 20 2a 70 69 56 61 6c 20 61 6e 64 20 53 51  to *piVal and SQ
1ab40 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1ab50 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
1ab60 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
1ab70 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1ab80 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
1ab90 66 20 2a 70 69 56 61 6c 20 61 66 74 65 72 20 72  f *piVal after r
1aba0 65 74 75 72 6e 69 6e 67 20 69 73 20 6e 6f 74 20  eturning is not 
1abb0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
1abc0 69 63 20 69 6e 74 20 67 65 74 49 6e 74 46 72 6f  ic int getIntFro
1abd0 6d 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64  mStmt(sqlite3 *d
1abe0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1abf0 53 71 6c 2c 20 69 6e 74 20 2a 70 69 56 61 6c 29  Sql, int *piVal)
1ac00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1ac10 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28  ITE_NOMEM;.  if(
1ac20 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 73 71 6c   zSql ){.    sql
1ac30 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1ac40 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
1ac50 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1ac60 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
1ac70 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
1ac80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ac90 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  K ){.      if( S
1aca0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
1acb0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
1acc0 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 56 61 6c  {.        *piVal
1acd0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1ace0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
1acf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1ad00 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
1ad10 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
1ad20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ad30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1ad40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1ad50 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
1ad60 20 74 68 65 20 78 43 6f 6e 6e 65 63 74 28 29 20   the xConnect() 
1ad70 6f 72 20 78 43 72 65 61 74 65 28 29 20 6d 65 74  or xCreate() met
1ad80 68 6f 64 20 74 6f 0a 2a 2a 20 64 65 74 65 72 6d  hod to.** determ
1ad90 69 6e 65 20 74 68 65 20 6e 6f 64 65 2d 73 69 7a  ine the node-siz
1ada0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 72 74  e used by the rt
1adb0 72 65 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ree table being 
1adc0 63 72 65 61 74 65 64 20 6f 72 20 63 6f 6e 6e 65  created or conne
1add0 63 74 65 64 0a 2a 2a 20 74 6f 2e 20 49 66 20 73  cted.** to. If s
1ade0 75 63 63 65 73 73 66 75 6c 2c 20 70 52 74 72 65  uccessful, pRtre
1adf0 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 20 69 73 20  e->iNodeSize is 
1ae00 70 6f 70 75 6c 61 74 65 64 20 61 6e 64 20 53 51  populated and SQ
1ae10 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1ae20 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
1ae30 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1ae40 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1ae50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
1ae60 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
1ae70 67 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  g called as part
1ae80 20 6f 66 20 61 6e 20 78 43 6f 6e 6e 65 63 74 28   of an xConnect(
1ae90 29 2c 20 74 68 65 6e 20 74 68 65 20 72 74 72 65  ), then the rtre
1aea0 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6c 72 65 61  e.** table alrea
1aeb0 64 79 20 65 78 69 73 74 73 2e 20 49 6e 20 74 68  dy exists. In th
1aec0 69 73 20 63 61 73 65 20 74 68 65 20 6e 6f 64 65  is case the node
1aed0 2d 73 69 7a 65 20 69 73 20 64 65 74 65 72 6d 69  -size is determi
1aee0 6e 65 64 20 62 79 20 69 6e 73 70 65 63 74 69 6e  ned by inspectin
1aef0 67 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 6e 6f  g.** the root no
1af00 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a  de of the tree..
1af10 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1af20 20 66 6f 72 20 61 6e 20 78 43 72 65 61 74 65 28   for an xCreate(
1af30 29 2c 20 75 73 65 20 36 34 20 62 79 74 65 73 20  ), use 64 bytes 
1af40 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 64 61  less than the da
1af50 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65  tabase page-size
1af60 2e 20 0a 2a 2a 20 54 68 69 73 20 65 6e 73 75 72  . .** This ensur
1af70 65 73 20 74 68 61 74 20 65 61 63 68 20 6e 6f 64  es that each nod
1af80 65 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  e is stored on a
1af90 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
1afa0 20 70 61 67 65 2e 20 49 66 20 74 68 65 20 0a 2a   page. If the .*
1afb0 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  * database page-
1afc0 73 69 7a 65 20 69 73 20 73 6f 20 6c 61 72 67 65  size is so large
1afd0 20 74 68 61 74 20 6d 6f 72 65 20 74 68 61 6e 20   that more than 
1afe0 52 54 52 45 45 5f 4d 41 58 43 45 4c 4c 53 20 65  RTREE_MAXCELLS e
1aff0 6e 74 72 69 65 73 20 0a 2a 2a 20 77 6f 75 6c 64  ntries .** would
1b000 20 66 69 74 20 69 6e 20 61 20 73 69 6e 67 6c 65   fit in a single
1b010 20 6e 6f 64 65 2c 20 75 73 65 20 61 20 73 6d 61   node, use a sma
1b020 6c 6c 65 72 20 6e 6f 64 65 2d 73 69 7a 65 2e 0a  ller node-size..
1b030 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1b040 74 4e 6f 64 65 53 69 7a 65 28 0a 20 20 73 71 6c  tNodeSize(.  sql
1b050 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b070 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
1b080 2a 2f 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  */.  Rtree *pRtr
1b090 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
1b0a0 20 20 20 20 20 2f 2a 20 52 74 72 65 65 20 68 61       /* Rtree ha
1b0b0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ndle */.  int is
1b0c0 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20  Create,         
1b0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1b0e0 65 20 66 6f 72 20 78 43 72 65 61 74 65 2c 20 66  e for xCreate, f
1b0f0 61 6c 73 65 20 66 6f 72 20 78 43 6f 6e 6e 65 63  alse for xConnec
1b100 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  t */.  char **pz
1b110 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
1b120 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
1b130 72 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 69 66  rror message, if
1b140 20 61 6e 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   any */.){.  int
1b150 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71   rc;.  char *zSq
1b160 6c 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74  l;.  if( isCreat
1b170 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61  e ){.    int iPa
1b180 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  geSize = 0;.    
1b190 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
1b1a0 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25  printf("PRAGMA %
1b1b0 51 2e 70 61 67 65 5f 73 69 7a 65 22 2c 20 70 52  Q.page_size", pR
1b1c0 74 72 65 65 2d 3e 7a 44 62 29 3b 0a 20 20 20 20  tree->zDb);.    
1b1d0 72 63 20 3d 20 67 65 74 49 6e 74 46 72 6f 6d 53  rc = getIntFromS
1b1e0 74 6d 74 28 64 62 2c 20 7a 53 71 6c 2c 20 26 69  tmt(db, zSql, &i
1b1f0 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  PageSize);.    i
1b200 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b210 20 29 7b 0a 20 20 20 20 20 20 70 52 74 72 65 65   ){.      pRtree
1b220 2d 3e 69 4e 6f 64 65 53 69 7a 65 20 3d 20 69 50  ->iNodeSize = iP
1b230 61 67 65 53 69 7a 65 2d 36 34 3b 0a 20 20 20 20  ageSize-64;.    
1b240 20 20 69 66 28 20 28 34 2b 70 52 74 72 65 65 2d    if( (4+pRtree-
1b250 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 2a 52  >nBytesPerCell*R
1b260 54 52 45 45 5f 4d 41 58 43 45 4c 4c 53 29 3c 70  TREE_MAXCELLS)<p
1b270 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65  Rtree->iNodeSize
1b280 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 74 72   ){.        pRtr
1b290 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 20 3d 20  ee->iNodeSize = 
1b2a0 34 2b 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73  4+pRtree->nBytes
1b2b0 50 65 72 43 65 6c 6c 2a 52 54 52 45 45 5f 4d 41  PerCell*RTREE_MA
1b2c0 58 43 45 4c 4c 53 3b 0a 20 20 20 20 20 20 7d 0a  XCELLS;.      }.
1b2d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b2e0 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
1b2f0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
1b300 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
1b310 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  b));.    }.  }el
1b320 73 65 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  se{.    zSql = s
1b330 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
1b340 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
1b350 6c 65 6e 67 74 68 28 64 61 74 61 29 20 46 52 4f  length(data) FRO
1b360 4d 20 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27  M '%q'.'%q_node'
1b370 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f 20 3d 20   WHERE nodeno = 
1b380 31 22 2c 0a 20 20 20 20 20 20 20 20 70 52 74 72  1",.        pRtr
1b390 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d  ee->zDb, pRtree-
1b3a0 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
1b3b0 20 20 72 63 20 3d 20 67 65 74 49 6e 74 46 72 6f    rc = getIntFro
1b3c0 6d 53 74 6d 74 28 64 62 2c 20 7a 53 71 6c 2c 20  mStmt(db, zSql, 
1b3d0 26 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69  &pRtree->iNodeSi
1b3e0 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ze);.    if( rc!
1b3f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b400 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
1b410 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
1b420 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
1b430 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 65 6c 73  g(db));.    }els
1b440 65 20 69 66 28 20 70 52 74 72 65 65 2d 3e 69 4e  e if( pRtree->iN
1b450 6f 64 65 53 69 7a 65 3c 28 35 31 32 2d 36 34 29  odeSize<(512-64)
1b460 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1b470 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
1b480 41 42 3b 0a 20 20 20 20 20 20 52 54 52 45 45 5f  AB;.      RTREE_
1b490 49 53 5f 43 4f 52 52 55 50 54 28 70 52 74 72 65  IS_CORRUPT(pRtre
1b4a0 65 29 3b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72  e);.      *pzErr
1b4b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1b4c0 74 66 28 22 75 6e 64 65 72 73 69 7a 65 20 52 54  tf("undersize RT
1b4d0 72 65 65 20 62 6c 6f 62 73 20 69 6e 20 5c 22 25  ree blobs in \"%
1b4e0 71 5f 6e 6f 64 65 5c 22 22 2c 0a 20 20 20 20 20  q_node\"",.     
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b500 20 20 20 20 20 20 20 20 20 20 70 52 74 72 65 65            pRtree
1b510 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
1b520 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
1b530 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74  ree(zSql);.  ret
1b540 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
1b550 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1b560 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  is the implement
1b570 61 74 69 6f 6e 20 6f 66 20 62 6f 74 68 20 74 68  ation of both th
1b580 65 20 78 43 6f 6e 6e 65 63 74 20 61 6e 64 20 78  e xConnect and x
1b590 43 72 65 61 74 65 0a 2a 2a 20 6d 65 74 68 6f 64  Create.** method
1b5a0 73 20 6f 66 20 74 68 65 20 72 2d 74 72 65 65 20  s of the r-tree 
1b5b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
1b5c0 2a 0a 2a 2a 20 20 20 61 72 67 76 5b 30 5d 20 20  *.**   argv[0]  
1b5d0 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 0a   -> module name.
1b5e0 2a 2a 20 20 20 61 72 67 76 5b 31 5d 20 20 20 2d  **   argv[1]   -
1b5f0 3e 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a  > database name.
1b600 2a 2a 20 20 20 61 72 67 76 5b 32 5d 20 20 20 2d  **   argv[2]   -
1b610 3e 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20  > table name.** 
1b620 20 20 61 72 67 76 5b 2e 2e 2e 5d 20 2d 3e 20 63    argv[...] -> c
1b630 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 2e 2e 0a 2a  olumn names....*
1b640 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
1b650 65 65 49 6e 69 74 28 0a 20 20 73 71 6c 69 74 65  eeInit(.  sqlite
1b660 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b680 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1b690 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
1b6a0 70 41 75 78 2c 20 20 20 20 20 20 20 20 20 20 20  pAux,           
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b6c0 20 4f 6e 65 20 6f 66 20 74 68 65 20 52 54 52 45   One of the RTRE
1b6d0 45 5f 43 4f 4f 52 44 5f 2a 20 63 6f 6e 73 74 61  E_COORD_* consta
1b6e0 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  nts */.  int arg
1b6f0 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  c, const char *c
1b700 6f 6e 73 74 2a 61 72 67 76 2c 20 20 20 2f 2a 20  onst*argv,   /* 
1b710 50 61 72 61 6d 65 74 65 72 73 20 74 6f 20 43 52  Parameters to CR
1b720 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1b730 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ment */.  sqlite
1b740 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c  3_vtab **ppVtab,
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b760 20 4f 55 54 3a 20 4e 65 77 20 76 69 72 74 75 61   OUT: New virtua
1b770 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61  l table */.  cha
1b780 72 20 2a 2a 70 7a 45 72 72 2c 20 20 20 20 20 20  r **pzErr,      
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7a0 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d   /* OUT: Error m
1b7b0 65 73 73 61 67 65 2c 20 69 66 20 61 6e 79 20 2a  essage, if any *
1b7c0 2f 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  /.  int isCreate
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1b7f0 66 6f 72 20 78 43 72 65 61 74 65 2c 20 66 61 6c  for xCreate, fal
1b800 73 65 20 66 6f 72 20 78 43 6f 6e 6e 65 63 74 20  se for xConnect 
1b810 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
1b820 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52 74   SQLITE_OK;.  Rt
1b830 72 65 65 20 2a 70 52 74 72 65 65 3b 0a 20 20 69  ree *pRtree;.  i
1b840 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20  nt nDb;         
1b850 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
1b860 66 20 73 74 72 69 6e 67 20 61 72 67 76 5b 31 5d  f string argv[1]
1b870 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
1b880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1b890 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
1b8a0 61 72 67 76 5b 32 5d 20 2a 2f 0a 20 20 69 6e 74  argv[2] */.  int
1b8b0 20 65 43 6f 6f 72 64 54 79 70 65 20 3d 20 28 70   eCoordType = (p
1b8c0 41 75 78 20 3f 20 52 54 52 45 45 5f 43 4f 4f 52  Aux ? RTREE_COOR
1b8d0 44 5f 49 4e 54 33 32 20 3a 20 52 54 52 45 45 5f  D_INT32 : RTREE_
1b8e0 43 4f 4f 52 44 5f 52 45 41 4c 33 32 29 3b 0a 20  COORD_REAL32);. 
1b8f0 20 73 71 6c 69 74 65 33 5f 73 74 72 20 2a 70 53   sqlite3_str *pS
1b900 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ql;.  char *zSql
1b910 3b 0a 20 20 69 6e 74 20 69 69 20 3d 20 34 3b 0a  ;.  int ii = 4;.
1b920 20 20 69 6e 74 20 69 45 72 72 3b 0a 0a 20 20 63    int iErr;..  c
1b930 6f 6e 73 74 20 63 68 61 72 20 2a 61 45 72 72 4d  onst char *aErrM
1b940 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20  sg[] = {.    0, 
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b980 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 22     /* 0 */.    "
1b990 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  Wrong number of 
1b9a0 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 61 6e 20 72  columns for an r
1b9b0 74 72 65 65 20 74 61 62 6c 65 22 2c 20 20 20 20  tree table",    
1b9c0 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20       /* 1 */.   
1b9d0 20 22 54 6f 6f 20 66 65 77 20 63 6f 6c 75 6d 6e   "Too few column
1b9e0 73 20 66 6f 72 20 61 6e 20 72 74 72 65 65 20 74  s for an rtree t
1b9f0 61 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  able",          
1ba00 20 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20         /* 2 */. 
1ba10 20 20 20 22 54 6f 6f 20 6d 61 6e 79 20 63 6f 6c     "Too many col
1ba20 75 6d 6e 73 20 66 6f 72 20 61 6e 20 72 74 72 65  umns for an rtre
1ba30 65 20 74 61 62 6c 65 22 2c 20 20 20 20 20 20 20  e table",       
1ba40 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f           /* 3 */
1ba50 0a 20 20 20 20 22 41 75 78 69 6c 69 61 72 79 20  .    "Auxiliary 
1ba60 72 74 72 65 65 20 63 6f 6c 75 6d 6e 73 20 6d 75  rtree columns mu
1ba70 73 74 20 62 65 20 6c 61 73 74 22 20 20 20 20 20  st be last"     
1ba80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20             /* 4 
1ba90 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 61 73 73 65 72  */.  };..  asser
1baa0 74 28 20 52 54 52 45 45 5f 4d 41 58 5f 41 55 58  t( RTREE_MAX_AUX
1bab0 5f 43 4f 4c 55 4d 4e 3c 32 35 36 20 29 3b 20 2f  _COLUMN<256 ); /
1bac0 2a 20 41 75 78 20 63 6f 6c 75 6d 6e 73 20 63 6f  * Aux columns co
1bad0 75 6e 74 65 64 20 62 79 20 61 20 75 38 20 2a 2f  unted by a u8 */
1bae0 0a 20 20 69 66 28 20 61 72 67 63 3e 52 54 52 45  .  if( argc>RTRE
1baf0 45 5f 4d 41 58 5f 41 55 58 5f 43 4f 4c 55 4d 4e  E_MAX_AUX_COLUMN
1bb00 2b 33 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  +3 ){.    *pzErr
1bb10 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1bb20 74 66 28 22 25 73 22 2c 20 61 45 72 72 4d 73 67  tf("%s", aErrMsg
1bb30 5b 33 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  [3]);.    return
1bb40 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1bb50 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 74   }..  sqlite3_vt
1bb60 61 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51  ab_config(db, SQ
1bb70 4c 49 54 45 5f 56 54 41 42 5f 43 4f 4e 53 54 52  LITE_VTAB_CONSTR
1bb80 41 49 4e 54 5f 53 55 50 50 4f 52 54 2c 20 31 29  AINT_SUPPORT, 1)
1bb90 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1bba0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
1bbb0 62 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  b structure */. 
1bbc0 20 6e 44 62 20 3d 20 28 69 6e 74 29 73 74 72 6c   nDb = (int)strl
1bbd0 65 6e 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 6e  en(argv[1]);.  n
1bbe0 4e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  Name = (int)strl
1bbf0 65 6e 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 70  en(argv[2]);.  p
1bc00 52 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a  Rtree = (Rtree *
1bc10 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36  )sqlite3_malloc6
1bc20 34 28 73 69 7a 65 6f 66 28 52 74 72 65 65 29 2b  4(sizeof(Rtree)+
1bc30 6e 44 62 2b 6e 4e 61 6d 65 2b 32 29 3b 0a 20 20  nDb+nName+2);.  
1bc40 69 66 28 20 21 70 52 74 72 65 65 20 29 7b 0a 20  if( !pRtree ){. 
1bc50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bc60 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
1bc70 6d 73 65 74 28 70 52 74 72 65 65 2c 20 30 2c 20  mset(pRtree, 0, 
1bc80 73 69 7a 65 6f 66 28 52 74 72 65 65 29 2b 6e 44  sizeof(Rtree)+nD
1bc90 62 2b 6e 4e 61 6d 65 2b 32 29 3b 0a 20 20 70 52  b+nName+2);.  pR
1bca0 74 72 65 65 2d 3e 6e 42 75 73 79 20 3d 20 31 3b  tree->nBusy = 1;
1bcb0 0a 20 20 70 52 74 72 65 65 2d 3e 62 61 73 65 2e  .  pRtree->base.
1bcc0 70 4d 6f 64 75 6c 65 20 3d 20 26 72 74 72 65 65  pModule = &rtree
1bcd0 4d 6f 64 75 6c 65 3b 0a 20 20 70 52 74 72 65 65  Module;.  pRtree
1bce0 2d 3e 7a 44 62 20 3d 20 28 63 68 61 72 20 2a 29  ->zDb = (char *)
1bcf0 26 70 52 74 72 65 65 5b 31 5d 3b 0a 20 20 70 52  &pRtree[1];.  pR
1bd00 74 72 65 65 2d 3e 7a 4e 61 6d 65 20 3d 20 26 70  tree->zName = &p
1bd10 52 74 72 65 65 2d 3e 7a 44 62 5b 6e 44 62 2b 31  Rtree->zDb[nDb+1
1bd20 5d 3b 0a 20 20 70 52 74 72 65 65 2d 3e 65 43 6f  ];.  pRtree->eCo
1bd30 6f 72 64 54 79 70 65 20 3d 20 28 75 38 29 65 43  ordType = (u8)eC
1bd40 6f 6f 72 64 54 79 70 65 3b 0a 20 20 6d 65 6d 63  oordType;.  memc
1bd50 70 79 28 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20  py(pRtree->zDb, 
1bd60 61 72 67 76 5b 31 5d 2c 20 6e 44 62 29 3b 0a 20  argv[1], nDb);. 
1bd70 20 6d 65 6d 63 70 79 28 70 52 74 72 65 65 2d 3e   memcpy(pRtree->
1bd80 7a 4e 61 6d 65 2c 20 61 72 67 76 5b 32 5d 2c 20  zName, argv[2], 
1bd90 6e 4e 61 6d 65 29 3b 0a 0a 0a 20 20 2f 2a 20 43  nName);...  /* C
1bda0 72 65 61 74 65 2f 43 6f 6e 6e 65 63 74 20 74 6f  reate/Connect to
1bdb0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1bdc0 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61 74 61 62  relational datab
1bdd0 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 0a 20  ase schema. If. 
1bde0 20 2a 2a 20 74 68 61 74 20 69 73 20 73 75 63 63   ** that is succ
1bdf0 65 73 73 66 75 6c 2c 20 63 61 6c 6c 20 73 71 6c  essful, call sql
1be00 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
1be10 62 28 29 20 74 6f 20 63 6f 6e 66 69 67 75 72 65  b() to configure
1be20 0a 20 20 2a 2a 20 74 68 65 20 72 2d 74 72 65 65  .  ** the r-tree
1be30 20 74 61 62 6c 65 20 73 63 68 65 6d 61 2e 0a 20   table schema.. 
1be40 20 2a 2f 0a 20 20 70 53 71 6c 20 3d 20 73 71 6c   */.  pSql = sql
1be50 69 74 65 33 5f 73 74 72 5f 6e 65 77 28 64 62 29  ite3_str_new(db)
1be60 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f  ;.  sqlite3_str_
1be70 61 70 70 65 6e 64 66 28 70 53 71 6c 2c 20 22 43  appendf(pSql, "C
1be80 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 25 73  REATE TABLE x(%s
1be90 22 2c 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 66  ", argv[3]);.  f
1bea0 6f 72 28 69 69 3d 34 3b 20 69 69 3c 61 72 67 63  or(ii=4; ii<argc
1beb0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
1bec0 20 61 72 67 76 5b 69 69 5d 5b 30 5d 3d 3d 27 2b   argv[ii][0]=='+
1bed0 27 20 29 7b 0a 20 20 20 20 20 20 70 52 74 72 65  ' ){.      pRtre
1bee0 65 2d 3e 6e 41 75 78 2b 2b 3b 0a 20 20 20 20 20  e->nAux++;.     
1bef0 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
1bf00 65 6e 64 66 28 70 53 71 6c 2c 20 22 2c 25 73 22  endf(pSql, ",%s"
1bf10 2c 20 61 72 67 76 5b 69 69 5d 2b 31 29 3b 0a 20  , argv[ii]+1);. 
1bf20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 74     }else if( pRt
1bf30 72 65 65 2d 3e 6e 41 75 78 3e 30 20 29 7b 0a 20  ree->nAux>0 ){. 
1bf40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bf50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 74  }else{.      pRt
1bf60 72 65 65 2d 3e 6e 44 69 6d 32 2b 2b 3b 0a 20 20  ree->nDim2++;.  
1bf70 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
1bf80 61 70 70 65 6e 64 66 28 70 53 71 6c 2c 20 22 2c  appendf(pSql, ",
1bf90 25 73 22 2c 20 61 72 67 76 5b 69 69 5d 29 3b 0a  %s", argv[ii]);.
1bfa0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1bfb0 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
1bfc0 70 53 71 6c 2c 20 22 29 3b 22 29 3b 0a 20 20 7a  pSql, ");");.  z
1bfd0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Sql = sqlite3_st
1bfe0 72 5f 66 69 6e 69 73 68 28 70 53 71 6c 29 3b 0a  r_finish(pSql);.
1bff0 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20    if( !zSql ){. 
1c000 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1c010 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OMEM;.  }else if
1c020 28 20 69 69 3c 61 72 67 63 20 29 7b 0a 20 20 20  ( ii<argc ){.   
1c030 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
1c040 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
1c050 61 45 72 72 4d 73 67 5b 34 5d 29 3b 0a 20 20 20  aErrMsg[4]);.   
1c060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1c070 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OR;.  }else if( 
1c080 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
1c090 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
1c0a0 5f 76 74 61 62 28 64 62 2c 20 7a 53 71 6c 29 29  _vtab(db, zSql))
1c0b0 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d   ){.    *pzErr =
1c0c0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1c0d0 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
1c0e0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
1c0f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1c100 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Sql);.  if( rc )
1c110 20 67 6f 74 6f 20 72 74 72 65 65 49 6e 69 74 5f   goto rtreeInit_
1c120 66 61 69 6c 3b 0a 20 20 70 52 74 72 65 65 2d 3e  fail;.  pRtree->
1c130 6e 44 69 6d 20 3d 20 70 52 74 72 65 65 2d 3e 6e  nDim = pRtree->n
1c140 44 69 6d 32 2f 32 3b 0a 20 20 69 66 28 20 70 52  Dim2/2;.  if( pR
1c150 74 72 65 65 2d 3e 6e 44 69 6d 3c 31 20 29 7b 0a  tree->nDim<1 ){.
1c160 20 20 20 20 69 45 72 72 20 3d 20 32 3b 0a 20 20      iErr = 2;.  
1c170 7d 65 6c 73 65 20 69 66 28 20 70 52 74 72 65 65  }else if( pRtree
1c180 2d 3e 6e 44 69 6d 32 3e 52 54 52 45 45 5f 4d 41  ->nDim2>RTREE_MA
1c190 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 2a 32 20 29  X_DIMENSIONS*2 )
1c1a0 7b 0a 20 20 20 20 69 45 72 72 20 3d 20 33 3b 0a  {.    iErr = 3;.
1c1b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 74 72    }else if( pRtr
1c1c0 65 65 2d 3e 6e 44 69 6d 32 20 25 20 32 20 29 7b  ee->nDim2 % 2 ){
1c1d0 0a 20 20 20 20 69 45 72 72 20 3d 20 31 3b 0a 20  .    iErr = 1;. 
1c1e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 45 72 72   }else{.    iErr
1c1f0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1c200 69 45 72 72 20 29 7b 0a 20 20 20 20 2a 70 7a 45  iErr ){.    *pzE
1c210 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
1c220 69 6e 74 66 28 22 25 73 22 2c 20 61 45 72 72 4d  intf("%s", aErrM
1c230 73 67 5b 69 45 72 72 5d 29 3b 0a 20 20 20 20 67  sg[iErr]);.    g
1c240 6f 74 6f 20 72 74 72 65 65 49 6e 69 74 5f 66 61  oto rtreeInit_fa
1c250 69 6c 3b 0a 20 20 7d 0a 20 20 70 52 74 72 65 65  il;.  }.  pRtree
1c260 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 20  ->nBytesPerCell 
1c270 3d 20 38 20 2b 20 70 52 74 72 65 65 2d 3e 6e 44  = 8 + pRtree->nD
1c280 69 6d 32 2a 34 3b 0a 0a 20 20 2f 2a 20 46 69 67  im2*4;..  /* Fig
1c290 75 72 65 20 6f 75 74 20 74 68 65 20 6e 6f 64 65  ure out the node
1c2a0 20 73 69 7a 65 20 74 6f 20 75 73 65 2e 20 2a 2f   size to use. */
1c2b0 0a 20 20 72 63 20 3d 20 67 65 74 4e 6f 64 65 53  .  rc = getNodeS
1c2c0 69 7a 65 28 64 62 2c 20 70 52 74 72 65 65 2c 20  ize(db, pRtree, 
1c2d0 69 73 43 72 65 61 74 65 2c 20 70 7a 45 72 72 29  isCreate, pzErr)
1c2e0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
1c2f0 6f 20 72 74 72 65 65 49 6e 69 74 5f 66 61 69 6c  o rtreeInit_fail
1c300 3b 0a 20 20 72 63 20 3d 20 72 74 72 65 65 53 71  ;.  rc = rtreeSq
1c310 6c 49 6e 69 74 28 70 52 74 72 65 65 2c 20 64 62  lInit(pRtree, db
1c320 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b  , argv[1], argv[
1c330 32 5d 2c 20 69 73 43 72 65 61 74 65 29 3b 0a 20  2], isCreate);. 
1c340 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
1c350 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
1c360 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
1c370 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
1c380 29 3b 0a 20 20 20 20 67 6f 74 6f 20 72 74 72 65  );.    goto rtre
1c390 65 49 6e 69 74 5f 66 61 69 6c 3b 0a 20 20 7d 0a  eInit_fail;.  }.
1c3a0 0a 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71  .  *ppVtab = (sq
1c3b0 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 70 52 74  lite3_vtab *)pRt
1c3c0 72 65 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ree;.  return SQ
1c3d0 4c 49 54 45 5f 4f 4b 3b 0a 0a 72 74 72 65 65 49  LITE_OK;..rtreeI
1c3e0 6e 69 74 5f 66 61 69 6c 3a 0a 20 20 69 66 28 20  nit_fail:.  if( 
1c3f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
1c400 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1c410 52 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  R;.  assert( *pp
1c420 56 74 61 62 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Vtab==0 );.  ass
1c430 65 72 74 28 20 70 52 74 72 65 65 2d 3e 6e 42 75  ert( pRtree->nBu
1c440 73 79 3d 3d 31 20 29 3b 0a 20 20 72 74 72 65 65  sy==1 );.  rtree
1c450 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 29 3b  Release(pRtree);
1c460 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c470 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1c480 74 61 74 69 6f 6e 20 6f 66 20 61 20 73 63 61 6c  tation of a scal
1c490 61 72 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ar function that
1c4a0 20 64 65 63 6f 64 65 73 20 72 2d 74 72 65 65 20   decodes r-tree 
1c4b0 6e 6f 64 65 73 20 74 6f 0a 2a 2a 20 68 75 6d 61  nodes to.** huma
1c4c0 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e  n readable strin
1c4d0 67 73 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20  gs. This can be 
1c4e0 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
1c4f0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 2e  ng and analysis.
1c500 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6c 61  .**.** The scala
1c510 72 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  r function takes
1c520 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 3a 20   two arguments: 
1c530 28 31 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  (1) the number o
1c540 66 20 64 69 6d 65 6e 73 69 6f 6e 73 0a 2a 2a 20  f dimensions.** 
1c550 74 6f 20 74 68 65 20 72 74 72 65 65 20 28 62 65  to the rtree (be
1c560 74 77 65 65 6e 20 31 20 61 6e 64 20 35 2c 20 69  tween 1 and 5, i
1c570 6e 63 6c 75 73 69 76 65 29 20 61 6e 64 20 28 32  nclusive) and (2
1c580 29 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  ) a blob of data
1c590 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61   containing.** a
1c5a0 6e 20 72 2d 74 72 65 65 20 6e 6f 64 65 2e 20 20  n r-tree node.  
1c5b0 46 6f 72 20 61 20 74 77 6f 2d 64 69 6d 65 6e 73  For a two-dimens
1c5c0 69 6f 6e 61 6c 20 72 2d 74 72 65 65 20 73 74 72  ional r-tree str
1c5d0 75 63 74 75 72 65 20 63 61 6c 6c 65 64 20 22 72  ucture called "r
1c5e0 74 22 2c 20 74 6f 0a 2a 2a 20 64 65 73 65 72 69  t", to.** deseri
1c5f0 61 6c 69 7a 65 20 61 6c 6c 20 6e 6f 64 65 73 2c  alize all nodes,
1c600 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6c 69 6b   a statement lik
1c610 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  e:.**.**   SELEC
1c620 54 20 72 74 72 65 65 6e 6f 64 65 28 32 2c 20 64  T rtreenode(2, d
1c630 61 74 61 29 20 46 52 4f 4d 20 72 74 5f 6e 6f 64  ata) FROM rt_nod
1c640 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 75 6d  e;.**.** The hum
1c650 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69  an readable stri
1c660 6e 67 20 74 61 6b 65 73 20 74 68 65 20 66 6f 72  ng takes the for
1c670 6d 20 6f 66 20 61 20 54 63 6c 20 6c 69 73 74 20  m of a Tcl list 
1c680 77 69 74 68 20 6f 6e 65 0a 2a 2a 20 65 6e 74 72  with one.** entr
1c690 79 20 66 6f 72 20 65 61 63 68 20 63 65 6c 6c 20  y for each cell 
1c6a0 69 6e 20 74 68 65 20 72 2d 74 72 65 65 20 6e 6f  in the r-tree no
1c6b0 64 65 2e 20 45 61 63 68 20 65 6e 74 72 79 20 69  de. Each entry i
1c6c0 73 20 69 74 73 65 6c 66 20 61 0a 2a 2a 20 6c 69  s itself a.** li
1c6d0 73 74 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  st, containing t
1c6e0 68 65 20 38 2d 62 79 74 65 20 72 6f 77 69 64 2f  he 8-byte rowid/
1c6f0 70 61 67 65 6e 6f 20 66 6f 6c 6c 6f 77 65 64 20  pageno followed 
1c700 62 79 20 74 68 65 20 0a 2a 2a 20 3c 6e 75 6d 2d  by the .** <num-
1c710 64 69 6d 65 6e 73 69 6f 6e 3e 2a 32 20 63 6f 6f  dimension>*2 coo
1c720 72 64 69 6e 61 74 65 73 2e 0a 2a 2f 0a 73 74 61  rdinates..*/.sta
1c730 74 69 63 20 76 6f 69 64 20 72 74 72 65 65 6e 6f  tic void rtreeno
1c740 64 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  de(sqlite3_conte
1c750 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72  xt *ctx, int nAr
1c760 67 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  g, sqlite3_value
1c770 20 2a 2a 61 70 41 72 67 29 7b 0a 20 20 52 74 72   **apArg){.  Rtr
1c780 65 65 4e 6f 64 65 20 6e 6f 64 65 3b 0a 20 20 52  eeNode node;.  R
1c790 74 72 65 65 20 74 72 65 65 3b 0a 20 20 69 6e 74  tree tree;.  int
1c7a0 20 69 69 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61   ii;.  int nData
1c7b0 3b 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  ;.  int errCode;
1c7c0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 20 2a  .  sqlite3_str *
1c7d0 70 4f 75 74 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  pOut;..  UNUSED_
1c7e0 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b  PARAMETER(nArg);
1c7f0 0a 20 20 6d 65 6d 73 65 74 28 26 6e 6f 64 65 2c  .  memset(&node,
1c800 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65   0, sizeof(Rtree
1c810 4e 6f 64 65 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Node));.  memset
1c820 28 26 74 72 65 65 2c 20 30 2c 20 73 69 7a 65 6f  (&tree, 0, sizeo
1c830 66 28 52 74 72 65 65 29 29 3b 0a 20 20 74 72 65  f(Rtree));.  tre
1c840 65 2e 6e 44 69 6d 20 3d 20 28 75 38 29 73 71 6c  e.nDim = (u8)sql
1c850 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
1c860 70 41 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20  pArg[0]);.  if( 
1c870 74 72 65 65 2e 6e 44 69 6d 3c 31 20 7c 7c 20 74  tree.nDim<1 || t
1c880 72 65 65 2e 6e 44 69 6d 3e 35 20 29 20 72 65 74  ree.nDim>5 ) ret
1c890 75 72 6e 3b 0a 20 20 74 72 65 65 2e 6e 44 69 6d  urn;.  tree.nDim
1c8a0 32 20 3d 20 74 72 65 65 2e 6e 44 69 6d 2a 32 3b  2 = tree.nDim*2;
1c8b0 0a 20 20 74 72 65 65 2e 6e 42 79 74 65 73 50 65  .  tree.nBytesPe
1c8c0 72 43 65 6c 6c 20 3d 20 38 20 2b 20 38 20 2a 20  rCell = 8 + 8 * 
1c8d0 74 72 65 65 2e 6e 44 69 6d 3b 0a 20 20 6e 6f 64  tree.nDim;.  nod
1c8e0 65 2e 7a 44 61 74 61 20 3d 20 28 75 38 20 2a 29  e.zData = (u8 *)
1c8f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
1c900 6f 62 28 61 70 41 72 67 5b 31 5d 29 3b 0a 20 20  ob(apArg[1]);.  
1c910 6e 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  nData = sqlite3_
1c920 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 41 72  value_bytes(apAr
1c930 67 5b 31 5d 29 3b 0a 20 20 69 66 28 20 6e 44 61  g[1]);.  if( nDa
1c940 74 61 3c 34 20 29 20 72 65 74 75 72 6e 3b 0a 20  ta<4 ) return;. 
1c950 20 69 66 28 20 6e 44 61 74 61 3c 4e 43 45 4c 4c   if( nData<NCELL
1c960 28 26 6e 6f 64 65 29 2a 74 72 65 65 2e 6e 42 79  (&node)*tree.nBy
1c970 74 65 73 50 65 72 43 65 6c 6c 20 29 20 72 65 74  tesPerCell ) ret
1c980 75 72 6e 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 73  urn;..  pOut = s
1c990 71 6c 69 74 65 33 5f 73 74 72 5f 6e 65 77 28 30  qlite3_str_new(0
1c9a0 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  );.  for(ii=0; i
1c9b0 69 3c 4e 43 45 4c 4c 28 26 6e 6f 64 65 29 3b 20  i<NCELL(&node); 
1c9c0 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65  ii++){.    Rtree
1c9d0 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20 20 69  Cell cell;.    i
1c9e0 6e 74 20 6a 6a 3b 0a 0a 20 20 20 20 6e 6f 64 65  nt jj;..    node
1c9f0 47 65 74 43 65 6c 6c 28 26 74 72 65 65 2c 20 26  GetCell(&tree, &
1ca00 6e 6f 64 65 2c 20 69 69 2c 20 26 63 65 6c 6c 29  node, ii, &cell)
1ca10 3b 0a 20 20 20 20 69 66 28 20 69 69 3e 30 20 29  ;.    if( ii>0 )
1ca20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
1ca30 65 6e 64 28 70 4f 75 74 2c 20 22 20 22 2c 20 31  end(pOut, " ", 1
1ca40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
1ca50 74 72 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c  tr_appendf(pOut,
1ca60 20 22 7b 25 6c 6c 64 22 2c 20 63 65 6c 6c 2e 69   "{%lld", cell.i
1ca70 52 6f 77 69 64 29 3b 0a 20 20 20 20 66 6f 72 28  Rowid);.    for(
1ca80 6a 6a 3d 30 3b 20 6a 6a 3c 74 72 65 65 2e 6e 44  jj=0; jj<tree.nD
1ca90 69 6d 32 3b 20 6a 6a 2b 2b 29 7b 0a 23 69 66 6e  im2; jj++){.#ifn
1caa0 64 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45  def SQLITE_RTREE
1cab0 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 20 20  _INT_ONLY.      
1cac0 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
1cad0 6e 64 66 28 70 4f 75 74 2c 20 22 20 25 67 22 2c  ndf(pOut, " %g",
1cae0 20 28 64 6f 75 62 6c 65 29 63 65 6c 6c 2e 61 43   (double)cell.aC
1caf0 6f 6f 72 64 5b 6a 6a 5d 2e 66 29 3b 0a 23 65 6c  oord[jj].f);.#el
1cb00 73 65 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  se.      sqlite3
1cb10 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 4f 75  _str_appendf(pOu
1cb20 74 2c 20 22 20 25 64 22 2c 20 63 65 6c 6c 2e 61  t, " %d", cell.a
1cb30 43 6f 6f 72 64 5b 6a 6a 5d 2e 69 29 3b 0a 23 65  Coord[jj].i);.#e
1cb40 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
1cb50 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
1cb60 64 28 70 4f 75 74 2c 20 22 7d 22 2c 20 31 29 3b  d(pOut, "}", 1);
1cb70 0a 20 20 7d 0a 20 20 65 72 72 43 6f 64 65 20 3d  .  }.  errCode =
1cb80 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 65 72 72   sqlite3_str_err
1cb90 63 6f 64 65 28 70 4f 75 74 29 3b 0a 20 20 73 71  code(pOut);.  sq
1cba0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
1cbb0 74 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 73  t(ctx, sqlite3_s
1cbc0 74 72 5f 66 69 6e 69 73 68 28 70 4f 75 74 29 2c  tr_finish(pOut),
1cbd0 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
1cbe0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  e);.  sqlite3_re
1cbf0 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
1cc00 63 74 78 2c 20 65 72 72 43 6f 64 65 29 3b 0a 7d  ctx, errCode);.}
1cc10 0a 0a 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ../* This routin
1cc20 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20  e implements an 
1cc30 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  SQL function tha
1cc40 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 22 64  t returns the "d
1cc50 65 70 74 68 22 20 70 61 72 61 6d 65 74 65 72 0a  epth" parameter.
1cc60 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 6f 6e  ** from the fron
1cc70 74 20 6f 66 20 61 20 62 6c 6f 62 20 74 68 61 74  t of a blob that
1cc80 20 69 73 20 61 6e 20 72 2d 74 72 65 65 20 6e 6f   is an r-tree no
1cc90 64 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  de.  For example
1cca0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
1ccb0 43 54 20 72 74 72 65 65 64 65 70 74 68 28 64 61  CT rtreedepth(da
1ccc0 74 61 29 20 46 52 4f 4d 20 72 74 5f 6e 6f 64 65  ta) FROM rt_node
1ccd0 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f 3d 31 3b   WHERE nodeno=1;
1cce0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 70 74 68  .**.** The depth
1ccf0 20 76 61 6c 75 65 20 69 73 20 30 20 66 6f 72 20   value is 0 for 
1cd00 61 6c 6c 20 6e 6f 64 65 73 20 6f 74 68 65 72 20  all nodes other 
1cd10 74 68 61 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f  than the root no
1cd20 64 65 2c 20 61 6e 64 20 74 68 65 20 72 6f 6f 74  de, and the root
1cd30 0a 2a 2a 20 6e 6f 64 65 20 61 6c 77 61 79 73 20  .** node always 
1cd40 68 61 73 20 6e 6f 64 65 6e 6f 3d 31 2c 20 73 6f  has nodeno=1, so
1cd50 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
1cd60 76 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  ve is the primar
1cd70 79 20 75 73 65 20 66 6f 72 20 74 68 69 73 0a 2a  y use for this.*
1cd80 2a 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 69 73  * routine.  This
1cd90 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 74 65   routine is inte
1cda0 6e 64 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  nded for testing
1cdb0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
1cdc0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
1cdd0 69 64 20 72 74 72 65 65 64 65 70 74 68 28 73 71  id rtreedepth(sq
1cde0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1cdf0 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71  tx, int nArg, sq
1ce00 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1ce10 41 72 67 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg){.  UNUSED_P
1ce20 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a  ARAMETER(nArg);.
1ce30 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
1ce40 6c 75 65 5f 74 79 70 65 28 61 70 41 72 67 5b 30  lue_type(apArg[0
1ce50 5d 29 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  ])!=SQLITE_BLOB 
1ce60 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76  .   || sqlite3_v
1ce70 61 6c 75 65 5f 62 79 74 65 73 28 61 70 41 72 67  alue_bytes(apArg
1ce80 5b 30 5d 29 3c 32 0a 20 20 29 7b 0a 20 20 20 20  [0])<2.  ){.    
1ce90 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
1cea0 72 72 6f 72 28 63 74 78 2c 20 22 49 6e 76 61 6c  rror(ctx, "Inval
1ceb0 69 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 72  id argument to r
1cec0 74 72 65 65 64 65 70 74 68 28 29 22 2c 20 2d 31  treedepth()", -1
1ced0 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ); .  }else{.   
1cee0 20 75 38 20 2a 7a 42 6c 6f 62 20 3d 20 28 75 38   u8 *zBlob = (u8
1cef0 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
1cf00 5f 62 6c 6f 62 28 61 70 41 72 67 5b 30 5d 29 3b  _blob(apArg[0]);
1cf10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
1cf20 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 72 65 61  ult_int(ctx, rea
1cf30 64 49 6e 74 31 36 28 7a 42 6c 6f 62 29 29 3b 0a  dInt16(zBlob));.
1cf40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
1cf50 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73  text object pass
1cf60 65 64 20 62 65 74 77 65 65 6e 20 74 68 65 20 76  ed between the v
1cf70 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20  arious routines 
1cf80 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
1cf90 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
1cfa0 6f 6e 20 6f 66 20 69 6e 74 65 67 72 69 74 79 2d  on of integrity-
1cfb0 63 68 65 63 6b 20 66 75 6e 63 74 69 6f 6e 20 72  check function r
1cfc0 74 72 65 65 63 68 65 63 6b 28 29 2e 0a 2a 2f 0a  treecheck()..*/.
1cfd0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52  typedef struct R
1cfe0 74 72 65 65 43 68 65 63 6b 20 52 74 72 65 65 43  treeCheck RtreeC
1cff0 68 65 63 6b 3b 0a 73 74 72 75 63 74 20 52 74 72  heck;.struct Rtr
1d000 65 65 43 68 65 63 6b 20 7b 0a 20 20 73 71 6c 69  eeCheck {.  sqli
1d010 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
1d020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1d030 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
1d040 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1d050 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
1d060 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1d070 63 6f 6e 74 61 69 6e 69 6e 67 20 72 74 72 65 65  containing rtree
1d080 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73   table */.  cons
1d090 74 20 63 68 61 72 20 2a 7a 54 61 62 3b 20 20 20  t char *zTab;   
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d0b0 61 6d 65 20 6f 66 20 72 74 72 65 65 20 74 61 62  ame of rtree tab
1d0c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 74  le */.  int bInt
1d0d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d0e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d0f0 66 6f 72 20 72 74 72 65 65 5f 69 33 32 20 74 61  for rtree_i32 ta
1d100 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69  ble */.  int nDi
1d110 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1d120 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d130 65 72 20 6f 66 20 64 69 6d 65 6e 73 69 6f 6e 73  er of dimensions
1d140 20 66 6f 72 20 74 68 69 73 20 72 74 72 65 65 20   for this rtree 
1d150 74 62 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tbl */.  sqlite3
1d160 5f 73 74 6d 74 20 2a 70 47 65 74 4e 6f 64 65 3b  _stmt *pGetNode;
1d170 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
1d180 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 72 65  ement used to re
1d190 74 72 69 65 76 65 20 6e 6f 64 65 73 20 2a 2f 0a  trieve nodes */.
1d1a0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1d1b0 61 43 68 65 63 6b 4d 61 70 70 69 6e 67 5b 32 5d  aCheckMapping[2]
1d1c0 3b 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73 20  ; /* Statements 
1d1d0 74 6f 20 71 75 65 72 79 20 25 5f 70 61 72 65 6e  to query %_paren
1d1e0 74 2f 25 5f 72 6f 77 69 64 20 2a 2f 0a 20 20 69  t/%_rowid */.  i
1d1f0 6e 74 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  nt nLeaf;       
1d200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d210 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
1d220 20 63 65 6c 6c 73 20 69 6e 20 74 61 62 6c 65 20   cells in table 
1d230 2a 2f 0a 20 20 69 6e 74 20 6e 4e 6f 6e 4c 65 61  */.  int nNonLea
1d240 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1d250 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d260 66 20 6e 6f 6e 2d 6c 65 61 66 20 63 65 6c 6c 73  f non-leaf cells
1d270 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69   in table */.  i
1d280 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d2a0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1d2b0 0a 20 20 63 68 61 72 20 2a 7a 52 65 70 6f 72 74  .  char *zReport
1d2c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d2d0 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 74 6f     /* Message to
1d2e0 20 72 65 70 6f 72 74 20 2a 2f 0a 20 20 69 6e 74   report */.  int
1d2f0 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20 20   nErr;          
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d310 4e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20  Number of lines 
1d320 69 6e 20 7a 52 65 70 6f 72 74 20 2a 2f 0a 7d 3b  in zReport */.};
1d330 0a 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f  ..#define RTREE_
1d340 43 48 45 43 4b 5f 4d 41 58 5f 45 52 52 4f 52 20  CHECK_MAX_ERROR 
1d350 31 30 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  100../*.** Reset
1d360 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70   SQL statement p
1d370 53 74 6d 74 2e 20 49 66 20 74 68 65 20 73 71 6c  Stmt. If the sql
1d380 69 74 65 33 5f 72 65 73 65 74 28 29 20 63 61 6c  ite3_reset() cal
1d390 6c 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  l returns an err
1d3a0 6f 72 2c 0a 2a 2a 20 61 6e 64 20 52 74 72 65 65  or,.** and Rtree
1d3b0 43 68 65 63 6b 2e 72 63 3d 3d 53 51 4c 49 54 45  Check.rc==SQLITE
1d3c0 5f 4f 4b 2c 20 73 65 74 20 52 74 72 65 65 43 68  _OK, set RtreeCh
1d3d0 65 63 6b 2e 72 63 20 74 6f 20 74 68 65 20 65 72  eck.rc to the er
1d3e0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
1d3f0 74 69 63 20 76 6f 69 64 20 72 74 72 65 65 43 68  tic void rtreeCh
1d400 65 63 6b 52 65 73 65 74 28 52 74 72 65 65 43 68  eckReset(RtreeCh
1d410 65 63 6b 20 2a 70 43 68 65 63 6b 2c 20 73 71 6c  eck *pCheck, sql
1d420 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1d430 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
1d440 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
1d450 74 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b  t);.  if( pCheck
1d460 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1d470 29 20 70 43 68 65 63 6b 2d 3e 72 63 20 3d 20 72  ) pCheck->rc = r
1d480 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
1d490 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65  second and subse
1d4a0 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
1d4b0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1d4c0 20 61 72 65 20 61 20 66 6f 72 6d 61 74 20 73 74   are a format st
1d4d0 72 69 6e 67 0a 2a 2a 20 61 6e 64 20 70 72 69 6e  ring.** and prin
1d4e0 74 66 20 73 74 79 6c 65 20 61 72 67 75 6d 65 6e  tf style argumen
1d4f0 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ts. This functio
1d500 6e 20 66 6f 72 6d 61 74 73 20 74 68 65 20 73 74  n formats the st
1d510 72 69 6e 67 20 61 6e 64 20 61 74 74 65 6d 70 74  ring and attempt
1d520 73 0a 2a 2a 20 74 6f 20 63 6f 6d 70 69 6c 65 20  s.** to compile 
1d530 69 74 20 61 73 20 61 6e 20 53 51 4c 20 73 74 61  it as an SQL sta
1d540 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  tement..**.** If
1d550 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70   successful, a p
1d560 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
1d570 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
1d580 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1d590 65 72 77 69 73 65 2c 0a 2a 2a 20 4e 55 4c 4c 20  erwise,.** NULL 
1d5a0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1d5b0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6c 65  an error code le
1d5c0 66 74 20 69 6e 20 52 74 72 65 65 43 68 65 63 6b  ft in RtreeCheck
1d5d0 2e 72 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  .rc..*/.static s
1d5e0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 72 74 72  qlite3_stmt *rtr
1d5f0 65 65 43 68 65 63 6b 50 72 65 70 61 72 65 28 0a  eeCheckPrepare(.
1d600 20 20 52 74 72 65 65 43 68 65 63 6b 20 2a 70 43    RtreeCheck *pC
1d610 68 65 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  heck,           
1d620 20 20 2f 2a 20 52 74 72 65 65 43 68 65 63 6b 20    /* RtreeCheck 
1d630 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
1d640 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e  t char *zFmt, ..
1d650 2e 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  .           /* F
1d660 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64  ormat string and
1d670 20 74 72 61 69 6c 69 6e 67 20 61 72 67 73 20 2a   trailing args *
1d680 2f 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  /.){.  va_list a
1d690 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  p;.  char *z;.  
1d6a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52  sqlite3_stmt *pR
1d6b0 65 74 20 3d 20 30 3b 0a 0a 20 20 76 61 5f 73 74  et = 0;..  va_st
1d6c0 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
1d6d0 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70   z = sqlite3_vmp
1d6e0 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
1d6f0 0a 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  ..  if( pCheck->
1d700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d710 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
1d720 0a 20 20 20 20 20 20 70 43 68 65 63 6b 2d 3e 72  .      pCheck->r
1d730 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1d740 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d750 20 20 20 70 43 68 65 63 6b 2d 3e 72 63 20 3d 20     pCheck->rc = 
1d760 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1d770 76 32 28 70 43 68 65 63 6b 2d 3e 64 62 2c 20 7a  v2(pCheck->db, z
1d780 2c 20 2d 31 2c 20 26 70 52 65 74 2c 20 30 29 3b  , -1, &pRet, 0);
1d790 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
1d7a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
1d7b0 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
1d7c0 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
1d7d0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1d7e0 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61  and subsequent a
1d7f0 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 73  rguments to this
1d800 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 61 20   function are a 
1d810 70 72 69 6e 74 66 28 29 0a 2a 2a 20 73 74 79 6c  printf().** styl
1d820 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20  e format string 
1d830 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 54  and arguments. T
1d840 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  his function for
1d850 6d 61 74 73 20 74 68 65 20 73 74 72 69 6e 67 20  mats the string 
1d860 61 6e 64 0a 2a 2a 20 61 70 70 65 6e 64 73 20 69  and.** appends i
1d870 74 20 74 6f 20 74 68 65 20 72 65 70 6f 72 74 20  t to the report 
1d880 62 65 69 6e 67 20 61 63 63 75 6d 75 61 74 65 64  being accumuated
1d890 20 69 6e 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73   in pCheck..*/.s
1d8a0 74 61 74 69 63 20 76 6f 69 64 20 72 74 72 65 65  tatic void rtree
1d8b0 43 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 52  CheckAppendMsg(R
1d8c0 74 72 65 65 43 68 65 63 6b 20 2a 70 43 68 65 63  treeCheck *pChec
1d8d0 6b 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  k, const char *z
1d8e0 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  Fmt, ...){.  va_
1d8f0 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
1d900 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
1d910 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 72 63 3d   if( pCheck->rc=
1d920 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43  =SQLITE_OK && pC
1d930 68 65 63 6b 2d 3e 6e 45 72 72 3c 52 54 52 45 45  heck->nErr<RTREE
1d940 5f 43 48 45 43 4b 5f 4d 41 58 5f 45 52 52 4f 52  _CHECK_MAX_ERROR
1d950 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
1d960 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
1d970 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20  tf(zFmt, ap);.  
1d980 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
1d990 20 20 20 20 70 43 68 65 63 6b 2d 3e 72 63 20 3d      pCheck->rc =
1d9a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1d9b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d9c0 70 43 68 65 63 6b 2d 3e 7a 52 65 70 6f 72 74 20  pCheck->zReport 
1d9d0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1d9e0 66 28 22 25 7a 25 73 25 7a 22 2c 20 0a 20 20 20  f("%z%s%z", .   
1d9f0 20 20 20 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a         pCheck->z
1da00 52 65 70 6f 72 74 2c 20 28 70 43 68 65 63 6b 2d  Report, (pCheck-
1da10 3e 7a 52 65 70 6f 72 74 20 3f 20 22 5c 6e 22 20  >zReport ? "\n" 
1da20 3a 20 22 22 29 2c 20 7a 0a 20 20 20 20 20 20 29  : ""), z.      )
1da30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65  ;.      if( pChe
1da40 63 6b 2d 3e 7a 52 65 70 6f 72 74 3d 3d 30 20 29  ck->zReport==0 )
1da50 7b 0a 20 20 20 20 20 20 20 20 70 43 68 65 63 6b  {.        pCheck
1da60 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
1da70 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
1da80 20 7d 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 6e   }.    pCheck->n
1da90 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 76 61 5f  Err++;.  }.  va_
1daa0 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
1dab0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1dac0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1dad0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
1dae0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 73 74 6f  n error code sto
1daf0 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 52 74  red.** in the Rt
1db00 72 65 65 43 68 65 63 6b 20 6f 62 6a 65 63 74 20  reeCheck object 
1db10 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
1db20 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
1db30 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 72 65 74 75   NULL is.** retu
1db40 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  rned in this cas
1db50 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
1db60 73 65 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  se, the contents
1db70 20 6f 66 20 72 74 72 65 65 20 74 61 62 6c 65 20   of rtree table 
1db80 6e 6f 64 65 20 69 4e 6f 64 65 20 61 72 65 20 6c  node iNode are l
1db90 6f 61 64 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  oaded from.** th
1dba0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  e database and c
1dbb0 6f 70 69 65 64 20 69 6e 74 6f 20 61 20 62 75 66  opied into a buf
1dbc0 66 65 72 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  fer obtained fro
1dbd0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
1dbe0 28 29 2e 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  ()..** If no err
1dbf0 6f 72 20 6f 63 63 75 72 73 2c 20 61 20 70 6f 69  or occurs, a poi
1dc00 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66  nter to the buff
1dc10 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  er is returned a
1dc20 6e 64 20 28 2a 70 6e 4e 6f 64 65 29 0a 2a 2a 20  nd (*pnNode).** 
1dc30 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
1dc40 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
1dc50 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
1dc60 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
1dc70 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 4e 55 4c   does occur, NUL
1dc80 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
1dc90 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1dca0 6c 65 66 74 0a 2a 2a 20 69 6e 20 74 68 65 20 52  left.** in the R
1dcb0 74 72 65 65 43 68 65 63 6b 20 6f 62 6a 65 63 74  treeCheck object
1dcc0 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  . The final valu
1dcd0 65 20 6f 66 20 2a 70 6e 4e 6f 64 65 20 69 73 20  e of *pnNode is 
1dce0 75 6e 64 65 66 69 6e 65 64 20 69 6e 0a 2a 2a 20  undefined in.** 
1dcf0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
1dd00 61 74 69 63 20 75 38 20 2a 72 74 72 65 65 43 68  atic u8 *rtreeCh
1dd10 65 63 6b 47 65 74 4e 6f 64 65 28 52 74 72 65 65  eckGetNode(Rtree
1dd20 43 68 65 63 6b 20 2a 70 43 68 65 63 6b 2c 20 69  Check *pCheck, i
1dd30 36 34 20 69 4e 6f 64 65 2c 20 69 6e 74 20 2a 70  64 iNode, int *p
1dd40 6e 4e 6f 64 65 29 7b 0a 20 20 75 38 20 2a 70 52  nNode){.  u8 *pR
1dd50 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
1dd60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1dd70 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1dd80 69 66 28 20 70 43 68 65 63 6b 2d 3e 72 63 3d 3d  if( pCheck->rc==
1dd90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 68  SQLITE_OK && pCh
1dda0 65 63 6b 2d 3e 70 47 65 74 4e 6f 64 65 3d 3d 30  eck->pGetNode==0
1ddb0 20 29 7b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e   ){.    pCheck->
1ddc0 70 47 65 74 4e 6f 64 65 20 3d 20 72 74 72 65 65  pGetNode = rtree
1ddd0 43 68 65 63 6b 50 72 65 70 61 72 65 28 70 43 68  CheckPrepare(pCh
1dde0 65 63 6b 2c 0a 20 20 20 20 20 20 20 20 22 53 45  eck,.        "SE
1ddf0 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20 25  LECT data FROM %
1de00 51 2e 27 25 71 5f 6e 6f 64 65 27 20 57 48 45 52  Q.'%q_node' WHER
1de10 45 20 6e 6f 64 65 6e 6f 3d 3f 22 2c 20 0a 20 20  E nodeno=?", .  
1de20 20 20 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 44        pCheck->zD
1de30 62 2c 20 70 43 68 65 63 6b 2d 3e 7a 54 61 62 0a  b, pCheck->zTab.
1de40 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66      );.  }..  if
1de50 28 20 70 43 68 65 63 6b 2d 3e 72 63 3d 3d 53 51  ( pCheck->rc==SQ
1de60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
1de70 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
1de80 34 28 70 43 68 65 63 6b 2d 3e 70 47 65 74 4e 6f  4(pCheck->pGetNo
1de90 64 65 2c 20 31 2c 20 69 4e 6f 64 65 29 3b 0a 20  de, 1, iNode);. 
1dea0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
1deb0 74 65 70 28 70 43 68 65 63 6b 2d 3e 70 47 65 74  tep(pCheck->pGet
1dec0 4e 6f 64 65 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Node)==SQLITE_RO
1ded0 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  W ){.      int n
1dee0 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  Node = sqlite3_c
1def0 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 43 68 65  olumn_bytes(pChe
1df00 63 6b 2d 3e 70 47 65 74 4e 6f 64 65 2c 20 30 29  ck->pGetNode, 0)
1df10 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  ;.      const u8
1df20 20 2a 70 4e 6f 64 65 20 3d 20 28 63 6f 6e 73 74   *pNode = (const
1df30 20 75 38 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c   u8*)sqlite3_col
1df40 75 6d 6e 5f 62 6c 6f 62 28 70 43 68 65 63 6b 2d  umn_blob(pCheck-
1df50 3e 70 47 65 74 4e 6f 64 65 2c 20 30 29 3b 0a 20  >pGetNode, 0);. 
1df60 20 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69       pRet = sqli
1df70 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 4e 6f  te3_malloc64(nNo
1df80 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  de);.      if( p
1df90 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ret==0 ){.      
1dfa0 20 20 70 43 68 65 63 6b 2d 3e 72 63 20 3d 20 53    pCheck->rc = S
1dfb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1dfc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dfd0 20 20 6d 65 6d 63 70 79 28 70 52 65 74 2c 20 70    memcpy(pRet, p
1dfe0 4e 6f 64 65 2c 20 6e 4e 6f 64 65 29 3b 0a 20 20  Node, nNode);.  
1dff0 20 20 20 20 20 20 2a 70 6e 4e 6f 64 65 20 3d 20        *pnNode = 
1e000 6e 4e 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nNode;.      }. 
1e010 20 20 20 7d 0a 20 20 20 20 72 74 72 65 65 43 68     }.    rtreeCh
1e020 65 63 6b 52 65 73 65 74 28 70 43 68 65 63 6b 2c  eckReset(pCheck,
1e030 20 70 43 68 65 63 6b 2d 3e 70 47 65 74 4e 6f 64   pCheck->pGetNod
1e040 65 29 3b 0a 20 20 20 20 69 66 28 20 70 43 68 65  e);.    if( pChe
1e050 63 6b 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ck->rc==SQLITE_O
1e060 4b 20 26 26 20 70 52 65 74 3d 3d 30 20 29 7b 0a  K && pRet==0 ){.
1e070 20 20 20 20 20 20 72 74 72 65 65 43 68 65 63 6b        rtreeCheck
1e080 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
1e090 2c 20 22 4e 6f 64 65 20 25 6c 6c 64 20 6d 69 73  , "Node %lld mis
1e0a0 73 69 6e 67 20 66 72 6f 6d 20 64 61 74 61 62 61  sing from databa
1e0b0 73 65 22 2c 20 69 4e 6f 64 65 29 3b 0a 20 20 20  se", iNode);.   
1e0c0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1e0d0 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
1e0e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e0f0 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 74   used to check t
1e100 68 61 74 20 74 68 65 20 25 5f 70 61 72 65 6e 74  hat the %_parent
1e110 20 28 69 66 20 62 4c 65 61 66 3d 3d 30 29 20 6f   (if bLeaf==0) o
1e120 72 20 25 5f 72 6f 77 69 64 0a 2a 2a 20 28 69 66  r %_rowid.** (if
1e130 20 62 4c 65 61 66 3d 3d 31 29 20 74 61 62 6c 65   bLeaf==1) table
1e140 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 70 65 63   contains a spec
1e150 69 66 69 65 64 20 65 6e 74 72 79 2e 20 54 68 65  ified entry. The
1e160 20 73 63 68 65 6d 61 73 20 6f 66 20 74 68 65 0a   schemas of the.
1e170 2a 2a 20 74 77 6f 20 74 61 62 6c 65 73 20 61 72  ** two tables ar
1e180 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  e:.**.**   CREAT
1e190 45 20 54 41 42 4c 45 20 25 5f 70 61 72 65 6e 74  E TABLE %_parent
1e1a0 28 6e 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20  (nodeno INTEGER 
1e1b0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 70 61 72  PRIMARY KEY, par
1e1c0 65 6e 74 6e 6f 64 65 20 49 4e 54 45 47 45 52 29  entnode INTEGER)
1e1d0 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
1e1e0 4c 45 20 25 5f 72 6f 77 69 64 28 72 6f 77 69 64  LE %_rowid(rowid
1e1f0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
1e200 20 4b 45 59 2c 20 6e 6f 64 65 6e 6f 20 49 4e 54   KEY, nodeno INT
1e210 45 47 45 52 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  EGER, ...).**.**
1e220 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20   In both cases, 
1e230 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  this function ch
1e240 65 63 6b 73 20 74 68 61 74 20 74 68 65 72 65 20  ecks that there 
1e250 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20  exists an entry 
1e260 77 69 74 68 0a 2a 2a 20 49 50 4b 20 76 61 6c 75  with.** IPK valu
1e270 65 20 69 4b 65 79 20 61 6e 64 20 74 68 65 20 73  e iKey and the s
1e280 65 63 6f 6e 64 20 63 6f 6c 75 6d 6e 20 73 65 74  econd column set
1e290 20 74 6f 20 69 56 61 6c 2e 0a 2a 2a 0a 2a 2f 0a   to iVal..**.*/.
1e2a0 73 74 61 74 69 63 20 76 6f 69 64 20 72 74 72 65  static void rtre
1e2b0 65 43 68 65 63 6b 4d 61 70 70 69 6e 67 28 0a 20  eCheckMapping(. 
1e2c0 20 52 74 72 65 65 43 68 65 63 6b 20 2a 70 43 68   RtreeCheck *pCh
1e2d0 65 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  eck,            
1e2e0 20 2f 2a 20 52 74 72 65 65 43 68 65 63 6b 20 6f   /* RtreeCheck o
1e2f0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 62  bject */.  int b
1e300 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20 20 20  Leaf,           
1e310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e320 75 65 20 66 6f 72 20 61 20 6c 65 61 66 20 63 65  ue for a leaf ce
1e330 6c 6c 2c 20 66 61 6c 73 65 20 66 6f 72 20 69 6e  ll, false for in
1e340 74 65 72 69 6f 72 20 2a 2f 0a 20 20 69 36 34 20  terior */.  i64 
1e350 69 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  iKey,           
1e360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
1e370 65 79 20 66 6f 72 20 6d 61 70 70 69 6e 67 20 2a  ey for mapping *
1e380 2f 0a 20 20 69 36 34 20 69 56 61 6c 20 20 20 20  /.  i64 iVal    
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
1e3b0 76 61 6c 75 65 20 66 6f 72 20 6d 61 70 70 69 6e  value for mappin
1e3c0 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
1e3d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1e3e0 20 2a 70 53 74 6d 74 3b 0a 20 20 63 6f 6e 73 74   *pStmt;.  const
1e3f0 20 63 68 61 72 20 2a 61 7a 53 71 6c 5b 32 5d 20   char *azSql[2] 
1e400 3d 20 7b 0a 20 20 20 20 22 53 45 4c 45 43 54 20  = {.    "SELECT 
1e410 70 61 72 65 6e 74 6e 6f 64 65 20 46 52 4f 4d 20  parentnode FROM 
1e420 25 51 2e 27 25 71 5f 70 61 72 65 6e 74 27 20 57  %Q.'%q_parent' W
1e430 48 45 52 45 20 6e 6f 64 65 6e 6f 3d 3f 31 22 2c  HERE nodeno=?1",
1e440 0a 20 20 20 20 22 53 45 4c 45 43 54 20 6e 6f 64  .    "SELECT nod
1e450 65 6e 6f 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  eno FROM %Q.'%q_
1e460 72 6f 77 69 64 27 20 57 48 45 52 45 20 72 6f 77  rowid' WHERE row
1e470 69 64 3d 3f 31 22 0a 20 20 7d 3b 0a 0a 20 20 61  id=?1".  };..  a
1e480 73 73 65 72 74 28 20 62 4c 65 61 66 3d 3d 30 20  ssert( bLeaf==0 
1e490 7c 7c 20 62 4c 65 61 66 3d 3d 31 20 29 3b 0a 20  || bLeaf==1 );. 
1e4a0 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 43 68   if( pCheck->aCh
1e4b0 65 63 6b 4d 61 70 70 69 6e 67 5b 62 4c 65 61 66  eckMapping[bLeaf
1e4c0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 68 65  ]==0 ){.    pChe
1e4d0 63 6b 2d 3e 61 43 68 65 63 6b 4d 61 70 70 69 6e  ck->aCheckMappin
1e4e0 67 5b 62 4c 65 61 66 5d 20 3d 20 72 74 72 65 65  g[bLeaf] = rtree
1e4f0 43 68 65 63 6b 50 72 65 70 61 72 65 28 70 43 68  CheckPrepare(pCh
1e500 65 63 6b 2c 0a 20 20 20 20 20 20 20 20 61 7a 53  eck,.        azS
1e510 71 6c 5b 62 4c 65 61 66 5d 2c 20 70 43 68 65 63  ql[bLeaf], pChec
1e520 6b 2d 3e 7a 44 62 2c 20 70 43 68 65 63 6b 2d 3e  k->zDb, pCheck->
1e530 7a 54 61 62 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  zTab.    );.  }.
1e540 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 72 63    if( pCheck->rc
1e550 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1e560 74 75 72 6e 3b 0a 0a 20 20 70 53 74 6d 74 20 3d  turn;..  pStmt =
1e570 20 70 43 68 65 63 6b 2d 3e 61 43 68 65 63 6b 4d   pCheck->aCheckM
1e580 61 70 70 69 6e 67 5b 62 4c 65 61 66 5d 3b 0a 20  apping[bLeaf];. 
1e590 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1e5a0 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 4b  t64(pStmt, 1, iK
1e5b0 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
1e5c0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
1e5d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e5e0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 72 74  E_DONE ){.    rt
1e5f0 72 65 65 43 68 65 63 6b 41 70 70 65 6e 64 4d 73  reeCheckAppendMs
1e600 67 28 70 43 68 65 63 6b 2c 20 22 4d 61 70 70 69  g(pCheck, "Mappi
1e610 6e 67 20 28 25 6c 6c 64 20 2d 3e 20 25 6c 6c 64  ng (%lld -> %lld
1e620 29 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 25  ) missing from %
1e630 73 20 74 61 62 6c 65 22 2c 0a 20 20 20 20 20 20  s table",.      
1e640 20 20 69 4b 65 79 2c 20 69 56 61 6c 2c 20 28 62    iKey, iVal, (b
1e650 4c 65 61 66 20 3f 20 22 25 5f 72 6f 77 69 64 22  Leaf ? "%_rowid"
1e660 20 3a 20 22 25 5f 70 61 72 65 6e 74 22 29 0a 20   : "%_parent"). 
1e670 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66     );.  }else if
1e680 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
1e690 20 29 7b 0a 20 20 20 20 69 36 34 20 69 69 20 3d   ){.    i64 ii =
1e6a0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1e6b0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b  int64(pStmt, 0);
1e6c0 0a 20 20 20 20 69 66 28 20 69 69 21 3d 69 56 61  .    if( ii!=iVa
1e6d0 6c 20 29 7b 0a 20 20 20 20 20 20 72 74 72 65 65  l ){.      rtree
1e6e0 43 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  CheckAppendMsg(p
1e6f0 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20  Check, .        
1e700 20 20 22 46 6f 75 6e 64 20 28 25 6c 6c 64 20 2d    "Found (%lld -
1e710 3e 20 25 6c 6c 64 29 20 69 6e 20 25 73 20 74 61  > %lld) in %s ta
1e720 62 6c 65 2c 20 65 78 70 65 63 74 65 64 20 28 25  ble, expected (%
1e730 6c 6c 64 20 2d 3e 20 25 6c 6c 64 29 22 2c 0a 20  lld -> %lld)",. 
1e740 20 20 20 20 20 20 20 20 20 69 4b 65 79 2c 20 69           iKey, i
1e750 69 2c 20 28 62 4c 65 61 66 20 3f 20 22 25 5f 72  i, (bLeaf ? "%_r
1e760 6f 77 69 64 22 20 3a 20 22 25 5f 70 61 72 65 6e  owid" : "%_paren
1e770 74 22 29 2c 20 69 4b 65 79 2c 20 69 56 61 6c 0a  t"), iKey, iVal.
1e780 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
1e790 20 7d 0a 20 20 72 74 72 65 65 43 68 65 63 6b 52   }.  rtreeCheckR
1e7a0 65 73 65 74 28 70 43 68 65 63 6b 2c 20 70 53 74  eset(pCheck, pSt
1e7b0 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  mt);.}../*.** Ar
1e7c0 67 75 6d 65 6e 74 20 70 43 65 6c 6c 20 70 6f 69  gument pCell poi
1e7d0 6e 74 73 20 74 6f 20 61 6e 20 61 72 72 61 79 20  nts to an array 
1e7e0 6f 66 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 73  of coordinates s
1e7f0 74 6f 72 65 64 20 6f 6e 20 61 6e 20 72 74 72 65  tored on an rtre
1e800 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
1e810 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
1e820 74 68 61 74 20 74 68 65 20 63 6f 6f 72 64 69 6e  that the coordin
1e830 61 74 65 73 20 61 72 65 20 69 6e 74 65 72 6e 61  ates are interna
1e840 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 20 28  lly consistent (
1e850 6e 6f 0a 2a 2a 20 78 31 3e 78 32 20 63 6f 6e 64  no.** x1>x2 cond
1e860 69 74 69 6f 6e 73 29 20 61 6e 64 20 61 64 64 73  itions) and adds
1e870 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1e880 65 20 74 6f 20 74 68 65 20 52 74 72 65 65 43 68  e to the RtreeCh
1e890 65 63 6b 20 6f 62 6a 65 63 74 0a 2a 2a 20 69 66  eck object.** if
1e8a0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 0a 2a   they are not..*
1e8b0 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  *.** Additionall
1e8c0 79 2c 20 69 66 20 70 50 61 72 65 6e 74 20 69 73  y, if pParent is
1e8d0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
1e8e0 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  it is assumed to
1e8f0 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
1e900 20 61 72 72 61 79 20 6f 66 20 63 6f 6f 72 64 69   array of coordi
1e910 6e 61 74 65 73 20 6f 6e 20 74 68 65 20 70 61 72  nates on the par
1e920 65 6e 74 20 70 61 67 65 20 74 68 61 74 20 62 6f  ent page that bo
1e930 75 6e 64 20 74 68 65 20 70 61 67 65 20 0a 2a 2a  und the page .**
1e940 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 43 65 6c   containing pCel
1e950 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  l. In this case 
1e960 69 74 20 69 73 20 61 6c 73 6f 20 76 65 72 69 66  it is also verif
1e970 69 65 64 20 74 68 61 74 20 74 68 65 20 74 77 6f  ied that the two
1e980 0a 2a 2a 20 73 65 74 73 20 6f 66 20 63 6f 6f 72  .** sets of coor
1e990 64 69 6e 61 74 65 73 20 61 72 65 20 6d 75 74 75  dinates are mutu
1e9a0 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 20  ally consistent 
1e9b0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
1e9c0 73 61 67 65 20 61 64 64 65 64 0a 2a 2a 20 74 6f  sage added.** to
1e9d0 20 74 68 65 20 52 74 72 65 65 43 68 65 63 6b 20   the RtreeCheck 
1e9e0 6f 62 6a 65 63 74 20 69 66 20 74 68 65 79 20 61  object if they a
1e9f0 72 65 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  re not..*/.stati
1ea00 63 20 76 6f 69 64 20 72 74 72 65 65 43 68 65 63  c void rtreeChec
1ea10 6b 43 65 6c 6c 43 6f 6f 72 64 28 0a 20 20 52 74  kCellCoord(.  Rt
1ea20 72 65 65 43 68 65 63 6b 20 2a 70 43 68 65 63 6b  reeCheck *pCheck
1ea30 2c 20 0a 20 20 69 36 34 20 69 4e 6f 64 65 2c 20  , .  i64 iNode, 
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea50 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 69 64 20       /* Node id 
1ea60 74 6f 20 75 73 65 20 69 6e 20 65 72 72 6f 72 20  to use in error 
1ea70 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 69 6e  messages */.  in
1ea80 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eaa0 20 43 65 6c 6c 20 6e 75 6d 62 65 72 20 74 6f 20   Cell number to 
1eab0 75 73 65 20 69 6e 20 65 72 72 6f 72 20 6d 65 73  use in error mes
1eac0 73 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70  sages */.  u8 *p
1ead0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
1eae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1eaf0 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20 63 6f  inter to cell co
1eb00 6f 72 64 69 6e 61 74 65 73 20 2a 2f 0a 20 20 75  ordinates */.  u
1eb10 38 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20  8 *pParent      
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 72  * Pointer to par
1eb40 65 6e 74 20 63 6f 6f 72 64 69 6e 61 74 65 73 20  ent coordinates 
1eb50 2a 2f 0a 29 7b 0a 20 20 52 74 72 65 65 43 6f 6f  */.){.  RtreeCoo
1eb60 72 64 20 63 31 2c 20 63 32 3b 0a 20 20 52 74 72  rd c1, c2;.  Rtr
1eb70 65 65 43 6f 6f 72 64 20 70 31 2c 20 70 32 3b 0a  eeCoord p1, p2;.
1eb80 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28    int i;..  for(
1eb90 69 3d 30 3b 20 69 3c 70 43 68 65 63 6b 2d 3e 6e  i=0; i<pCheck->n
1eba0 44 69 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Dim; i++){.    r
1ebb0 65 61 64 43 6f 6f 72 64 28 26 70 43 65 6c 6c 5b  eadCoord(&pCell[
1ebc0 34 2a 32 2a 69 5d 2c 20 26 63 31 29 3b 0a 20 20  4*2*i], &c1);.  
1ebd0 20 20 72 65 61 64 43 6f 6f 72 64 28 26 70 43 65    readCoord(&pCe
1ebe0 6c 6c 5b 34 2a 28 32 2a 69 20 2b 20 31 29 5d 2c  ll[4*(2*i + 1)],
1ebf0 20 26 63 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 70   &c2);..    /* p
1ec00 72 69 6e 74 66 28 22 25 65 2c 20 25 65 5c 6e 22  rintf("%e, %e\n"
1ec10 2c 20 63 31 2e 75 2e 66 2c 20 63 32 2e 75 2e 66  , c1.u.f, c2.u.f
1ec20 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43  ); */.    if( pC
1ec30 68 65 63 6b 2d 3e 62 49 6e 74 20 3f 20 63 31 2e  heck->bInt ? c1.
1ec40 69 3e 63 32 2e 69 20 3a 20 63 31 2e 66 3e 63 32  i>c2.i : c1.f>c2
1ec50 2e 66 20 29 7b 0a 20 20 20 20 20 20 72 74 72 65  .f ){.      rtre
1ec60 65 43 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28  eCheckAppendMsg(
1ec70 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20  pCheck, .       
1ec80 20 20 20 22 44 69 6d 65 6e 73 69 6f 6e 20 25 64     "Dimension %d
1ec90 20 6f 66 20 63 65 6c 6c 20 25 64 20 6f 6e 20 6e   of cell %d on n
1eca0 6f 64 65 20 25 6c 6c 64 20 69 73 20 63 6f 72 72  ode %lld is corr
1ecb0 75 70 74 22 2c 20 69 2c 20 69 43 65 6c 6c 2c 20  upt", i, iCell, 
1ecc0 69 4e 6f 64 65 0a 20 20 20 20 20 20 29 3b 0a 20  iNode.      );. 
1ecd0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 50     }..    if( pP
1ece0 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  arent ){.      r
1ecf0 65 61 64 43 6f 6f 72 64 28 26 70 50 61 72 65 6e  eadCoord(&pParen
1ed00 74 5b 34 2a 32 2a 69 5d 2c 20 26 70 31 29 3b 0a  t[4*2*i], &p1);.
1ed10 20 20 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28        readCoord(
1ed20 26 70 50 61 72 65 6e 74 5b 34 2a 28 32 2a 69 20  &pParent[4*(2*i 
1ed30 2b 20 31 29 5d 2c 20 26 70 32 29 3b 0a 0a 20 20  + 1)], &p2);..  
1ed40 20 20 20 20 69 66 28 20 28 70 43 68 65 63 6b 2d      if( (pCheck-
1ed50 3e 62 49 6e 74 20 3f 20 63 31 2e 69 3c 70 31 2e  >bInt ? c1.i<p1.
1ed60 69 20 3a 20 63 31 2e 66 3c 70 31 2e 66 29 20 0a  i : c1.f<p1.f) .
1ed70 20 20 20 20 20 20 20 7c 7c 20 28 70 43 68 65 63         || (pChec
1ed80 6b 2d 3e 62 49 6e 74 20 3f 20 63 32 2e 69 3e 70  k->bInt ? c2.i>p
1ed90 32 2e 69 20 3a 20 63 32 2e 66 3e 70 32 2e 66 29  2.i : c2.f>p2.f)
1eda0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1edb0 20 20 72 74 72 65 65 43 68 65 63 6b 41 70 70 65    rtreeCheckAppe
1edc0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 0a 20  ndMsg(pCheck, . 
1edd0 20 20 20 20 20 20 20 20 20 20 20 22 44 69 6d 65             "Dime
1ede0 6e 73 69 6f 6e 20 25 64 20 6f 66 20 63 65 6c 6c  nsion %d of cell
1edf0 20 25 64 20 6f 6e 20 6e 6f 64 65 20 25 6c 6c 64   %d on node %lld
1ee00 20 69 73 20 63 6f 72 72 75 70 74 20 72 65 6c 61   is corrupt rela
1ee10 74 69 76 65 20 74 6f 20 70 61 72 65 6e 74 22 0a  tive to parent".
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 2c 20 69 2c              , i,
1ee30 20 69 43 65 6c 6c 2c 20 69 4e 6f 64 65 0a 20 20   iCell, iNode.  
1ee40 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
1ee50 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1ee60 0a 2a 2a 20 52 75 6e 20 72 74 72 65 65 63 68 65  .** Run rtreeche
1ee70 63 6b 28 29 20 63 68 65 63 6b 73 20 6f 6e 20 6e  ck() checks on n
1ee80 6f 64 65 20 69 4e 6f 64 65 2c 20 77 68 69 63 68  ode iNode, which
1ee90 20 69 73 20 61 74 20 64 65 70 74 68 20 69 44 65   is at depth iDe
1eea0 70 74 68 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  pth within.** th
1eeb0 65 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75  e r-tree structu
1eec0 72 65 2e 20 41 72 67 75 6d 65 6e 74 20 61 50 61  re. Argument aPa
1eed0 72 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  rent points to t
1eee0 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 6f 72  he array of coor
1eef0 64 69 6e 61 74 65 73 0a 2a 2a 20 74 68 61 74 20  dinates.** that 
1ef00 62 6f 75 6e 64 20 6e 6f 64 65 20 69 4e 6f 64 65  bound node iNode
1ef10 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20 6e   on the parent n
1ef20 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ode..**.** If an
1ef30 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 64  y problems are d
1ef40 69 73 63 6f 76 65 72 65 64 2c 20 61 6e 20 65 72  iscovered, an er
1ef50 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 61  ror message is a
1ef60 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 0a 2a  ppended to the.*
1ef70 2a 20 72 65 70 6f 72 74 20 61 63 63 75 6d 75 6c  * report accumul
1ef80 61 74 65 64 20 69 6e 20 74 68 65 20 52 74 72 65  ated in the Rtre
1ef90 65 43 68 65 63 6b 20 6f 62 6a 65 63 74 2e 0a 2a  eCheck object..*
1efa0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 74  /.static void rt
1efb0 72 65 65 43 68 65 63 6b 4e 6f 64 65 28 0a 20 20  reeCheckNode(.  
1efc0 52 74 72 65 65 43 68 65 63 6b 20 2a 70 43 68 65  RtreeCheck *pChe
1efd0 63 6b 2c 0a 20 20 69 6e 74 20 69 44 65 70 74 68  ck,.  int iDepth
1efe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1eff0 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f        /* Depth o
1f000 66 20 69 4e 6f 64 65 20 28 30 3d 3d 6c 65 61 66  f iNode (0==leaf
1f010 29 20 2a 2f 0a 20 20 75 38 20 2a 61 50 61 72 65  ) */.  u8 *aPare
1f020 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
1f030 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
1f040 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 61 72 65   containing pare
1f050 6e 74 20 63 6f 6f 72 64 73 20 2a 2f 0a 20 20 69  nt coords */.  i
1f060 36 34 20 69 4e 6f 64 65 20 20 20 20 20 20 20 20  64 iNode        
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f080 2a 20 4e 6f 64 65 20 74 6f 20 63 68 65 63 6b 20  * Node to check 
1f090 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 61 4e 6f 64  */.){.  u8 *aNod
1f0a0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 6f  e = 0;.  int nNo
1f0b0 64 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  de = 0;..  asser
1f0c0 74 28 20 69 4e 6f 64 65 3d 3d 31 20 7c 7c 20 61  t( iNode==1 || a
1f0d0 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 61  Parent!=0 );.  a
1f0e0 73 73 65 72 74 28 20 70 43 68 65 63 6b 2d 3e 6e  ssert( pCheck->n
1f0f0 44 69 6d 3e 30 20 29 3b 0a 0a 20 20 61 4e 6f 64  Dim>0 );..  aNod
1f100 65 20 3d 20 72 74 72 65 65 43 68 65 63 6b 47 65  e = rtreeCheckGe
1f110 74 4e 6f 64 65 28 70 43 68 65 63 6b 2c 20 69 4e  tNode(pCheck, iN
1f120 6f 64 65 2c 20 26 6e 4e 6f 64 65 29 3b 0a 20 20  ode, &nNode);.  
1f130 69 66 28 20 61 4e 6f 64 65 20 29 7b 0a 20 20 20  if( aNode ){.   
1f140 20 69 66 28 20 6e 4e 6f 64 65 3c 34 20 29 7b 0a   if( nNode<4 ){.
1f150 20 20 20 20 20 20 72 74 72 65 65 43 68 65 63 6b        rtreeCheck
1f160 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
1f170 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 4e 6f  , .          "No
1f180 64 65 20 25 6c 6c 64 20 69 73 20 74 6f 6f 20 73  de %lld is too s
1f190 6d 61 6c 6c 20 28 25 64 20 62 79 74 65 73 29 22  mall (%d bytes)"
1f1a0 2c 20 69 4e 6f 64 65 2c 20 6e 4e 6f 64 65 0a 20  , iNode, nNode. 
1f1b0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73       );.    }els
1f1c0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 65  e{.      int nCe
1f1d0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1f1e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f1f0 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20  f cells on page 
1f200 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f220 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1f230 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1f240 63 65 6c 6c 73 20 2a 2f 0a 20 20 20 20 20 20 69  cells */.      i
1f250 66 28 20 61 50 61 72 65 6e 74 3d 3d 30 20 29 7b  f( aParent==0 ){
1f260 0a 20 20 20 20 20 20 20 20 69 44 65 70 74 68 20  .        iDepth 
1f270 3d 20 72 65 61 64 49 6e 74 31 36 28 61 4e 6f 64  = readInt16(aNod
1f280 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1f290 69 44 65 70 74 68 3e 52 54 52 45 45 5f 4d 41 58  iDepth>RTREE_MAX
1f2a0 5f 44 45 50 54 48 20 29 7b 0a 20 20 20 20 20 20  _DEPTH ){.      
1f2b0 20 20 20 20 72 74 72 65 65 43 68 65 63 6b 41 70      rtreeCheckAp
1f2c0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
1f2d0 22 52 74 72 65 65 20 64 65 70 74 68 20 6f 75 74  "Rtree depth out
1f2e0 20 6f 66 20 72 61 6e 67 65 20 28 25 64 29 22 2c   of range (%d)",
1f2f0 20 69 44 65 70 74 68 29 3b 0a 20 20 20 20 20 20   iDepth);.      
1f300 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1f310 28 61 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20  (aNode);.       
1f320 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
1f330 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f340 20 20 20 6e 43 65 6c 6c 20 3d 20 72 65 61 64 49     nCell = readI
1f350 6e 74 31 36 28 26 61 4e 6f 64 65 5b 32 5d 29 3b  nt16(&aNode[2]);
1f360 0a 20 20 20 20 20 20 69 66 28 20 28 34 20 2b 20  .      if( (4 + 
1f370 6e 43 65 6c 6c 2a 28 38 20 2b 20 70 43 68 65 63  nCell*(8 + pChec
1f380 6b 2d 3e 6e 44 69 6d 2a 32 2a 34 29 29 3e 6e 4e  k->nDim*2*4))>nN
1f390 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ode ){.        r
1f3a0 74 72 65 65 43 68 65 63 6b 41 70 70 65 6e 64 4d  treeCheckAppendM
1f3b0 73 67 28 70 43 68 65 63 6b 2c 20 0a 20 20 20 20  sg(pCheck, .    
1f3c0 20 20 20 20 20 20 20 20 22 4e 6f 64 65 20 25 6c          "Node %l
1f3d0 6c 64 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  ld is too small 
1f3e0 66 6f 72 20 63 65 6c 6c 20 63 6f 75 6e 74 20 6f  for cell count o
1f3f0 66 20 25 64 20 28 25 64 20 62 79 74 65 73 29 22  f %d (%d bytes)"
1f400 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
1f410 4e 6f 64 65 2c 20 6e 43 65 6c 6c 2c 20 6e 4e 6f  Node, nCell, nNo
1f420 64 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  de.        );.  
1f430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f440 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1f450 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
1f460 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
1f470 20 26 61 4e 6f 64 65 5b 34 20 2b 20 69 2a 28 38   &aNode[4 + i*(8
1f480 20 2b 20 70 43 68 65 63 6b 2d 3e 6e 44 69 6d 2a   + pCheck->nDim*
1f490 32 2a 34 29 5d 3b 0a 20 20 20 20 20 20 20 20 20  2*4)];.         
1f4a0 20 69 36 34 20 69 56 61 6c 20 3d 20 72 65 61 64   i64 iVal = read
1f4b0 49 6e 74 36 34 28 70 43 65 6c 6c 29 3b 0a 20 20  Int64(pCell);.  
1f4c0 20 20 20 20 20 20 20 20 72 74 72 65 65 43 68 65          rtreeChe
1f4d0 63 6b 43 65 6c 6c 43 6f 6f 72 64 28 70 43 68 65  ckCellCoord(pChe
1f4e0 63 6b 2c 20 69 4e 6f 64 65 2c 20 69 2c 20 26 70  ck, iNode, i, &p
1f4f0 43 65 6c 6c 5b 38 5d 2c 20 61 50 61 72 65 6e 74  Cell[8], aParent
1f500 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
1f510 28 20 69 44 65 70 74 68 3e 30 20 29 7b 0a 20 20  ( iDepth>0 ){.  
1f520 20 20 20 20 20 20 20 20 20 20 72 74 72 65 65 43            rtreeC
1f530 68 65 63 6b 4d 61 70 70 69 6e 67 28 70 43 68 65  heckMapping(pChe
1f540 63 6b 2c 20 30 2c 20 69 56 61 6c 2c 20 69 4e 6f  ck, 0, iVal, iNo
1f550 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  de);.           
1f560 20 72 74 72 65 65 43 68 65 63 6b 4e 6f 64 65 28   rtreeCheckNode(
1f570 70 43 68 65 63 6b 2c 20 69 44 65 70 74 68 2d 31  pCheck, iDepth-1
1f580 2c 20 26 70 43 65 6c 6c 5b 38 5d 2c 20 69 56 61  , &pCell[8], iVa
1f590 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
1f5a0 70 43 68 65 63 6b 2d 3e 6e 4e 6f 6e 4c 65 61 66  pCheck->nNonLeaf
1f5b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ++;.          }e
1f5c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1f5d0 20 72 74 72 65 65 43 68 65 63 6b 4d 61 70 70 69   rtreeCheckMappi
1f5e0 6e 67 28 70 43 68 65 63 6b 2c 20 31 2c 20 69 56  ng(pCheck, 1, iV
1f5f0 61 6c 2c 20 69 4e 6f 64 65 29 3b 0a 20 20 20 20  al, iNode);.    
1f600 20 20 20 20 20 20 20 20 70 43 68 65 63 6b 2d 3e          pCheck->
1f610 6e 4c 65 61 66 2b 2b 3b 0a 20 20 20 20 20 20 20  nLeaf++;.       
1f620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1f630 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1f640 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4e   sqlite3_free(aN
1f650 6f 64 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ode);.  }.}../*.
1f660 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
1f670 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
1f680 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
1f690 65 69 74 68 65 72 20 22 5f 72 6f 77 69 64 22 20  either "_rowid" 
1f6a0 6f 72 0a 2a 2a 20 22 5f 70 61 72 65 6e 74 22 2e  or.** "_parent".
1f6b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
1f6c0 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 6e  hecks that the n
1f6d0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1f6e0 20 69 6e 20 74 68 65 0a 2a 2a 20 25 5f 72 6f 77   in the.** %_row
1f6f0 69 64 20 6f 72 20 25 5f 70 61 72 65 6e 74 20 74  id or %_parent t
1f700 61 62 6c 65 20 69 73 20 65 78 61 63 74 6c 79 20  able is exactly 
1f710 6e 45 78 70 65 63 74 2e 20 49 66 20 6e 6f 74 2c  nExpect. If not,
1f720 20 69 74 20 61 64 64 73 0a 2a 2a 20 61 6e 20 65   it adds.** an e
1f730 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
1f740 74 68 65 20 72 65 70 6f 72 74 20 69 6e 20 74 68  the report in th
1f750 65 20 52 74 72 65 65 43 68 65 63 6b 20 6f 62 6a  e RtreeCheck obj
1f760 65 63 74 20 69 6e 64 69 63 61 74 65 64 0a 2a 2a  ect indicated.**
1f770 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
1f780 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
1f790 63 20 76 6f 69 64 20 72 74 72 65 65 43 68 65 63  c void rtreeChec
1f7a0 6b 43 6f 75 6e 74 28 52 74 72 65 65 43 68 65 63  kCount(RtreeChec
1f7b0 6b 20 2a 70 43 68 65 63 6b 2c 20 63 6f 6e 73 74  k *pCheck, const
1f7c0 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20 69 36 34   char *zTbl, i64
1f7d0 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 69 66 28   nExpect){.  if(
1f7e0 20 70 43 68 65 63 6b 2d 3e 72 63 3d 3d 53 51 4c   pCheck->rc==SQL
1f7f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1f800 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f 75  lite3_stmt *pCou
1f810 6e 74 3b 0a 20 20 20 20 70 43 6f 75 6e 74 20 3d  nt;.    pCount =
1f820 20 72 74 72 65 65 43 68 65 63 6b 50 72 65 70 61   rtreeCheckPrepa
1f830 72 65 28 70 43 68 65 63 6b 2c 20 22 53 45 4c 45  re(pCheck, "SELE
1f840 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1f850 20 25 51 2e 27 25 71 25 73 27 22 2c 0a 20 20 20   %Q.'%q%s'",.   
1f860 20 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 44 62       pCheck->zDb
1f870 2c 20 70 43 68 65 63 6b 2d 3e 7a 54 61 62 2c 20  , pCheck->zTab, 
1f880 7a 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20  zTbl.    );.    
1f890 69 66 28 20 70 43 6f 75 6e 74 20 29 7b 0a 20 20  if( pCount ){.  
1f8a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
1f8b0 73 74 65 70 28 70 43 6f 75 6e 74 29 3d 3d 53 51  step(pCount)==SQ
1f8c0 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1f8d0 20 20 20 20 69 36 34 20 6e 41 63 74 75 61 6c 20      i64 nActual 
1f8e0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1f8f0 5f 69 6e 74 36 34 28 70 43 6f 75 6e 74 2c 20 30  _int64(pCount, 0
1f900 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1f910 41 63 74 75 61 6c 21 3d 6e 45 78 70 65 63 74 20  Actual!=nExpect 
1f920 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 74 72  ){.          rtr
1f930 65 65 43 68 65 63 6b 41 70 70 65 6e 64 4d 73 67  eeCheckAppendMsg
1f940 28 70 43 68 65 63 6b 2c 20 22 57 72 6f 6e 67 20  (pCheck, "Wrong 
1f950 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
1f960 73 20 69 6e 20 25 25 25 73 20 74 61 62 6c 65 22  s in %%%s table"
1f970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1f980 20 2d 20 65 78 70 65 63 74 65 64 20 25 6c 6c 64   - expected %lld
1f990 2c 20 61 63 74 75 61 6c 20 25 6c 6c 64 22 20 2c  , actual %lld" ,
1f9a0 20 7a 54 62 6c 2c 20 6e 45 78 70 65 63 74 2c 20   zTbl, nExpect, 
1f9b0 6e 41 63 74 75 61 6c 0a 20 20 20 20 20 20 20 20  nActual.        
1f9c0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20    );.        }. 
1f9d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 68       }.      pCh
1f9e0 65 63 6b 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65  eck->rc = sqlite
1f9f0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 6f 75 6e  3_finalize(pCoun
1fa00 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
1fa10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1fa20 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 62 75  tion does the bu
1fa30 6c 6b 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 66  lk of the work f
1fa40 6f 72 20 74 68 65 20 72 74 72 65 65 20 69 6e 74  or the rtree int
1fa50 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 0a 2a 2a  egrity-check..**
1fa60 20 49 74 20 69 73 20 63 61 6c 6c 65 64 20 62 79   It is called by
1fa70 20 72 74 72 65 65 63 68 65 63 6b 28 29 2c 20 77   rtreecheck(), w
1fa80 68 69 63 68 20 69 73 20 74 68 65 20 53 51 4c 20  hich is the SQL 
1fa90 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
1faa0 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ntation..*/.stat
1fab0 69 63 20 69 6e 74 20 72 74 72 65 65 43 68 65 63  ic int rtreeChec
1fac0 6b 54 61 62 6c 65 28 0a 20 20 73 71 6c 69 74 65  kTable(.  sqlite
1fad0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
1fae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1faf0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20  abase handle to 
1fb00 61 63 63 65 73 73 20 64 62 20 74 68 72 6f 75 67  access db throug
1fb10 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
1fb20 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
1fb30 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1fb40 66 20 64 62 20 28 22 6d 61 69 6e 22 2c 20 22 74  f db ("main", "t
1fb50 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20  emp" etc.) */.  
1fb60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1fb70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fb80 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 74 72 65 65  /* Name of rtree
1fb90 20 74 61 62 6c 65 20 74 6f 20 63 68 65 63 6b 20   table to check 
1fba0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 52 65  */.  char **pzRe
1fbb0 70 6f 72 74 20 20 20 20 20 20 20 20 20 20 20 20  port            
1fbc0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71 6c       /* OUT: sql
1fbd0 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 72 65  ite3_malloc'd re
1fbe0 70 6f 72 74 20 74 65 78 74 20 2a 2f 0a 29 7b 0a  port text */.){.
1fbf0 20 20 52 74 72 65 65 43 68 65 63 6b 20 63 68 65    RtreeCheck che
1fc00 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1fc10 20 20 2f 2a 20 43 6f 6d 6d 6f 6e 20 63 6f 6e 74    /* Common cont
1fc20 65 78 74 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ext for various 
1fc30 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 73 71  routines */.  sq
1fc40 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1fc50 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
1fc60 20 55 73 65 64 20 74 6f 20 66 69 6e 64 20 63 6f   Used to find co
1fc70 6c 75 6d 6e 20 63 6f 75 6e 74 20 6f 66 20 72 74  lumn count of rt
1fc80 72 65 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ree table */.  i
1fc90 6e 74 20 62 45 6e 64 20 3d 20 30 3b 20 20 20 20  nt bEnd = 0;    
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fcb0 2a 20 54 72 75 65 20 69 66 20 74 72 61 6e 73 61  * True if transa
1fcc0 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
1fcd0 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  closed */.  int 
1fce0 6e 41 75 78 20 3d 20 30 3b 20 20 20 20 20 20 20  nAux = 0;       
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1fd00 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63  umber of extra c
1fd10 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 0a 20 20 2f 2a  olumns. */..  /*
1fd20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1fd30 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 2a  context object *
1fd40 2f 0a 20 20 6d 65 6d 73 65 74 28 26 63 68 65 63  /.  memset(&chec
1fd50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 68 65  k, 0, sizeof(che
1fd60 63 6b 29 29 3b 0a 20 20 63 68 65 63 6b 2e 64 62  ck));.  check.db
1fd70 20 3d 20 64 62 3b 0a 20 20 63 68 65 63 6b 2e 7a   = db;.  check.z
1fd80 44 62 20 3d 20 7a 44 62 3b 0a 20 20 63 68 65 63  Db = zDb;.  chec
1fd90 6b 2e 7a 54 61 62 20 3d 20 7a 54 61 62 3b 0a 0a  k.zTab = zTab;..
1fda0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1fdb0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 20   not already an 
1fdc0 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  open transaction
1fdd0 2c 20 6f 70 65 6e 20 6f 6e 65 20 6e 6f 77 2e 20  , open one now. 
1fde0 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 74 6f 20  This is.  ** to 
1fdf0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1fe00 71 75 65 72 69 65 73 20 72 75 6e 20 61 73 20 70  queries run as p
1fe10 61 72 74 20 6f 66 20 74 68 69 73 20 69 6e 74 65  art of this inte
1fe20 67 72 69 74 79 2d 63 68 65 63 6b 20 6f 70 65 72  grity-check oper
1fe30 61 74 65 0a 20 20 2a 2a 20 6f 6e 20 61 20 63 6f  ate.  ** on a co
1fe40 6e 73 69 73 74 65 6e 74 20 73 6e 61 70 73 68 6f  nsistent snapsho
1fe50 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  t.  */.  if( sql
1fe60 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
1fe70 6d 69 74 28 64 62 29 20 29 7b 0a 20 20 20 20 63  mit(db) ){.    c
1fe80 68 65 63 6b 2e 72 63 20 3d 20 73 71 6c 69 74 65  heck.rc = sqlite
1fe90 33 5f 65 78 65 63 28 64 62 2c 20 22 42 45 47 49  3_exec(db, "BEGI
1fea0 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
1feb0 20 20 62 45 6e 64 20 3d 20 31 3b 0a 20 20 7d 0a    bEnd = 1;.  }.
1fec0 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  /* Find the n
1fed0 75 6d 62 65 72 20 6f 66 20 61 75 78 69 6c 69 61  umber of auxilia
1fee0 72 79 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ry columns */.  
1fef0 69 66 28 20 63 68 65 63 6b 2e 72 63 3d 3d 53 51  if( check.rc==SQ
1ff00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1ff10 53 74 6d 74 20 3d 20 72 74 72 65 65 43 68 65 63  Stmt = rtreeChec
1ff20 6b 50 72 65 70 61 72 65 28 26 63 68 65 63 6b 2c  kPrepare(&check,
1ff30 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
1ff40 25 51 2e 27 25 71 5f 72 6f 77 69 64 27 22 2c 20  %Q.'%q_rowid'", 
1ff50 7a 44 62 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20  zDb, zTab);.    
1ff60 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
1ff70 20 20 20 6e 41 75 78 20 3d 20 73 71 6c 69 74 65     nAux = sqlite
1ff80 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
1ff90 53 74 6d 74 29 20 2d 20 32 3b 0a 20 20 20 20 20  Stmt) - 2;.     
1ffa0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1ffb0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  e(pStmt);.    }.
1ffc0 20 20 20 20 63 68 65 63 6b 2e 72 63 20 3d 20 53      check.rc = S
1ffd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1ffe0 20 2f 2a 20 46 69 6e 64 20 6e 75 6d 62 65 72 20   /* Find number 
1fff0 6f 66 20 64 69 6d 65 6e 73 69 6f 6e 73 20 69 6e  of dimensions in
20000 20 74 68 65 20 72 74 72 65 65 20 74 61 62 6c 65   the rtree table
20010 2e 20 2a 2f 0a 20 20 70 53 74 6d 74 20 3d 20 72  . */.  pStmt = r
20020 74 72 65 65 43 68 65 63 6b 50 72 65 70 61 72 65  treeCheckPrepare
20030 28 26 63 68 65 63 6b 2c 20 22 53 45 4c 45 43 54  (&check, "SELECT
20040 20 2a 20 46 52 4f 4d 20 25 51 2e 25 51 22 2c 20   * FROM %Q.%Q", 
20050 7a 44 62 2c 20 7a 54 61 62 29 3b 0a 20 20 69 66  zDb, zTab);.  if
20060 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
20070 6e 74 20 72 63 3b 0a 20 20 20 20 63 68 65 63 6b  nt rc;.    check
20080 2e 6e 44 69 6d 20 3d 20 28 73 71 6c 69 74 65 33  .nDim = (sqlite3
20090 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
200a0 74 6d 74 29 20 2d 20 31 20 2d 20 6e 41 75 78 29  tmt) - 1 - nAux)
200b0 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 63 68   / 2;.    if( ch
200c0 65 63 6b 2e 6e 44 69 6d 3c 31 20 29 7b 0a 20 20  eck.nDim<1 ){.  
200d0 20 20 20 20 72 74 72 65 65 43 68 65 63 6b 41 70      rtreeCheckAp
200e0 70 65 6e 64 4d 73 67 28 26 63 68 65 63 6b 2c 20  pendMsg(&check, 
200f0 22 53 63 68 65 6d 61 20 63 6f 72 72 75 70 74 20  "Schema corrupt 
20100 6f 72 20 6e 6f 74 20 61 6e 20 72 74 72 65 65 22  or not an rtree"
20110 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
20120 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
20130 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
20140 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 2e   ){.      check.
20150 62 49 6e 74 20 3d 20 28 73 71 6c 69 74 65 33 5f  bInt = (sqlite3_
20160 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
20170 74 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 49 4e  t, 1)==SQLITE_IN
20180 54 45 47 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20  TEGER);.    }.  
20190 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
201a0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
201b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
201c0 54 45 5f 43 4f 52 52 55 50 54 20 29 20 63 68 65  TE_CORRUPT ) che
201d0 63 6b 2e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a  ck.rc = rc;.  }.
201e0 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 61 63 74  .  /* Do the act
201f0 75 61 6c 20 69 6e 74 65 67 72 69 74 79 2d 63 68  ual integrity-ch
20200 65 63 6b 20 2a 2f 0a 20 20 69 66 28 20 63 68 65  eck */.  if( che
20210 63 6b 2e 6e 44 69 6d 3e 3d 31 20 29 7b 0a 20 20  ck.nDim>=1 ){.  
20220 20 20 69 66 28 20 63 68 65 63 6b 2e 72 63 3d 3d    if( check.rc==
20230 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20240 20 20 20 72 74 72 65 65 43 68 65 63 6b 4e 6f 64     rtreeCheckNod
20250 65 28 26 63 68 65 63 6b 2c 20 30 2c 20 30 2c 20  e(&check, 0, 0, 
20260 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 74  1);.    }.    rt
20270 72 65 65 43 68 65 63 6b 43 6f 75 6e 74 28 26 63  reeCheckCount(&c
20280 68 65 63 6b 2c 20 22 5f 72 6f 77 69 64 22 2c 20  heck, "_rowid", 
20290 63 68 65 63 6b 2e 6e 4c 65 61 66 29 3b 0a 20 20  check.nLeaf);.  
202a0 20 20 72 74 72 65 65 43 68 65 63 6b 43 6f 75 6e    rtreeCheckCoun
202b0 74 28 26 63 68 65 63 6b 2c 20 22 5f 70 61 72 65  t(&check, "_pare
202c0 6e 74 22 2c 20 63 68 65 63 6b 2e 6e 4e 6f 6e 4c  nt", check.nNonL
202d0 65 61 66 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eaf);.  }..  /* 
202e0 46 69 6e 61 6c 69 7a 65 20 53 51 4c 20 73 74 61  Finalize SQL sta
202f0 74 65 6d 65 6e 74 73 20 75 73 65 64 20 62 79 20  tements used by 
20300 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
20310 65 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  eck */.  sqlite3
20320 5f 66 69 6e 61 6c 69 7a 65 28 63 68 65 63 6b 2e  _finalize(check.
20330 70 47 65 74 4e 6f 64 65 29 3b 0a 20 20 73 71 6c  pGetNode);.  sql
20340 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 63 68  ite3_finalize(ch
20350 65 63 6b 2e 61 43 68 65 63 6b 4d 61 70 70 69 6e  eck.aCheckMappin
20360 67 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  g[0]);.  sqlite3
20370 5f 66 69 6e 61 6c 69 7a 65 28 63 68 65 63 6b 2e  _finalize(check.
20380 61 43 68 65 63 6b 4d 61 70 70 69 6e 67 5b 31 5d  aCheckMapping[1]
20390 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  );..  /* If one 
203a0 77 61 73 20 6f 70 65 6e 65 64 2c 20 63 6c 6f 73  was opened, clos
203b0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
203c0 6e 20 2a 2f 0a 20 20 69 66 28 20 62 45 6e 64 20  n */.  if( bEnd 
203d0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
203e0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
203f0 20 22 45 4e 44 22 2c 20 30 2c 20 30 2c 20 30 29   "END", 0, 0, 0)
20400 3b 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 2e  ;.    if( check.
20410 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
20420 63 68 65 63 6b 2e 72 63 20 3d 20 72 63 3b 0a 20  check.rc = rc;. 
20430 20 7d 0a 20 20 2a 70 7a 52 65 70 6f 72 74 20 3d   }.  *pzReport =
20440 20 63 68 65 63 6b 2e 7a 52 65 70 6f 72 74 3b 0a   check.zReport;.
20450 20 20 72 65 74 75 72 6e 20 63 68 65 63 6b 2e 72    return check.r
20460 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  c;.}../*.** Usag
20470 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 72 74 72 65 65  e:.**.**   rtree
20480 63 68 65 63 6b 28 3c 72 74 72 65 65 2d 74 61 62  check(<rtree-tab
20490 6c 65 3e 29 3b 0a 2a 2a 20 20 20 72 74 72 65 65  le>);.**   rtree
204a0 63 68 65 63 6b 28 3c 64 61 74 61 62 61 73 65 3e  check(<database>
204b0 2c 20 3c 72 74 72 65 65 2d 74 61 62 6c 65 3e 29  , <rtree-table>)
204c0 3b 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 69 6e 67  ;.**.** Invoking
204d0 20 74 68 69 73 20 53 51 4c 20 66 75 6e 63 74 69   this SQL functi
204e0 6f 6e 20 72 75 6e 73 20 61 6e 20 69 6e 74 65 67  on runs an integ
204f0 72 69 74 79 2d 63 68 65 63 6b 20 6f 6e 20 74 68  rity-check on th
20500 65 20 6e 61 6d 65 64 20 72 74 72 65 65 0a 2a 2a  e named rtree.**
20510 20 74 61 62 6c 65 2e 20 54 68 65 20 69 6e 74 65   table. The inte
20520 67 72 69 74 79 2d 63 68 65 63 6b 20 76 65 72 69  grity-check veri
20530 66 69 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  fies the followi
20540 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 46  ng:.**.**   1. F
20550 6f 72 20 65 61 63 68 20 63 65 6c 6c 20 69 6e 20  or each cell in 
20560 74 68 65 20 72 2d 74 72 65 65 20 73 74 72 75 63  the r-tree struc
20570 74 75 72 65 20 28 25 5f 6e 6f 64 65 20 74 61 62  ture (%_node tab
20580 6c 65 29 2c 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  le), that:.**.**
20590 20 20 20 20 20 20 20 61 29 20 66 6f 72 20 65 61         a) for ea
205a0 63 68 20 64 69 6d 65 6e 73 69 6f 6e 2c 20 28 63  ch dimension, (c
205b0 6f 6f 72 64 31 20 3c 3d 20 63 6f 6f 72 64 32 29  oord1 <= coord2)
205c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 62 29  ..**.**       b)
205d0 20 75 6e 6c 65 73 73 20 74 68 65 20 63 65 6c 6c   unless the cell
205e0 20 69 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20   is on the root 
205f0 6e 6f 64 65 2c 20 74 68 61 74 20 74 68 65 20 63  node, that the c
20600 65 6c 6c 20 69 73 20 62 6f 75 6e 64 65 64 0a 2a  ell is bounded.*
20610 2a 20 20 20 20 20 20 20 20 20 20 62 79 20 74 68  *          by th
20620 65 20 70 61 72 65 6e 74 20 63 65 6c 6c 20 6f 6e  e parent cell on
20630 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65   the parent node
20640 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 63 29  ..**.**       c)
20650 20 66 6f 72 20 6c 65 61 66 20 6e 6f 64 65 73 2c   for leaf nodes,
20660 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
20670 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 25  n entry in the %
20680 5f 72 6f 77 69 64 20 0a 2a 2a 20 20 20 20 20 20  _rowid .**      
20690 20 20 20 20 74 61 62 6c 65 20 63 6f 72 72 65 73      table corres
206a0 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63  ponding to the c
206b0 65 6c 6c 27 73 20 72 6f 77 69 64 20 76 61 6c 75  ell's rowid valu
206c0 65 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  e that .**      
206d0 20 20 20 20 70 6f 69 6e 74 73 20 74 6f 20 74 68      points to th
206e0 65 20 63 6f 72 72 65 63 74 20 6e 6f 64 65 2e 0a  e correct node..
206f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 64 29 20 66  **.**       d) f
20700 6f 72 20 63 65 6c 6c 73 20 6f 6e 20 6e 6f 6e 2d  or cells on non-
20710 6c 65 61 66 20 6e 6f 64 65 73 2c 20 74 68 61 74  leaf nodes, that
20720 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 6e 74   there is an ent
20730 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 20 20  ry in the .**   
20740 20 20 20 20 20 20 20 25 5f 70 61 72 65 6e 74 20         %_parent 
20750 74 61 62 6c 65 20 6d 61 70 70 69 6e 67 20 66 72  table mapping fr
20760 6f 6d 20 74 68 65 20 63 65 6c 6c 27 73 20 63 68  om the cell's ch
20770 69 6c 64 20 6e 6f 64 65 20 74 6f 20 74 68 65 0a  ild node to the.
20780 2a 2a 20 20 20 20 20 20 20 20 20 20 6e 6f 64 65  **          node
20790 20 74 68 61 74 20 69 74 20 72 65 73 69 64 65 73   that it resides
207a0 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20   on..**.**   2. 
207b0 54 68 61 74 20 74 68 65 72 65 20 61 72 65 20 74  That there are t
207c0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
207d0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
207e0 20 25 5f 72 6f 77 69 64 20 74 61 62 6c 65 0a 2a   %_rowid table.*
207f0 2a 20 20 20 20 20 20 61 73 20 74 68 65 72 65 20  *      as there 
20800 61 72 65 20 6c 65 61 66 20 63 65 6c 6c 73 20 69  are leaf cells i
20810 6e 20 74 68 65 20 72 2d 74 72 65 65 20 73 74 72  n the r-tree str
20820 75 63 74 75 72 65 2c 20 61 6e 64 20 74 68 61 74  ucture, and that
20830 20 74 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 69   there.**      i
20840 73 20 61 20 6c 65 61 66 20 63 65 6c 6c 20 74 68  s a leaf cell th
20850 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
20860 6f 20 65 61 63 68 20 65 6e 74 72 79 20 69 6e 20  o each entry in 
20870 74 68 65 20 25 5f 72 6f 77 69 64 20 74 61 62 6c  the %_rowid tabl
20880 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 2e 20 54 68  e..**.**   3. Th
20890 61 74 20 74 68 65 72 65 20 61 72 65 20 74 68 65  at there are the
208a0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
208b0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 25  entries in the %
208c0 5f 70 61 72 65 6e 74 20 74 61 62 6c 65 0a 2a 2a  _parent table.**
208d0 20 20 20 20 20 20 61 73 20 74 68 65 72 65 20 61        as there a
208e0 72 65 20 6e 6f 6e 2d 6c 65 61 66 20 63 65 6c 6c  re non-leaf cell
208f0 73 20 69 6e 20 74 68 65 20 72 2d 74 72 65 65 20  s in the r-tree 
20900 73 74 72 75 63 74 75 72 65 2c 20 61 6e 64 20 74  structure, and t
20910 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
20920 72 65 20 69 73 20 61 20 6e 6f 6e 2d 6c 65 61 66  re is a non-leaf
20930 20 63 65 6c 6c 20 74 68 61 74 20 63 6f 72 72 65   cell that corre
20940 73 70 6f 6e 64 73 20 74 6f 20 65 61 63 68 20 65  sponds to each e
20950 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20  ntry in the .** 
20960 20 20 20 20 20 25 5f 70 61 72 65 6e 74 20 74 61       %_parent ta
20970 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
20980 6f 69 64 20 72 74 72 65 65 63 68 65 63 6b 28 0a  oid rtreecheck(.
20990 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
209a0 74 20 2a 63 74 78 2c 20 0a 20 20 69 6e 74 20 6e  t *ctx, .  int n
209b0 41 72 67 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  Arg, .  sqlite3_
209c0 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b  value **apArg.){
209d0 0a 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20 26  .  if( nArg!=1 &
209e0 26 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20  & nArg!=2 ){.   
209f0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
20a00 65 72 72 6f 72 28 63 74 78 2c 20 0a 20 20 20 20  error(ctx, .    
20a10 20 20 20 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65      "wrong numbe
20a20 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
20a30 6f 20 66 75 6e 63 74 69 6f 6e 20 72 74 72 65 65  o function rtree
20a40 63 68 65 63 6b 28 29 22 2c 20 2d 31 0a 20 20 20  check()", -1.   
20a50 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
20a60 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 68 61   int rc;.    cha
20a70 72 20 2a 7a 52 65 70 6f 72 74 20 3d 20 30 3b 0a  r *zReport = 0;.
20a80 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20a90 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zDb = (const cha
20aa0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
20ab0 5f 74 65 78 74 28 61 70 41 72 67 5b 30 5d 29 3b  _text(apArg[0]);
20ac0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
20ad0 2a 7a 54 61 62 3b 0a 20 20 20 20 69 66 28 20 6e  *zTab;.    if( n
20ae0 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Arg==1 ){.      
20af0 7a 54 61 62 20 3d 20 7a 44 62 3b 0a 20 20 20 20  zTab = zDb;.    
20b00 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a    zDb = "main";.
20b10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20b20 20 7a 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63   zTab = (const c
20b30 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
20b40 75 65 5f 74 65 78 74 28 61 70 41 72 67 5b 31 5d  ue_text(apArg[1]
20b50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
20b60 3d 20 72 74 72 65 65 43 68 65 63 6b 54 61 62 6c  = rtreeCheckTabl
20b70 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
20b80 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 74 78 29  t_db_handle(ctx)
20b90 2c 20 7a 44 62 2c 20 7a 54 61 62 2c 20 26 7a 52  , zDb, zTab, &zR
20ba0 65 70 6f 72 74 29 3b 0a 20 20 20 20 69 66 28 20  eport);.    if( 
20bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
20bd0 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20  esult_text(ctx, 
20be0 7a 52 65 70 6f 72 74 20 3f 20 7a 52 65 70 6f 72  zReport ? zRepor
20bf0 74 20 3a 20 22 6f 6b 22 2c 20 2d 31 2c 20 53 51  t : "ok", -1, SQ
20c00 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
20c10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20c20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
20c30 5f 65 72 72 6f 72 5f 63 6f 64 65 28 63 74 78 2c  _error_code(ctx,
20c40 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   rc);.    }.    
20c50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65  sqlite3_free(zRe
20c60 70 6f 72 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  port);.  }.}../*
20c70 20 43 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 69   Conditionally i
20c80 6e 63 6c 75 64 65 20 74 68 65 20 67 65 6f 70 6f  nclude the geopo
20c90 6c 79 20 63 6f 64 65 20 2a 2f 0a 23 69 66 64 65  ly code */.#ifde
20ca0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20cb0 47 45 4f 50 4f 4c 59 0a 23 20 69 6e 63 6c 75 64  GEOPOLY.# includ
20cc0 65 20 22 67 65 6f 70 6f 6c 79 2e 63 22 0a 23 65  e "geopoly.c".#e
20cd0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  ndif../*.** Regi
20ce0 73 74 65 72 20 74 68 65 20 72 2d 74 72 65 65 20  ster the r-tree 
20cf0 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61  module with data
20d00 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 20  base handle db. 
20d10 54 68 69 73 20 63 72 65 61 74 65 73 20 74 68 65  This creates the
20d20 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
20d30 65 20 6d 6f 64 75 6c 65 20 22 72 74 72 65 65 22  e module "rtree"
20d40 20 61 6e 64 20 74 68 65 20 64 65 62 75 67 67 69   and the debuggi
20d50 6e 67 2f 61 6e 61 6c 79 73 69 73 20 73 63 61 6c  ng/analysis scal
20d60 61 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ar .** function 
20d70 22 72 74 72 65 65 6e 6f 64 65 22 2e 0a 2a 2f 0a  "rtreenode"..*/.
20d80 69 6e 74 20 73 71 6c 69 74 65 33 52 74 72 65 65  int sqlite3Rtree
20d90 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  Init(sqlite3 *db
20da0 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 75  ){.  const int u
20db0 74 66 38 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  tf8 = SQLITE_UTF
20dc0 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  8;.  int rc;..  
20dd0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
20de0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
20df0 20 22 72 74 72 65 65 6e 6f 64 65 22 2c 20 32 2c   "rtreenode", 2,
20e00 20 75 74 66 38 2c 20 30 2c 20 72 74 72 65 65 6e   utf8, 0, rtreen
20e10 6f 64 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  ode, 0, 0);.  if
20e20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20e30 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
20e40 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
20e50 69 6f 6e 28 64 62 2c 20 22 72 74 72 65 65 64 65  ion(db, "rtreede
20e60 70 74 68 22 2c 20 31 2c 20 75 74 66 38 2c 20 30  pth", 1, utf8, 0
20e70 2c 72 74 72 65 65 64 65 70 74 68 2c 20 30 2c 20  ,rtreedepth, 0, 
20e80 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
20e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20ea0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
20eb0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
20ec0 64 62 2c 20 22 72 74 72 65 65 63 68 65 63 6b 22  db, "rtreecheck"
20ed0 2c 20 2d 31 2c 20 75 74 66 38 2c 20 30 2c 72 74  , -1, utf8, 0,rt
20ee0 72 65 65 63 68 65 63 6b 2c 20 30 2c 30 29 3b 0a  reecheck, 0,0);.
20ef0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
20f00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64 65  LITE_OK ){.#ifde
20f10 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45 5f 49  f SQLITE_RTREE_I
20f20 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 76 6f 69 64  NT_ONLY.    void
20f30 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29 52 54   *c = (void *)RT
20f40 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 3b  REE_COORD_INT32;
20f50 0a 23 65 6c 73 65 0a 20 20 20 20 76 6f 69 64 20  .#else.    void 
20f60 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29 52 54 52  *c = (void *)RTR
20f70 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32 3b  EE_COORD_REAL32;
20f80 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
20f90 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
20fa0 6d 6f 64 75 6c 65 5f 76 32 28 64 62 2c 20 22 72  module_v2(db, "r
20fb0 74 72 65 65 22 2c 20 26 72 74 72 65 65 4d 6f 64  tree", &rtreeMod
20fc0 75 6c 65 2c 20 63 2c 20 30 29 3b 0a 20 20 7d 0a  ule, c, 0);.  }.
20fd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20fe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  _OK ){.    void 
20ff0 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29 52 54 52  *c = (void *)RTR
21000 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 3b 0a  EE_COORD_INT32;.
21010 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21020 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76  _create_module_v
21030 32 28 64 62 2c 20 22 72 74 72 65 65 5f 69 33 32  2(db, "rtree_i32
21040 22 2c 20 26 72 74 72 65 65 4d 6f 64 75 6c 65 2c  ", &rtreeModule,
21050 20 63 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64   c, 0);.  }.#ifd
21060 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
21070 5f 47 45 4f 50 4f 4c 59 0a 20 20 69 66 28 20 72  _GEOPOLY.  if( r
21080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21090 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
210a0 5f 67 65 6f 70 6f 6c 79 5f 69 6e 69 74 28 64 62  _geopoly_init(db
210b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
210c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
210d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
210e0 65 20 64 65 6c 65 74 65 73 20 74 68 65 20 52 74  e deletes the Rt
210f0 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20  reeGeomCallback 
21100 6f 62 6a 65 63 74 20 74 68 61 74 20 77 61 73 20  object that was 
21110 61 74 74 61 63 68 65 64 0a 2a 2a 20 6f 6e 65 20  attached.** one 
21120 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  of the SQL funct
21130 69 6f 6e 73 20 63 72 65 61 74 65 20 62 79 20 73  ions create by s
21140 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f  qlite3_rtree_geo
21150 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29  metry_callback()
21160 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f 72  .** or sqlite3_r
21170 74 72 65 65 5f 71 75 65 72 79 5f 63 61 6c 6c 62  tree_query_callb
21180 61 63 6b 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ack().  In other
21190 20 77 6f 72 64 73 2c 20 74 68 69 73 20 72 6f 75   words, this rou
211a0 74 69 6e 65 20 69 73 20 74 68 65 0a 2a 2a 20 64  tine is the.** d
211b0 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 6e  estructor for an
211c0 20 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61   RtreeGeomCallba
211d0 63 6b 20 6f 62 6a 65 63 63 74 2e 20 20 54 68 69  ck objecct.  Thi
211e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
211f0 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  led when.** the 
21200 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 53 51  corresponding SQ
21210 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65  L function is de
21220 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
21230 20 76 6f 69 64 20 72 74 72 65 65 46 72 65 65 43   void rtreeFreeC
21240 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 29  allback(void *p)
21250 7b 0a 20 20 52 74 72 65 65 47 65 6f 6d 43 61 6c  {.  RtreeGeomCal
21260 6c 62 61 63 6b 20 2a 70 49 6e 66 6f 20 3d 20 28  lback *pInfo = (
21270 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63  RtreeGeomCallbac
21280 6b 2a 29 70 3b 0a 20 20 69 66 28 20 70 49 6e 66  k*)p;.  if( pInf
21290 6f 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  o->xDestructor )
212a0 20 70 49 6e 66 6f 2d 3e 78 44 65 73 74 72 75 63   pInfo->xDestruc
212b0 74 6f 72 28 70 49 6e 66 6f 2d 3e 70 43 6f 6e 74  tor(pInfo->pCont
212c0 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ext);.  sqlite3_
212d0 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  free(p);.}../*.*
212e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66  * This routine f
212f0 72 65 65 73 20 74 68 65 20 42 4c 4f 42 20 74 68  rees the BLOB th
21300 61 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  at is returned b
21310 79 20 67 65 6f 6d 43 61 6c 6c 62 61 63 6b 28 29  y geomCallback()
21320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21330 20 72 74 72 65 65 4d 61 74 63 68 41 72 67 46 72   rtreeMatchArgFr
21340 65 65 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ee(void *pArg){.
21350 20 20 69 6e 74 20 69 3b 0a 20 20 52 74 72 65 65    int i;.  Rtree
21360 4d 61 74 63 68 41 72 67 20 2a 70 20 3d 20 28 52  MatchArg *p = (R
21370 74 72 65 65 4d 61 74 63 68 41 72 67 2a 29 70 41  treeMatchArg*)pA
21380 72 67 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rg;.  for(i=0; i
21390 3c 70 2d 3e 6e 50 61 72 61 6d 3b 20 69 2b 2b 29  <p->nParam; i++)
213a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
213b0 6c 75 65 5f 66 72 65 65 28 70 2d 3e 61 70 53 71  lue_free(p->apSq
213c0 6c 50 61 72 61 6d 5b 69 5d 29 3b 0a 20 20 7d 0a  lParam[i]);.  }.
213d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
213e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  );.}../*.** Each
213f0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
21400 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f  _rtree_geometry_
21410 63 61 6c 6c 62 61 63 6b 28 29 20 6f 72 0a 2a 2a  callback() or.**
21420 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71   sqlite3_rtree_q
21430 75 65 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29 20  uery_callback() 
21440 63 72 65 61 74 65 73 20 61 6e 20 6f 72 64 69 6e  creates an ordin
21450 61 72 79 20 53 51 4c 69 74 65 0a 2a 2a 20 73 63  ary SQLite.** sc
21460 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 74 68  alar function th
21470 61 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  at is implemente
21480 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
21490 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 69  e..**.** All thi
214a0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
214b0 69 73 20 63 6f 6e 73 74 72 75 63 74 20 61 6e 20  is construct an 
214c0 52 74 72 65 65 4d 61 74 63 68 41 72 67 20 6f 62  RtreeMatchArg ob
214d0 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6e  ject that.** con
214e0 74 61 69 6e 73 20 74 68 65 20 67 65 6f 6d 65 74  tains the geomet
214f0 72 79 2d 63 68 65 63 6b 69 6e 67 20 63 61 6c 6c  ry-checking call
21500 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 6e  back routines an
21510 64 20 61 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 70  d a list of.** p
21520 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69  arameters to thi
21530 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e  s function, then
21540 20 72 65 74 75 72 6e 20 74 68 61 74 20 52 74 72   return that Rtr
21550 65 65 4d 61 74 63 68 41 72 67 20 6f 62 6a 65 63  eeMatchArg objec
21560 74 0a 2a 2a 20 61 73 20 61 20 42 4c 4f 42 2e 0a  t.** as a BLOB..
21570 2a 2a 0a 2a 2a 20 54 68 65 20 52 2d 54 72 65 65  **.** The R-Tree
21580 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
21590 77 69 6c 6c 20 72 65 61 64 20 74 68 65 20 72 65  will read the re
215a0 74 75 72 6e 65 64 20 42 4c 4f 42 2c 20 64 65 73  turned BLOB, des
215b0 65 72 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20  erialize.** the 
215c0 52 74 72 65 65 4d 61 74 63 68 41 72 67 20 6f 62  RtreeMatchArg ob
215d0 6a 65 63 74 2c 20 61 6e 64 20 75 73 65 20 74 68  ject, and use th
215e0 65 20 52 74 72 65 65 4d 61 74 63 68 41 72 67 20  e RtreeMatchArg 
215f0 6f 62 6a 65 63 74 20 74 6f 20 66 69 67 75 72 65  object to figure
21600 0a 2a 2a 20 6f 75 74 20 77 68 69 63 68 20 65 6c  .** out which el
21610 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 52 2d  ements of the R-
21620 54 72 65 65 20 73 68 6f 75 6c 64 20 62 65 20 72  Tree should be r
21630 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 71  eturned by the q
21640 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
21650 76 6f 69 64 20 67 65 6f 6d 43 61 6c 6c 62 61 63  void geomCallbac
21660 6b 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  k(sqlite3_contex
21670 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67  t *ctx, int nArg
21680 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
21690 2a 2a 61 41 72 67 29 7b 0a 20 20 52 74 72 65 65  **aArg){.  Rtree
216a0 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 70 47  GeomCallback *pG
216b0 65 6f 6d 43 74 78 20 3d 20 28 52 74 72 65 65 47  eomCtx = (RtreeG
216c0 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 29 73 71  eomCallback *)sq
216d0 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
216e0 63 74 78 29 3b 0a 20 20 52 74 72 65 65 4d 61 74  ctx);.  RtreeMat
216f0 63 68 41 72 67 20 2a 70 42 6c 6f 62 3b 0a 20 20  chArg *pBlob;.  
21700 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
21710 6c 6f 62 3b 0a 20 20 69 6e 74 20 6d 65 6d 45 72  lob;.  int memEr
21720 72 20 3d 20 30 3b 0a 0a 20 20 6e 42 6c 6f 62 20  r = 0;..  nBlob 
21730 3d 20 73 69 7a 65 6f 66 28 52 74 72 65 65 4d 61  = sizeof(RtreeMa
21740 74 63 68 41 72 67 29 20 2b 20 28 6e 41 72 67 2d  tchArg) + (nArg-
21750 31 29 2a 73 69 7a 65 6f 66 28 52 74 72 65 65 44  1)*sizeof(RtreeD
21760 56 61 6c 75 65 29 0a 20 20 20 20 20 20 20 20 20  Value).         
21770 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28    + nArg*sizeof(
21780 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 3b  sqlite3_value*);
21790 0a 20 20 70 42 6c 6f 62 20 3d 20 28 52 74 72 65  .  pBlob = (Rtre
217a0 65 4d 61 74 63 68 41 72 67 20 2a 29 73 71 6c 69  eMatchArg *)sqli
217b0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 6c  te3_malloc64(nBl
217c0 6f 62 29 3b 0a 20 20 69 66 28 20 21 70 42 6c 6f  ob);.  if( !pBlo
217d0 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
217e0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
217f0 6d 65 6d 28 63 74 78 29 3b 0a 20 20 7d 65 6c 73  mem(ctx);.  }els
21800 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
21810 20 20 70 42 6c 6f 62 2d 3e 69 53 69 7a 65 20 3d    pBlob->iSize =
21820 20 6e 42 6c 6f 62 3b 0a 20 20 20 20 70 42 6c 6f   nBlob;.    pBlo
21830 62 2d 3e 63 62 20 3d 20 70 47 65 6f 6d 43 74 78  b->cb = pGeomCtx
21840 5b 30 5d 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e  [0];.    pBlob->
21850 61 70 53 71 6c 50 61 72 61 6d 20 3d 20 28 73 71  apSqlParam = (sq
21860 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 26 70  lite3_value**)&p
21870 42 6c 6f 62 2d 3e 61 50 61 72 61 6d 5b 6e 41 72  Blob->aParam[nAr
21880 67 5d 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 6e  g];.    pBlob->n
21890 50 61 72 61 6d 20 3d 20 6e 41 72 67 3b 0a 20 20  Param = nArg;.  
218a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
218b0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  g; i++){.      p
218c0 42 6c 6f 62 2d 3e 61 70 53 71 6c 50 61 72 61 6d  Blob->apSqlParam
218d0 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  [i] = sqlite3_va
218e0 6c 75 65 5f 64 75 70 28 61 41 72 67 5b 69 5d 29  lue_dup(aArg[i])
218f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 6c 6f  ;.      if( pBlo
21900 62 2d 3e 61 70 53 71 6c 50 61 72 61 6d 5b 69 5d  b->apSqlParam[i]
21910 3d 3d 30 20 29 20 6d 65 6d 45 72 72 20 3d 20 31  ==0 ) memErr = 1
21920 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
21930 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20  RTREE_INT_ONLY. 
21940 20 20 20 20 20 70 42 6c 6f 62 2d 3e 61 50 61 72       pBlob->aPar
21950 61 6d 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f  am[i] = sqlite3_
21960 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 41 72 67  value_int64(aArg
21970 5b 69 5d 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  [i]);.#else.    
21980 20 20 70 42 6c 6f 62 2d 3e 61 50 61 72 61 6d 5b    pBlob->aParam[
21990 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  i] = sqlite3_val
219a0 75 65 5f 64 6f 75 62 6c 65 28 61 41 72 67 5b 69  ue_double(aArg[i
219b0 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ]);.#endif.    }
219c0 0a 20 20 20 20 69 66 28 20 6d 65 6d 45 72 72 20  .    if( memErr 
219d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
219e0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
219f0 6d 65 6d 28 63 74 78 29 3b 0a 20 20 20 20 20 20  mem(ctx);.      
21a00 72 74 72 65 65 4d 61 74 63 68 41 72 67 46 72 65  rtreeMatchArgFre
21a10 65 28 70 42 6c 6f 62 29 3b 0a 20 20 20 20 7d 65  e(pBlob);.    }e
21a20 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
21a30 65 33 5f 72 65 73 75 6c 74 5f 70 6f 69 6e 74 65  e3_result_pointe
21a40 72 28 63 74 78 2c 20 70 42 6c 6f 62 2c 20 22 52  r(ctx, pBlob, "R
21a50 74 72 65 65 4d 61 74 63 68 41 72 67 22 2c 20 72  treeMatchArg", r
21a60 74 72 65 65 4d 61 74 63 68 41 72 67 46 72 65 65  treeMatchArgFree
21a70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
21a80 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
21a90 20 6e 65 77 20 67 65 6f 6d 65 74 72 79 20 66 75   new geometry fu
21aa0 6e 63 74 69 6f 6e 20 66 6f 72 20 75 73 65 20 77  nction for use w
21ab0 69 74 68 20 74 68 65 20 72 2d 74 72 65 65 20 4d  ith the r-tree M
21ac0 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ATCH operator..*
21ad0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 74  /.int sqlite3_rt
21ae0 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c  ree_geometry_cal
21af0 6c 62 61 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  lback(.  sqlite3
21b00 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
21b10 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
21b20 65 72 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  er SQL function 
21b30 6f 6e 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  on this connecti
21b40 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
21b50 61 72 20 2a 7a 47 65 6f 6d 2c 20 20 20 20 20 20  ar *zGeom,      
21b60 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
21b70 20 74 68 65 20 6e 65 77 20 53 51 4c 20 66 75 6e   the new SQL fun
21b80 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 28  ction */.  int (
21b90 2a 78 47 65 6f 6d 29 28 73 71 6c 69 74 65 33 5f  *xGeom)(sqlite3_
21ba0 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 2a 2c  rtree_geometry*,
21bb0 69 6e 74 2c 52 74 72 65 65 44 56 61 6c 75 65 2a  int,RtreeDValue*
21bc0 2c 69 6e 74 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62  ,int*), /* Callb
21bd0 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ack */.  void *p
21be0 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
21bf0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
21c00 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
21c10 77 69 74 68 20 74 68 65 20 63 61 6c 6c 62 61 63  with the callbac
21c20 6b 20 2a 2f 0a 29 7b 0a 20 20 52 74 72 65 65 47  k */.){.  RtreeG
21c30 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 70 47 65  eomCallback *pGe
21c40 6f 6d 43 74 78 3b 20 20 20 20 20 20 2f 2a 20 43  omCtx;      /* C
21c50 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f  ontext object fo
21c60 72 20 6e 65 77 20 75 73 65 72 2d 66 75 6e 63 74  r new user-funct
21c70 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ion */..  /* All
21c80 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61  ocate and popula
21c90 74 65 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  te the context o
21ca0 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 47 65 6f  bject. */.  pGeo
21cb0 6d 43 74 78 20 3d 20 28 52 74 72 65 65 47 65 6f  mCtx = (RtreeGeo
21cc0 6d 43 61 6c 6c 62 61 63 6b 20 2a 29 73 71 6c 69  mCallback *)sqli
21cd0 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
21ce0 66 28 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62  f(RtreeGeomCallb
21cf0 61 63 6b 29 29 3b 0a 20 20 69 66 28 20 21 70 47  ack));.  if( !pG
21d00 65 6f 6d 43 74 78 20 29 20 72 65 74 75 72 6e 20  eomCtx ) return 
21d10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
21d20 70 47 65 6f 6d 43 74 78 2d 3e 78 47 65 6f 6d 20  pGeomCtx->xGeom 
21d30 3d 20 78 47 65 6f 6d 3b 0a 20 20 70 47 65 6f 6d  = xGeom;.  pGeom
21d40 43 74 78 2d 3e 78 51 75 65 72 79 46 75 6e 63 20  Ctx->xQueryFunc 
21d50 3d 20 30 3b 0a 20 20 70 47 65 6f 6d 43 74 78 2d  = 0;.  pGeomCtx-
21d60 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 30  >xDestructor = 0
21d70 3b 0a 20 20 70 47 65 6f 6d 43 74 78 2d 3e 70 43  ;.  pGeomCtx->pC
21d80 6f 6e 74 65 78 74 20 3d 20 70 43 6f 6e 74 65 78  ontext = pContex
21d90 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  t;.  return sqli
21da0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
21db0 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 47 65 6f 6d  ion_v2(db, zGeom
21dc0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59  , -1, SQLITE_ANY
21dd0 2c 20 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a  , .      (void *
21de0 29 70 47 65 6f 6d 43 74 78 2c 20 67 65 6f 6d 43  )pGeomCtx, geomC
21df0 61 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 2c 20 72  allback, 0, 0, r
21e00 74 72 65 65 46 72 65 65 43 61 6c 6c 62 61 63 6b  treeFreeCallback
21e10 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  .  );.}../*.** R
21e20 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 32 6e  egister a new 2n
21e30 64 2d 67 65 6e 65 72 61 74 69 6f 6e 20 67 65 6f  d-generation geo
21e40 6d 65 74 72 79 20 66 75 6e 63 74 69 6f 6e 20 66  metry function f
21e50 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65 0a  or use with the.
21e60 2a 2a 20 72 2d 74 72 65 65 20 4d 41 54 43 48 20  ** r-tree MATCH 
21e70 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 69 6e 74  operator..*/.int
21e80 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71   sqlite3_rtree_q
21e90 75 65 72 79 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  uery_callback(. 
21ea0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21ec0 20 52 65 67 69 73 74 65 72 20 53 51 4c 20 66 75   Register SQL fu
21ed0 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 63  nction on this c
21ee0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  onnection */.  c
21ef0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72  onst char *zQuer
21f00 79 46 75 6e 63 2c 20 20 20 20 20 20 2f 2a 20 4e  yFunc,      /* N
21f10 61 6d 65 20 6f 66 20 6e 65 77 20 53 51 4c 20 66  ame of new SQL f
21f20 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
21f30 20 28 2a 78 51 75 65 72 79 46 75 6e 63 29 28 73   (*xQueryFunc)(s
21f40 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71 75 65  qlite3_rtree_que
21f50 72 79 5f 69 6e 66 6f 2a 29 2c 20 2f 2a 20 43 61  ry_info*), /* Ca
21f60 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64  llback */.  void
21f70 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20   *pContext,     
21f80 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
21f90 61 20 64 61 74 61 20 70 61 73 73 65 64 20 69 6e  a data passed in
21fa0 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
21fb0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  */.  void (*xDes
21fc0 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a 29 20  tructor)(void*) 
21fd0 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20    /* Destructor 
21fe0 66 6f 72 20 74 68 65 20 65 78 74 72 61 20 64 61  for the extra da
21ff0 74 61 20 2a 2f 0a 29 7b 0a 20 20 52 74 72 65 65  ta */.){.  Rtree
22000 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 70 47  GeomCallback *pG
22010 65 6f 6d 43 74 78 3b 20 20 20 20 20 20 2f 2a 20  eomCtx;      /* 
22020 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66  Context object f
22030 6f 72 20 6e 65 77 20 75 73 65 72 2d 66 75 6e 63  or new user-func
22040 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  tion */..  /* Al
22050 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c  locate and popul
22060 61 74 65 20 74 68 65 20 63 6f 6e 74 65 78 74 20  ate the context 
22070 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 47 65  object. */.  pGe
22080 6f 6d 43 74 78 20 3d 20 28 52 74 72 65 65 47 65  omCtx = (RtreeGe
22090 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 29 73 71 6c  omCallback *)sql
220a0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
220b0 6f 66 28 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c  of(RtreeGeomCall
220c0 62 61 63 6b 29 29 3b 0a 20 20 69 66 28 20 21 70  back));.  if( !p
220d0 47 65 6f 6d 43 74 78 20 29 20 72 65 74 75 72 6e  GeomCtx ) return
220e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
220f0 20 70 47 65 6f 6d 43 74 78 2d 3e 78 47 65 6f 6d   pGeomCtx->xGeom
22100 20 3d 20 30 3b 0a 20 20 70 47 65 6f 6d 43 74 78   = 0;.  pGeomCtx
22110 2d 3e 78 51 75 65 72 79 46 75 6e 63 20 3d 20 78  ->xQueryFunc = x
22120 51 75 65 72 79 46 75 6e 63 3b 0a 20 20 70 47 65  QueryFunc;.  pGe
22130 6f 6d 43 74 78 2d 3e 78 44 65 73 74 72 75 63 74  omCtx->xDestruct
22140 6f 72 20 3d 20 78 44 65 73 74 72 75 63 74 6f 72  or = xDestructor
22150 3b 0a 20 20 70 47 65 6f 6d 43 74 78 2d 3e 70 43  ;.  pGeomCtx->pC
22160 6f 6e 74 65 78 74 20 3d 20 70 43 6f 6e 74 65 78  ontext = pContex
22170 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  t;.  return sqli
22180 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
22190 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 51 75 65 72  ion_v2(db, zQuer
221a0 79 46 75 6e 63 2c 20 2d 31 2c 20 53 51 4c 49 54  yFunc, -1, SQLIT
221b0 45 5f 41 4e 59 2c 20 0a 20 20 20 20 20 20 28 76  E_ANY, .      (v
221c0 6f 69 64 20 2a 29 70 47 65 6f 6d 43 74 78 2c 20  oid *)pGeomCtx, 
221d0 67 65 6f 6d 43 61 6c 6c 62 61 63 6b 2c 20 30 2c  geomCallback, 0,
221e0 20 30 2c 20 72 74 72 65 65 46 72 65 65 43 61 6c   0, rtreeFreeCal
221f0 6c 62 61 63 6b 0a 20 20 29 3b 0a 7d 0a 0a 23 69  lback.  );.}..#i
22200 66 20 21 53 51 4c 49 54 45 5f 43 4f 52 45 0a 23  f !SQLITE_CORE.#
22210 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64  ifdef _WIN32.__d
22220 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
22230 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71  t).#endif.int sq
22240 6c 69 74 65 33 5f 72 74 72 65 65 5f 69 6e 69 74  lite3_rtree_init
22250 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
22260 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
22270 73 67 2c 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  sg,.  const sqli
22280 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
22290 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49   *pApi.){.  SQLI
222a0 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49  TE_EXTENSION_INI
222b0 54 32 28 70 41 70 69 29 0a 20 20 72 65 74 75 72  T2(pApi).  retur
222c0 6e 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e  n sqlite3RtreeIn
222d0 69 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66  it(db);.}.#endif
222e0 0a 0a 23 65 6e 64 69 66 0a                       ..#endif.