/ Hex Artifact Content
Login

Artifact f5fa951eba03c41d292958064604a033021acdee:


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 29 0a 2a 2a 0a  eno INTEGER).**.
0410: 2a 2a 20 54 68 65 20 64 61 74 61 20 66 6f 72 20  ** The data for 
0420: 65 61 63 68 20 6e 6f 64 65 20 6f 66 20 74 68 65  each node of the
0430: 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   r-tree structur
0440: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
0450: 68 65 20 25 5f 6e 6f 64 65 0a 2a 2a 20 74 61 62  he %_node.** tab
0460: 6c 65 2e 20 46 6f 72 20 65 61 63 68 20 6e 6f 64  le. For each nod
0470: 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 74 68  e that is not th
0480: 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74  e root node of t
0490: 68 65 20 72 2d 74 72 65 65 2c 20 74 68 65 72 65  he r-tree, there
04a0: 20 69 73 0a 2a 2a 20 61 6e 20 65 6e 74 72 79 20   is.** an entry 
04b0: 69 6e 20 74 68 65 20 25 5f 70 61 72 65 6e 74 20  in the %_parent 
04c0: 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 69 6e  table associatin
04d0: 67 20 74 68 65 20 6e 6f 64 65 20 77 69 74 68 20  g the node with 
04e0: 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 20 41  its parent..** A
04f0: 6e 64 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  nd for each row 
0500: 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  of data in the t
0510: 61 62 6c 65 2c 20 74 68 65 72 65 20 69 73 20 61  able, there is a
0520: 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 25  n entry in the %
0530: 5f 72 6f 77 69 64 0a 2a 2a 20 74 61 62 6c 65 20  _rowid.** table 
0540: 74 68 61 74 20 6d 61 70 73 20 66 72 6f 6d 20 74  that maps from t
0550: 68 65 20 65 6e 74 72 69 65 73 20 72 6f 77 69 64  he entries rowid
0560: 20 74 6f 20 74 68 65 20 69 64 20 6f 66 20 74 68   to the id of th
0570: 65 20 6e 6f 64 65 20 74 68 61 74 20 69 74 0a 2a  e node that it.*
0580: 2a 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 2e 0a  * is stored on..
0590: 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 6e  **.** The root n
05a0: 6f 64 65 20 6f 66 20 61 6e 20 72 2d 74 72 65 65  ode of an r-tree
05b0: 20 61 6c 77 61 79 73 20 65 78 69 73 74 73 2c 20   always exists, 
05c0: 65 76 65 6e 20 69 66 20 74 68 65 20 72 2d 74 72  even if the r-tr
05d0: 65 65 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 65  ee table is.** e
05e0: 6d 70 74 79 2e 20 54 68 65 20 6e 6f 64 65 6e 6f  mpty. The nodeno
05f0: 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   of the root nod
0600: 65 20 69 73 20 61 6c 77 61 79 73 20 31 2e 20 41  e is always 1. A
0610: 6c 6c 20 6f 74 68 65 72 20 6e 6f 64 65 73 20 69  ll other nodes i
0620: 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6d  n the.** table m
0630: 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
0640: 73 69 7a 65 20 61 73 20 74 68 65 20 72 6f 6f 74  size as the root
0650: 20 6e 6f 64 65 2e 20 54 68 65 20 63 6f 6e 74 65   node. The conte
0660: 6e 74 20 6f 66 20 65 61 63 68 20 6e 6f 64 65 0a  nt of each node.
0670: 2a 2a 20 69 73 20 66 6f 72 6d 61 74 74 65 64 20  ** is formatted 
0680: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
0690: 2a 20 20 20 31 2e 20 49 66 20 74 68 65 20 6e 6f  *   1. If the no
06a0: 64 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6e  de is the root n
06b0: 6f 64 65 20 28 6e 6f 64 65 20 31 29 2c 20 74 68  ode (node 1), th
06c0: 65 6e 20 74 68 65 20 66 69 72 73 74 20 32 20 62  en the first 2 b
06d0: 79 74 65 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20  ytes.**      of 
06e0: 74 68 65 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e  the node contain
06f0: 20 74 68 65 20 74 72 65 65 20 64 65 70 74 68 20   the tree depth 
0700: 61 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  as a big-endian 
0710: 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 20 20 20 20  integer..**     
0720: 20 46 6f 72 20 6e 6f 6e 2d 72 6f 6f 74 20 6e 6f   For non-root no
0730: 64 65 73 2c 20 74 68 65 20 66 69 72 73 74 20 32  des, the first 2
0740: 20 62 79 74 65 73 20 61 72 65 20 6c 65 66 74 20   bytes are left 
0750: 75 6e 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  unused..**.**   
0760: 32 2e 20 54 68 65 20 6e 65 78 74 20 32 20 62 79  2. The next 2 by
0770: 74 65 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  tes contain the 
0780: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
0790: 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20  s currently .** 
07a0: 20 20 20 20 20 73 74 6f 72 65 64 20 69 6e 20 74       stored in t
07b0: 68 65 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20  he node..**.**  
07c0: 20 33 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65   3. The remainde
07d0: 72 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 63 6f  r of the node co
07e0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 6f 64 65 20  ntains the node 
07f0: 65 6e 74 72 69 65 73 2e 20 45 61 63 68 20 65 6e  entries. Each en
0800: 74 72 79 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 73  try.**      cons
0810: 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
0820: 20 38 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   8-byte integer 
0830: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 65  followed by an e
0840: 76 65 6e 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ven number.**   
0850: 20 20 20 6f 66 20 34 2d 62 79 74 65 20 63 6f 6f     of 4-byte coo
0860: 72 64 69 6e 61 74 65 73 2e 20 46 6f 72 20 6c 65  rdinates. For le
0870: 61 66 20 6e 6f 64 65 73 20 74 68 65 20 69 6e 74  af nodes the int
0880: 65 67 65 72 20 69 73 20 74 68 65 20 72 6f 77 69  eger is the rowi
0890: 64 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61 20 72  d.**      of a r
08a0: 65 63 6f 72 64 2e 20 46 6f 72 20 69 6e 74 65 72  ecord. For inter
08b0: 6e 61 6c 20 6e 6f 64 65 73 20 69 74 20 69 73 20  nal nodes it is 
08c0: 74 68 65 20 6e 6f 64 65 20 6e 75 6d 62 65 72 20  the node number 
08d0: 6f 66 20 61 0a 2a 2a 20 20 20 20 20 20 63 68 69  of a.**      chi
08e0: 6c 64 20 70 61 67 65 2e 0a 2a 2f 0a 0a 23 69 66  ld page..*/..#if
08f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0900: 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e 65  _CORE) || define
0910: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
0920: 52 54 52 45 45 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  RTREE)../*.** Th
0930: 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  is file contains
0940: 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   an implementati
0950: 6f 6e 20 6f 66 20 61 20 63 6f 75 70 6c 65 20 6f  on of a couple o
0960: 66 20 64 69 66 66 65 72 65 6e 74 20 76 61 72 69  f different vari
0970: 61 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 72  ants.** of the r
0980: 2d 74 72 65 65 20 61 6c 67 6f 72 69 74 68 6d 2e  -tree algorithm.
0990: 20 53 65 65 20 74 68 65 20 52 45 41 44 4d 45 20   See the README 
09a0: 66 69 6c 65 20 66 6f 72 20 66 75 72 74 68 65 72  file for further
09b0: 20 64 65 74 61 69 6c 73 2e 20 54 68 65 20 0a 2a   details. The .*
09c0: 2a 20 73 61 6d 65 20 64 61 74 61 2d 73 74 72 75  * same data-stru
09d0: 63 74 75 72 65 20 69 73 20 75 73 65 64 20 66 6f  cture is used fo
09e0: 72 20 61 6c 6c 2c 20 62 75 74 20 74 68 65 20 61  r all, but the a
09f0: 6c 67 6f 72 69 74 68 6d 73 20 66 6f 72 20 69 6e  lgorithms for in
0a00: 73 65 72 74 20 61 6e 64 0a 2a 2a 20 64 65 6c 65  sert and.** dele
0a10: 74 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 76 61  te operations va
0a20: 72 79 2e 20 54 68 65 20 76 61 72 69 61 6e 74 73  ry. The variants
0a30: 20 75 73 65 64 20 61 72 65 20 73 65 6c 65 63 74   used are select
0a40: 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
0a50: 6d 65 20 0a 2a 2a 20 62 79 20 64 65 66 69 6e 69  me .** by defini
0a60: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
0a70: 20 73 79 6d 62 6f 6c 73 3a 0a 2a 2f 0a 0a 2f 2a   symbols:.*/../*
0a80: 20 45 69 74 68 65 72 2c 20 62 6f 74 68 20 6f 72   Either, both or
0a90: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   none of the fol
0aa0: 6c 6f 77 69 6e 67 20 6d 61 79 20 62 65 20 73 65  lowing may be se
0ab0: 74 20 74 6f 20 61 63 74 69 76 61 74 65 20 0a 2a  t to activate .*
0ac0: 2a 20 72 2a 74 72 65 65 20 76 61 72 69 61 6e 74  * r*tree variant
0ad0: 20 61 6c 67 6f 72 69 74 68 6d 73 2e 0a 2a 2f 0a   algorithms..*/.
0ae0: 23 64 65 66 69 6e 65 20 56 41 52 49 41 4e 54 5f  #define VARIANT_
0af0: 52 53 54 41 52 54 52 45 45 5f 43 48 4f 4f 53 45  RSTARTREE_CHOOSE
0b00: 53 55 42 54 52 45 45 20 30 0a 23 64 65 66 69 6e  SUBTREE 0.#defin
0b10: 65 20 56 41 52 49 41 4e 54 5f 52 53 54 41 52 54  e VARIANT_RSTART
0b20: 52 45 45 5f 52 45 49 4e 53 45 52 54 20 20 20 20  REE_REINSERT    
0b30: 20 20 31 0a 0a 2f 2a 20 0a 2a 2a 20 45 78 61 63    1../* .** Exac
0b40: 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  tly one of the f
0b50: 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20 62 65  ollowing must be
0b60: 20 73 65 74 20 74 6f 20 31 2e 0a 2a 2f 0a 23 64   set to 1..*/.#d
0b70: 65 66 69 6e 65 20 56 41 52 49 41 4e 54 5f 47 55  efine VARIANT_GU
0b80: 54 54 4d 41 4e 5f 51 55 41 44 52 41 54 49 43 5f  TTMAN_QUADRATIC_
0b90: 53 50 4c 49 54 20 30 0a 23 64 65 66 69 6e 65 20  SPLIT 0.#define 
0ba0: 56 41 52 49 41 4e 54 5f 47 55 54 54 4d 41 4e 5f  VARIANT_GUTTMAN_
0bb0: 4c 49 4e 45 41 52 5f 53 50 4c 49 54 20 20 20 20  LINEAR_SPLIT    
0bc0: 30 0a 23 64 65 66 69 6e 65 20 56 41 52 49 41 4e  0.#define VARIAN
0bd0: 54 5f 52 53 54 41 52 54 52 45 45 5f 53 50 4c 49  T_RSTARTREE_SPLI
0be0: 54 20 20 20 20 20 20 20 20 20 31 0a 0a 23 64 65  T         1..#de
0bf0: 66 69 6e 65 20 56 41 52 49 41 4e 54 5f 47 55 54  fine VARIANT_GUT
0c00: 54 4d 41 4e 5f 53 50 4c 49 54 20 5c 0a 20 20 20  TMAN_SPLIT \.   
0c10: 20 20 20 20 20 28 56 41 52 49 41 4e 54 5f 47 55       (VARIANT_GU
0c20: 54 54 4d 41 4e 5f 4c 49 4e 45 41 52 5f 53 50 4c  TTMAN_LINEAR_SPL
0c30: 49 54 7c 7c 56 41 52 49 41 4e 54 5f 47 55 54 54  IT||VARIANT_GUTT
0c40: 4d 41 4e 5f 51 55 41 44 52 41 54 49 43 5f 53 50  MAN_QUADRATIC_SP
0c50: 4c 49 54 29 0a 0a 23 69 66 20 56 41 52 49 41 4e  LIT)..#if VARIAN
0c60: 54 5f 47 55 54 54 4d 41 4e 5f 51 55 41 44 52 41  T_GUTTMAN_QUADRA
0c70: 54 49 43 5f 53 50 4c 49 54 0a 20 20 23 64 65 66  TIC_SPLIT.  #def
0c80: 69 6e 65 20 50 69 63 6b 4e 65 78 74 20 51 75 61  ine PickNext Qua
0c90: 64 72 61 74 69 63 50 69 63 6b 4e 65 78 74 0a 20  draticPickNext. 
0ca0: 20 23 64 65 66 69 6e 65 20 50 69 63 6b 53 65 65   #define PickSee
0cb0: 64 73 20 51 75 61 64 72 61 74 69 63 50 69 63 6b  ds QuadraticPick
0cc0: 53 65 65 64 73 0a 20 20 23 64 65 66 69 6e 65 20  Seeds.  #define 
0cd0: 41 73 73 69 67 6e 43 65 6c 6c 73 20 73 70 6c 69  AssignCells spli
0ce0: 74 4e 6f 64 65 47 75 74 74 6d 61 6e 0a 23 65 6e  tNodeGuttman.#en
0cf0: 64 69 66 0a 23 69 66 20 56 41 52 49 41 4e 54 5f  dif.#if VARIANT_
0d00: 47 55 54 54 4d 41 4e 5f 4c 49 4e 45 41 52 5f 53  GUTTMAN_LINEAR_S
0d10: 50 4c 49 54 0a 20 20 23 64 65 66 69 6e 65 20 50  PLIT.  #define P
0d20: 69 63 6b 4e 65 78 74 20 4c 69 6e 65 61 72 50 69  ickNext LinearPi
0d30: 63 6b 4e 65 78 74 0a 20 20 23 64 65 66 69 6e 65  ckNext.  #define
0d40: 20 50 69 63 6b 53 65 65 64 73 20 4c 69 6e 65 61   PickSeeds Linea
0d50: 72 50 69 63 6b 53 65 65 64 73 0a 20 20 23 64 65  rPickSeeds.  #de
0d60: 66 69 6e 65 20 41 73 73 69 67 6e 43 65 6c 6c 73  fine AssignCells
0d70: 20 73 70 6c 69 74 4e 6f 64 65 47 75 74 74 6d 61   splitNodeGuttma
0d80: 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 56 41 52  n.#endif.#if VAR
0d90: 49 41 4e 54 5f 52 53 54 41 52 54 52 45 45 5f 53  IANT_RSTARTREE_S
0da0: 50 4c 49 54 0a 20 20 23 64 65 66 69 6e 65 20 41  PLIT.  #define A
0db0: 73 73 69 67 6e 43 65 6c 6c 73 20 73 70 6c 69 74  ssignCells split
0dc0: 4e 6f 64 65 53 74 61 72 74 72 65 65 0a 23 65 6e  NodeStartree.#en
0dd0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0de0: 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
0df0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
0e00: 55 47 29 20 0a 23 20 64 65 66 69 6e 65 20 4e 44  UG) .# define ND
0e10: 45 42 55 47 20 31 0a 23 65 6e 64 69 66 0a 0a 23  EBUG 1.#endif..#
0e20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 43 4f  ifndef SQLITE_CO
0e30: 52 45 0a 20 20 23 69 6e 63 6c 75 64 65 20 22 73  RE.  #include "s
0e40: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 20 20 53  qlite3ext.h".  S
0e50: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
0e60: 49 4e 49 54 31 0a 23 65 6c 73 65 0a 20 20 23 69  INIT1.#else.  #i
0e70: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
0e80: 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c  h".#endif..#incl
0e90: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0ea0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
0eb0: 68 3e 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h>..#ifndef SQLI
0ec0: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a  TE_AMALGAMATION.
0ed0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0ee0: 33 72 74 72 65 65 2e 68 22 0a 74 79 70 65 64 65  3rtree.h".typede
0ef0: 66 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  f sqlite3_int64 
0f00: 69 36 34 3b 0a 74 79 70 65 64 65 66 20 75 6e 73  i64;.typedef uns
0f10: 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 74  igned char u8;.t
0f20: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0f30: 69 6e 74 20 75 33 32 3b 0a 23 65 6e 64 69 66 0a  int u32;.#endif.
0f40: 0a 2f 2a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ./*  The followi
0f50: 6e 67 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  ng macro is used
0f60: 20 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d   to suppress com
0f70: 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 2e 0a  piler warnings..
0f80: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45  */.#ifndef UNUSE
0f90: 44 5f 50 41 52 41 4d 45 54 45 52 0a 23 20 64 65  D_PARAMETER.# de
0fa0: 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41  fine UNUSED_PARA
0fb0: 4d 45 54 45 52 28 78 29 20 28 76 6f 69 64 29 28  METER(x) (void)(
0fc0: 78 29 0a 23 65 6e 64 69 66 0a 0a 74 79 70 65 64  x).#endif..typed
0fd0: 65 66 20 73 74 72 75 63 74 20 52 74 72 65 65 20  ef struct Rtree 
0fe0: 52 74 72 65 65 3b 0a 74 79 70 65 64 65 66 20 73  Rtree;.typedef s
0ff0: 74 72 75 63 74 20 52 74 72 65 65 43 75 72 73 6f  truct RtreeCurso
1000: 72 20 52 74 72 65 65 43 75 72 73 6f 72 3b 0a 74  r RtreeCursor;.t
1010: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 74  ypedef struct Rt
1020: 72 65 65 4e 6f 64 65 20 52 74 72 65 65 4e 6f 64  reeNode RtreeNod
1030: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
1040: 74 20 52 74 72 65 65 43 65 6c 6c 20 52 74 72 65  t RtreeCell Rtre
1050: 65 43 65 6c 6c 3b 0a 74 79 70 65 64 65 66 20 73  eCell;.typedef s
1060: 74 72 75 63 74 20 52 74 72 65 65 43 6f 6e 73 74  truct RtreeConst
1070: 72 61 69 6e 74 20 52 74 72 65 65 43 6f 6e 73 74  raint RtreeConst
1080: 72 61 69 6e 74 3b 0a 74 79 70 65 64 65 66 20 73  raint;.typedef s
1090: 74 72 75 63 74 20 52 74 72 65 65 4d 61 74 63 68  truct RtreeMatch
10a0: 41 72 67 20 52 74 72 65 65 4d 61 74 63 68 41 72  Arg RtreeMatchAr
10b0: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
10c0: 74 20 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62  t RtreeGeomCallb
10d0: 61 63 6b 20 52 74 72 65 65 47 65 6f 6d 43 61 6c  ack RtreeGeomCal
10e0: 6c 62 61 63 6b 3b 0a 74 79 70 65 64 65 66 20 75  lback;.typedef u
10f0: 6e 69 6f 6e 20 52 74 72 65 65 43 6f 6f 72 64 20  nion RtreeCoord 
1100: 52 74 72 65 65 43 6f 6f 72 64 3b 0a 0a 2f 2a 20  RtreeCoord;../* 
1110: 54 68 65 20 72 74 72 65 65 20 6d 61 79 20 68 61  The rtree may ha
1120: 76 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  ve between 1 and
1130: 20 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e   RTREE_MAX_DIMEN
1140: 53 49 4f 4e 53 20 64 69 6d 65 6e 73 69 6f 6e 73  SIONS dimensions
1150: 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52  . */.#define RTR
1160: 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e  EE_MAX_DIMENSION
1170: 53 20 35 0a 0a 2f 2a 20 53 69 7a 65 20 6f 66 20  S 5../* Size of 
1180: 68 61 73 68 20 74 61 62 6c 65 20 52 74 72 65 65  hash table Rtree
1190: 2e 61 48 61 73 68 2e 20 54 68 69 73 20 68 61 73  .aHash. This has
11a0: 68 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 65  h table is not e
11b0: 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 65 76  xpected to.** ev
11c0: 65 72 20 63 6f 6e 74 61 69 6e 20 76 65 72 79 20  er contain very 
11d0: 6d 61 6e 79 20 65 6e 74 72 69 65 73 2c 20 73 6f  many entries, so
11e0: 20 61 20 66 69 78 65 64 20 6e 75 6d 62 65 72 20   a fixed number 
11f0: 6f 66 20 62 75 63 6b 65 74 73 20 69 73 20 0a 2a  of buckets is .*
1200: 2a 20 75 73 65 64 2e 0a 2a 2f 0a 23 64 65 66 69  * used..*/.#defi
1210: 6e 65 20 48 41 53 48 53 49 5a 45 20 31 32 38 0a  ne HASHSIZE 128.
1220: 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 72 74 72 65 65  ./* .** An rtree
1230: 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 6f   virtual-table o
1240: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  bject..*/.struct
1250: 20 52 74 72 65 65 20 7b 0a 20 20 73 71 6c 69 74   Rtree {.  sqlit
1260: 65 33 5f 76 74 61 62 20 62 61 73 65 3b 0a 20 20  e3_vtab base;.  
1270: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
1280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
1290: 6f 73 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ost database con
12a0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
12b0: 20 69 4e 6f 64 65 53 69 7a 65 3b 20 20 20 20 20   iNodeSize;     
12c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
12d0: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
12e0: 68 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 6e 6f  h node in the no
12f0: 64 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  de table */.  in
1300: 74 20 6e 44 69 6d 3b 20 20 20 20 20 20 20 20 20  t nDim;         
1310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1320: 62 65 72 20 6f 66 20 64 69 6d 65 6e 73 69 6f 6e  ber of dimension
1330: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  s */.  int nByte
1340: 73 50 65 72 43 65 6c 6c 3b 20 20 20 20 20 20 20  sPerCell;       
1350: 20 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 73     /* Bytes cons
1360: 75 6d 65 64 20 70 65 72 20 63 65 6c 6c 20 2a 2f  umed per cell */
1370: 0a 20 20 69 6e 74 20 69 44 65 70 74 68 3b 20 20  .  int iDepth;  
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1390: 2a 20 43 75 72 72 65 6e 74 20 64 65 70 74 68 20  * Current depth 
13a0: 6f 66 20 74 68 65 20 72 2d 74 72 65 65 20 73 74  of the r-tree st
13b0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 63 68 61  ructure */.  cha
13c0: 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
13d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
13e0: 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
13f0: 74 61 69 6e 69 6e 67 20 72 2d 74 72 65 65 20 74  taining r-tree t
1400: 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  able */.  char *
1410: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
1420: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1430: 20 72 2d 74 72 65 65 20 74 61 62 6c 65 20 2a 2f   r-tree table */
1440: 20 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 61   .  RtreeNode *a
1450: 48 61 73 68 5b 48 41 53 48 53 49 5a 45 5d 3b 20  Hash[HASHSIZE]; 
1460: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66  /* Hash table of
1470: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6e 6f 64 65 73   in-memory nodes
1480: 2e 20 2a 2f 20 0a 20 20 69 6e 74 20 6e 42 75 73  . */ .  int nBus
1490: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
14a0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e      /* Current n
14b0: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
14c0: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
14d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 69 73 74 20 6f   */..  /* List o
14e0: 66 20 6e 6f 64 65 73 20 72 65 6d 6f 76 65 64 20  f nodes removed 
14f0: 64 75 72 69 6e 67 20 61 20 43 6f 6e 64 65 6e 73  during a Condens
1500: 65 54 72 65 65 20 6f 70 65 72 61 74 69 6f 6e 2e  eTree operation.
1510: 20 4c 69 73 74 20 69 73 0a 20 20 2a 2a 20 6c 69   List is.  ** li
1520: 6e 6b 65 64 20 74 6f 67 65 74 68 65 72 20 76 69  nked together vi
1530: 61 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6e 6f  a the pointer no
1540: 72 6d 61 6c 6c 79 20 75 73 65 64 20 66 6f 72 20  rmally used for 
1550: 68 61 73 68 20 63 68 61 69 6e 73 20 2d 0a 20 20  hash chains -.  
1560: 2a 2a 20 52 74 72 65 65 4e 6f 64 65 2e 70 4e 65  ** RtreeNode.pNe
1570: 78 74 2e 20 52 74 72 65 65 4e 6f 64 65 2e 69 4e  xt. RtreeNode.iN
1580: 6f 64 65 20 73 74 6f 72 65 73 20 74 68 65 20 64  ode stores the d
1590: 65 70 74 68 20 6f 66 20 74 68 65 20 73 75 62 2d  epth of the sub-
15a0: 74 72 65 65 20 0a 20 20 2a 2a 20 68 65 61 64 65  tree .  ** heade
15b0: 64 20 62 79 20 74 68 65 20 6e 6f 64 65 20 28 6c  d by the node (l
15c0: 65 61 66 20 6e 6f 64 65 73 20 68 61 76 65 20 52  eaf nodes have R
15d0: 74 72 65 65 4e 6f 64 65 2e 69 4e 6f 64 65 3d 3d  treeNode.iNode==
15e0: 30 29 2e 0a 20 20 2a 2f 0a 20 20 52 74 72 65 65  0)..  */.  Rtree
15f0: 4e 6f 64 65 20 2a 70 44 65 6c 65 74 65 64 3b 0a  Node *pDeleted;.
1600: 20 20 69 6e 74 20 69 52 65 69 6e 73 65 72 74 48    int iReinsertH
1610: 65 69 67 68 74 3b 20 20 20 20 20 20 20 20 2f 2a  eight;        /*
1620: 20 48 65 69 67 68 74 20 6f 66 20 73 75 62 2d 74   Height of sub-t
1630: 72 65 65 73 20 52 65 69 6e 73 65 72 74 28 29 20  rees Reinsert() 
1640: 68 61 73 20 72 75 6e 20 6f 6e 20 2a 2f 0a 0a 20  has run on */.. 
1650: 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73 20 74   /* Statements t
1660: 6f 20 72 65 61 64 2f 77 72 69 74 65 2f 64 65 6c  o read/write/del
1670: 65 74 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f  ete a record fro
1680: 6d 20 78 78 78 5f 6e 6f 64 65 20 2a 2f 0a 20 20  m xxx_node */.  
1690: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52  sqlite3_stmt *pR
16a0: 65 61 64 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74  eadNode;.  sqlit
16b0: 65 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 4e  e3_stmt *pWriteN
16c0: 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ode;.  sqlite3_s
16d0: 74 6d 74 20 2a 70 44 65 6c 65 74 65 4e 6f 64 65  tmt *pDeleteNode
16e0: 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e  ;..  /* Statemen
16f0: 74 73 20 74 6f 20 72 65 61 64 2f 77 72 69 74 65  ts to read/write
1700: 2f 64 65 6c 65 74 65 20 61 20 72 65 63 6f 72 64  /delete a record
1710: 20 66 72 6f 6d 20 78 78 78 5f 72 6f 77 69 64 20   from xxx_rowid 
1720: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
1730: 74 20 2a 70 52 65 61 64 52 6f 77 69 64 3b 0a 20  t *pReadRowid;. 
1740: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1750: 57 72 69 74 65 52 6f 77 69 64 3b 0a 20 20 73 71  WriteRowid;.  sq
1760: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
1770: 65 74 65 52 6f 77 69 64 3b 0a 0a 20 20 2f 2a 20  eteRowid;..  /* 
1780: 53 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 72 65  Statements to re
1790: 61 64 2f 77 72 69 74 65 2f 64 65 6c 65 74 65 20  ad/write/delete 
17a0: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 78 78  a record from xx
17b0: 78 5f 70 61 72 65 6e 74 20 2a 2f 0a 20 20 73 71  x_parent */.  sq
17c0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 65 61  lite3_stmt *pRea
17d0: 64 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74  dParent;.  sqlit
17e0: 65 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 50  e3_stmt *pWriteP
17f0: 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  arent;.  sqlite3
1800: 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 50 61  _stmt *pDeletePa
1810: 72 65 6e 74 3b 0a 0a 20 20 69 6e 74 20 65 43 6f  rent;..  int eCo
1820: 6f 72 64 54 79 70 65 3b 0a 7d 3b 0a 0a 2f 2a 20  ordType;.};../* 
1830: 50 6f 73 73 69 62 6c 65 20 76 61 6c 75 65 73 20  Possible values 
1840: 66 6f 72 20 65 43 6f 6f 72 64 54 79 70 65 3a 20  for eCoordType: 
1850: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45  */.#define RTREE
1860: 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32 20 30 0a  _COORD_REAL32 0.
1870: 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 43 4f  #define RTREE_CO
1880: 4f 52 44 5f 49 4e 54 33 32 20 20 31 0a 0a 2f 2a  ORD_INT32  1../*
1890: 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
18a0: 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
18b0: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 20 6e 6f  allowed for a no
18c0: 64 65 20 69 73 20 61 20 74 68 69 72 64 20 6f 66  de is a third of
18d0: 20 74 68 65 20 0a 2a 2a 20 6d 61 78 69 6d 75 6d   the .** maximum
18e0: 2e 20 49 6e 20 47 75 74 6d 61 6e 27 73 20 6e 6f  . In Gutman's no
18f0: 74 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  tation:.**.**   
1900: 20 20 6d 20 3d 20 4d 2f 33 0a 2a 2a 0a 2a 2a 20    m = M/3.**.** 
1910: 49 66 20 61 6e 20 52 2a 2d 74 72 65 65 20 22 52  If an R*-tree "R
1920: 65 69 6e 73 65 72 74 22 20 6f 70 65 72 61 74 69  einsert" operati
1930: 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2c 20  on is required, 
1940: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
1950: 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20  of.** cells are 
1960: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1970: 20 6f 76 65 72 66 75 6c 6c 20 6e 6f 64 65 20 61   overfull node a
1980: 6e 64 20 72 65 69 6e 73 65 72 74 65 64 20 69 6e  nd reinserted in
1990: 74 6f 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a  to the tree..*/.
19a0: 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4d 49  #define RTREE_MI
19b0: 4e 43 45 4c 4c 53 28 70 29 20 28 28 28 28 70 29  NCELLS(p) ((((p)
19c0: 2d 3e 69 4e 6f 64 65 53 69 7a 65 2d 34 29 2f 28  ->iNodeSize-4)/(
19d0: 70 29 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c  p)->nBytesPerCel
19e0: 6c 29 2f 33 29 0a 23 64 65 66 69 6e 65 20 52 54  l)/3).#define RT
19f0: 52 45 45 5f 52 45 49 4e 53 45 52 54 28 70 29 20  REE_REINSERT(p) 
1a00: 52 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70  RTREE_MINCELLS(p
1a10: 29 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f  ).#define RTREE_
1a20: 4d 41 58 43 45 4c 4c 53 20 35 31 0a 0a 2f 2a 0a  MAXCELLS 51../*.
1a30: 2a 2a 20 54 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** The smallest 
1a40: 70 6f 73 73 69 62 6c 65 20 6e 6f 64 65 2d 73 69  possible node-si
1a50: 7a 65 20 69 73 20 28 35 31 32 2d 36 34 29 3d 3d  ze is (512-64)==
1a60: 34 34 38 20 62 79 74 65 73 2e 20 41 6e 64 20 74  448 bytes. And t
1a70: 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 73 75  he largest.** su
1a80: 70 70 6f 72 74 65 64 20 63 65 6c 6c 20 73 69 7a  pported cell siz
1a90: 65 20 69 73 20 34 38 20 62 79 74 65 73 20 28 38  e is 48 bytes (8
1aa0: 20 62 79 74 65 20 72 6f 77 69 64 20 2b 20 74 65   byte rowid + te
1ab0: 6e 20 34 20 62 79 74 65 20 63 6f 6f 72 64 69 6e  n 4 byte coordin
1ac0: 61 74 65 73 29 2e 0a 2a 2a 20 54 68 65 72 65 66  ates)..** Theref
1ad0: 6f 72 65 20 61 6c 6c 20 6e 6f 6e 2d 72 6f 6f 74  ore all non-root
1ae0: 20 6e 6f 64 65 73 20 6d 75 73 74 20 63 6f 6e 74   nodes must cont
1af0: 61 69 6e 20 61 74 20 6c 65 61 73 74 20 33 20 65  ain at least 3 e
1b00: 6e 74 72 69 65 73 2e 20 53 69 6e 63 65 20 0a 2a  ntries. Since .*
1b10: 2a 20 32 5e 34 30 20 69 73 20 67 72 65 61 74 65  * 2^40 is greate
1b20: 72 20 74 68 61 6e 20 32 5e 36 34 2c 20 61 6e 20  r than 2^64, an 
1b30: 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  r-tree structure
1b40: 20 61 6c 77 61 79 73 20 68 61 73 20 61 20 64 65   always has a de
1b50: 70 74 68 20 6f 66 0a 2a 2a 20 34 30 20 6f 72 20  pth of.** 40 or 
1b60: 6c 65 73 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  less..*/.#define
1b70: 20 52 54 52 45 45 5f 4d 41 58 5f 44 45 50 54 48   RTREE_MAX_DEPTH
1b80: 20 34 30 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 72   40../* .** An r
1b90: 74 72 65 65 20 63 75 72 73 6f 72 20 6f 62 6a 65  tree cursor obje
1ba0: 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74  ct..*/.struct Rt
1bb0: 72 65 65 43 75 72 73 6f 72 20 7b 0a 20 20 73 71  reeCursor {.  sq
1bc0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
1bd0: 72 20 62 61 73 65 3b 0a 20 20 52 74 72 65 65 4e  r base;.  RtreeN
1be0: 6f 64 65 20 2a 70 4e 6f 64 65 3b 20 20 20 20 20  ode *pNode;     
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c00: 6f 64 65 20 63 75 72 73 6f 72 20 69 73 20 63 75  ode cursor is cu
1c10: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
1c20: 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65   at */.  int iCe
1c30: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1c50: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63  dex of current c
1c60: 65 6c 6c 20 69 6e 20 70 4e 6f 64 65 20 2a 2f 0a  ell in pNode */.
1c70: 20 20 69 6e 74 20 69 53 74 72 61 74 65 67 79 3b    int iStrategy;
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69      /* Copy of i
1ca0: 64 78 4e 75 6d 20 73 65 61 72 63 68 20 70 61 72  dxNum search par
1cb0: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
1cc0: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ce0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1cf0: 65 73 20 69 6e 20 61 43 6f 6e 73 74 72 61 69 6e  es in aConstrain
1d00: 74 20 2a 2f 0a 20 20 52 74 72 65 65 43 6f 6e 73  t */.  RtreeCons
1d10: 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61  traint *aConstra
1d20: 69 6e 74 3b 20 20 20 20 20 2f 2a 20 53 65 61 72  int;     /* Sear
1d30: 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ch constraints. 
1d40: 2a 2f 0a 7d 3b 0a 0a 75 6e 69 6f 6e 20 52 74 72  */.};..union Rtr
1d50: 65 65 43 6f 6f 72 64 20 7b 0a 20 20 66 6c 6f 61  eeCoord {.  floa
1d60: 74 20 66 3b 0a 20 20 69 6e 74 20 69 3b 0a 7d 3b  t f;.  int i;.};
1d70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
1d80: 6d 65 6e 74 20 69 73 20 61 6e 20 52 74 72 65 65  ment is an Rtree
1d90: 43 6f 6f 72 64 2e 20 52 65 74 75 72 6e 20 74 68  Coord. Return th
1da0: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 77  e value stored w
1db0: 69 74 68 69 6e 20 74 68 65 20 52 74 72 65 65 43  ithin the RtreeC
1dc0: 6f 6f 72 64 0a 2a 2a 20 66 6f 72 6d 61 74 74 65  oord.** formatte
1dd0: 64 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 20 54  d as a double. T
1de0: 68 69 73 20 6d 61 63 72 6f 20 61 73 73 75 6d 65  his macro assume
1df0: 73 20 74 68 61 74 20 6c 6f 63 61 6c 20 76 61 72  s that local var
1e00: 69 61 62 6c 65 20 70 52 74 72 65 65 20 70 6f 69  iable pRtree poi
1e10: 6e 74 73 0a 2a 2a 20 74 6f 20 74 68 65 20 52 74  nts.** to the Rt
1e20: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ree structure as
1e30: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1e40: 65 20 52 74 72 65 65 43 6f 6f 72 64 2e 0a 2a 2f  e RtreeCoord..*/
1e50: 0a 23 64 65 66 69 6e 65 20 44 43 4f 4f 52 44 28  .#define DCOORD(
1e60: 63 6f 6f 72 64 29 20 28 20 20 20 20 20 20 20 20  coord) (        
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 20 5c 0a 20 20 28 70 52 74 72 65 65 2d 3e     \.  (pRtree->
1e90: 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52 45  eCoordType==RTRE
1ea0: 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32 29 20  E_COORD_REAL32) 
1eb0: 3f 20 20 20 20 20 20 5c 0a 20 20 20 20 28 28 64  ?      \.    ((d
1ec0: 6f 75 62 6c 65 29 63 6f 6f 72 64 2e 66 29 20 3a  ouble)coord.f) :
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1ef0: 20 28 28 64 6f 75 62 6c 65 29 63 6f 6f 72 64 2e   ((double)coord.
1f00: 69 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i)              
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1f20: 0a 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 65 61 72  .)../*.** A sear
1f30: 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a  ch constraint..*
1f40: 2f 0a 73 74 72 75 63 74 20 52 74 72 65 65 43 6f  /.struct RtreeCo
1f50: 6e 73 74 72 61 69 6e 74 20 7b 0a 20 20 69 6e 74  nstraint {.  int
1f60: 20 69 43 6f 6f 72 64 3b 20 20 20 20 20 20 20 20   iCoord;        
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f80: 49 6e 64 65 78 20 6f 66 20 63 6f 6e 73 74 72 61  Index of constra
1f90: 69 6e 65 64 20 63 6f 6f 72 64 69 6e 61 74 65 20  ined coordinate 
1fa0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc0: 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69       /* Constrai
1fd0: 6e 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a  ning operation *
1fe0: 2f 0a 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 75  /.  double rValu
1ff0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2000: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
2010: 74 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 69 6e  t value. */.  in
2020: 74 20 28 2a 78 47 65 6f 6d 29 28 73 71 6c 69 74  t (*xGeom)(sqlit
2030: 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72  e3_rtree_geometr
2040: 79 20 2a 2c 20 69 6e 74 2c 20 64 6f 75 62 6c 65  y *, int, double
2050: 20 2a 2c 20 69 6e 74 20 2a 29 3b 0a 20 20 73 71   *, int *);.  sq
2060: 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d  lite3_rtree_geom
2070: 65 74 72 79 20 2a 70 47 65 6f 6d 3b 20 20 2f 2a  etry *pGeom;  /*
2080: 20 43 6f 6e 73 74 72 61 69 6e 74 20 63 61 6c 6c   Constraint call
2090: 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 66 6f  back argument fo
20a0: 72 20 61 20 4d 41 54 43 48 20 2a 2f 0a 7d 3b 0a  r a MATCH */.};.
20b0: 0a 2f 2a 20 50 6f 73 73 69 62 6c 65 20 76 61 6c  ./* Possible val
20c0: 75 65 73 20 66 6f 72 20 52 74 72 65 65 43 6f 6e  ues for RtreeCon
20d0: 73 74 72 61 69 6e 74 2e 6f 70 20 2a 2f 0a 23 64  straint.op */.#d
20e0: 65 66 69 6e 65 20 52 54 52 45 45 5f 45 51 20 20  efine RTREE_EQ  
20f0: 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65 20 52    0x41.#define R
2100: 54 52 45 45 5f 4c 45 20 20 20 20 30 78 34 32 0a  TREE_LE    0x42.
2110: 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4c 54  #define RTREE_LT
2120: 20 20 20 20 30 78 34 33 0a 23 64 65 66 69 6e 65      0x43.#define
2130: 20 52 54 52 45 45 5f 47 45 20 20 20 20 30 78 34   RTREE_GE    0x4
2140: 34 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f  4.#define RTREE_
2150: 47 54 20 20 20 20 30 78 34 35 0a 23 64 65 66 69  GT    0x45.#defi
2160: 6e 65 20 52 54 52 45 45 5f 4d 41 54 43 48 20 30  ne RTREE_MATCH 0
2170: 78 34 36 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 72  x46../* .** An r
2180: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 6e  tree structure n
2190: 6f 64 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52  ode..*/.struct R
21a0: 74 72 65 65 4e 6f 64 65 20 7b 0a 20 20 52 74 72  treeNode {.  Rtr
21b0: 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 3b  eeNode *pParent;
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21d0: 2a 20 50 61 72 65 6e 74 20 6e 6f 64 65 20 2a 2f  * Parent node */
21e0: 0a 20 20 69 36 34 20 69 4e 6f 64 65 3b 0a 20 20  .  i64 iNode;.  
21f0: 69 6e 74 20 6e 52 65 66 3b 0a 20 20 69 6e 74 20  int nRef;.  int 
2200: 69 73 44 69 72 74 79 3b 0a 20 20 75 38 20 2a 7a  isDirty;.  u8 *z
2210: 44 61 74 61 3b 0a 20 20 52 74 72 65 65 4e 6f 64  Data;.  RtreeNod
2220: 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  e *pNext;       
2230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2240: 74 20 6e 6f 64 65 20 69 6e 20 74 68 69 73 20 68  t node in this h
2250: 61 73 68 20 63 68 61 69 6e 20 2a 2f 0a 7d 3b 0a  ash chain */.};.
2260: 23 64 65 66 69 6e 65 20 4e 43 45 4c 4c 28 70 4e  #define NCELL(pN
2270: 6f 64 65 29 20 72 65 61 64 49 6e 74 31 36 28 26  ode) readInt16(&
2280: 28 70 4e 6f 64 65 29 2d 3e 7a 44 61 74 61 5b 32  (pNode)->zData[2
2290: 5d 29 0a 0a 2f 2a 20 0a 2a 2a 20 53 74 72 75 63  ])../* .** Struc
22a0: 74 75 72 65 20 74 6f 20 73 74 6f 72 65 20 61 20  ture to store a 
22b0: 64 65 73 65 72 69 61 6c 69 7a 65 64 20 72 74 72  deserialized rtr
22c0: 65 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 73 74  ee record..*/.st
22d0: 72 75 63 74 20 52 74 72 65 65 43 65 6c 6c 20 7b  ruct RtreeCell {
22e0: 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20  .  i64 iRowid;. 
22f0: 20 52 74 72 65 65 43 6f 6f 72 64 20 61 43 6f 6f   RtreeCoord aCoo
2300: 72 64 5b 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d  rd[RTREE_MAX_DIM
2310: 45 4e 53 49 4f 4e 53 2a 32 5d 3b 0a 7d 3b 0a 0a  ENSIONS*2];.};..
2320: 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72  ./*.** Value for
2330: 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
2340: 20 6f 66 20 65 76 65 72 79 20 52 74 72 65 65 4d   of every RtreeM
2350: 61 74 63 68 41 72 67 20 6f 62 6a 65 63 74 2e 20  atchArg object. 
2360: 54 68 65 20 4d 41 54 43 48 0a 2a 2a 20 6f 70 65  The MATCH.** ope
2370: 72 61 74 6f 72 20 74 65 73 74 73 20 74 68 61 74  rator tests that
2380: 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
2390: 20 6f 66 20 61 20 62 6c 6f 62 20 6f 70 65 72 61   of a blob opera
23a0: 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69 73 0a  nd matches this.
23b0: 2a 2a 20 76 61 6c 75 65 20 74 6f 20 61 76 6f 69  ** value to avoi
23c0: 64 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 69  d operating on i
23d0: 6e 76 61 6c 69 64 20 62 6c 6f 62 73 20 28 77 68  nvalid blobs (wh
23e0: 69 63 68 20 63 6f 75 6c 64 20 63 61 75 73 65 20  ich could cause 
23f0: 61 20 73 65 67 66 61 75 6c 74 29 2e 0a 2a 2f 0a  a segfault)..*/.
2400: 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 47 45  #define RTREE_GE
2410: 4f 4d 45 54 52 59 5f 4d 41 47 49 43 20 30 78 38  OMETRY_MAGIC 0x8
2420: 39 31 32 34 35 41 42 0a 0a 2f 2a 0a 2a 2a 20 41  91245AB../*.** A
2430: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2440: 69 73 20 73 74 72 75 63 74 75 72 65 20 6d 75 73  is structure mus
2450: 74 20 62 65 20 73 75 70 70 6c 69 65 64 20 61 73  t be supplied as
2460: 20 61 20 62 6c 6f 62 20 61 72 67 75 6d 65 6e 74   a blob argument
2470: 20 74 6f 0a 2a 2a 20 74 68 65 20 72 69 67 68 74   to.** the right
2480: 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61 6e  -hand-side of an
2490: 20 53 51 4c 20 4d 41 54 43 48 20 6f 70 65 72 61   SQL MATCH opera
24a0: 74 6f 72 20 75 73 65 64 20 74 6f 20 63 6f 6e 73  tor used to cons
24b0: 74 72 61 69 6e 20 61 6e 0a 2a 2a 20 72 2d 74 72  train an.** r-tr
24c0: 65 65 20 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 72  ee query..*/.str
24d0: 75 63 74 20 52 74 72 65 65 4d 61 74 63 68 41 72  uct RtreeMatchAr
24e0: 67 20 7b 0a 20 20 75 33 32 20 6d 61 67 69 63 3b  g {.  u32 magic;
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20        /* Always 
2510: 52 54 52 45 45 5f 47 45 4f 4d 45 54 52 59 5f 4d  RTREE_GEOMETRY_M
2520: 41 47 49 43 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  AGIC */.  int (*
2530: 78 47 65 6f 6d 29 28 73 71 6c 69 74 65 33 5f 72  xGeom)(sqlite3_r
2540: 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 20 2a 2c  tree_geometry *,
2550: 20 69 6e 74 2c 20 64 6f 75 62 6c 65 20 2a 2c 20   int, double *, 
2560: 69 6e 74 20 2a 29 3b 0a 20 20 76 6f 69 64 20 2a  int *);.  void *
2570: 70 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  pContext;.  int 
2580: 6e 50 61 72 61 6d 3b 0a 20 20 64 6f 75 62 6c 65  nParam;.  double
2590: 20 61 50 61 72 61 6d 5b 31 5d 3b 0a 7d 3b 0a 0a   aParam[1];.};..
25a0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 67 65 6f  /*.** When a geo
25b0: 6d 65 74 72 79 20 63 61 6c 6c 62 61 63 6b 20 69  metry callback i
25c0: 73 20 63 72 65 61 74 65 64 20 28 73 65 65 20 73  s created (see s
25d0: 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f  qlite3_rtree_geo
25e0: 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 29 2c  metry_callback),
25f0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 6e 73  .** a single ins
2600: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2610: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2620: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 49   is allocated. I
2630: 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 61 73 20  t is used.** as 
2640: 74 68 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  the context for 
2650: 74 68 65 20 75 73 65 72 2d 66 75 6e 63 74 69 6f  the user-functio
2660: 6e 20 63 72 65 61 74 65 64 20 62 79 20 62 79 20  n created by by 
2670: 73 5f 72 5f 67 5f 63 28 29 2e 20 54 68 65 20 6f  s_r_g_c(). The o
2680: 62 6a 65 63 74 0a 2a 2a 20 69 73 20 65 76 65 6e  bject.** is even
2690: 74 75 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62  tually deleted b
26a0: 79 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  y the destructor
26b0: 20 6d 65 63 68 61 6e 69 73 6d 20 70 72 6f 76 69   mechanism provi
26c0: 64 65 64 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65  ded by.** sqlite
26d0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
26e0: 6e 5f 76 32 28 29 20 28 77 68 69 63 68 20 69 73  n_v2() (which is
26f0: 20 63 61 6c 6c 65 64 20 62 79 20 73 5f 72 5f 67   called by s_r_g
2700: 5f 63 28 29 20 74 6f 20 63 72 65 61 74 65 0a 2a  _c() to create.*
2710: 2a 20 74 68 65 20 67 65 6f 6d 65 74 72 79 20 63  * the geometry c
2720: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
2730: 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74 72  )..*/.struct Rtr
2740: 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 7b  eeGeomCallback {
2750: 0a 20 20 69 6e 74 20 28 2a 78 47 65 6f 6d 29 28  .  int (*xGeom)(
2760: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
2770: 6f 6d 65 74 72 79 20 2a 2c 20 69 6e 74 2c 20 64  ometry *, int, d
2780: 6f 75 62 6c 65 20 2a 2c 20 69 6e 74 20 2a 29 3b  ouble *, int *);
2790: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
27a0: 74 3b 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4d  t;.};..#ifndef M
27b0: 41 58 0a 23 20 64 65 66 69 6e 65 20 4d 41 58 28  AX.# define MAX(
27c0: 78 2c 79 29 20 28 28 78 29 20 3c 20 28 79 29 20  x,y) ((x) < (y) 
27d0: 3f 20 28 79 29 20 3a 20 28 78 29 29 0a 23 65 6e  ? (y) : (x)).#en
27e0: 64 69 66 0a 23 69 66 6e 64 65 66 20 4d 49 4e 0a  dif.#ifndef MIN.
27f0: 23 20 64 65 66 69 6e 65 20 4d 49 4e 28 78 2c 79  # define MIN(x,y
2800: 29 20 28 28 78 29 20 3e 20 28 79 29 20 3f 20 28  ) ((x) > (y) ? (
2810: 79 29 20 3a 20 28 78 29 29 0a 23 65 6e 64 69 66  y) : (x)).#endif
2820: 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
2830: 73 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  s to deserialize
2840: 20 61 20 31 36 20 62 69 74 20 69 6e 74 65 67 65   a 16 bit intege
2850: 72 2c 20 33 32 20 62 69 74 20 72 65 61 6c 20 6e  r, 32 bit real n
2860: 75 6d 62 65 72 20 61 6e 64 0a 2a 2a 20 36 34 20  umber and.** 64 
2870: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 54 68 65  bit integer. The
2880: 20 64 65 73 65 72 69 61 6c 69 7a 65 64 20 76 61   deserialized va
2890: 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
28a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
28b0: 65 61 64 49 6e 74 31 36 28 75 38 20 2a 70 29 7b  eadInt16(u8 *p){
28c0: 0a 20 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c  .  return (p[0]<
28d0: 3c 38 29 20 2b 20 70 5b 31 5d 3b 0a 7d 0a 73 74  <8) + p[1];.}.st
28e0: 61 74 69 63 20 76 6f 69 64 20 72 65 61 64 43 6f  atic void readCo
28f0: 6f 72 64 28 75 38 20 2a 70 2c 20 52 74 72 65 65  ord(u8 *p, Rtree
2900: 43 6f 6f 72 64 20 2a 70 43 6f 6f 72 64 29 7b 0a  Coord *pCoord){.
2910: 20 20 75 33 32 20 69 20 3d 20 28 0a 20 20 20 20    u32 i = (.    
2920: 28 28 28 75 33 32 29 70 5b 30 5d 29 20 3c 3c 20  (((u32)p[0]) << 
2930: 32 34 29 20 2b 20 0a 20 20 20 20 28 28 28 75 33  24) + .    (((u3
2940: 32 29 70 5b 31 5d 29 20 3c 3c 20 31 36 29 20 2b  2)p[1]) << 16) +
2950: 20 0a 20 20 20 20 28 28 28 75 33 32 29 70 5b 32   .    (((u32)p[2
2960: 5d 29 20 3c 3c 20 20 38 29 20 2b 20 0a 20 20 20  ]) <<  8) + .   
2970: 20 28 28 28 75 33 32 29 70 5b 33 5d 29 20 3c 3c   (((u32)p[3]) <<
2980: 20 20 30 29 0a 20 20 29 3b 0a 20 20 2a 28 75 33    0).  );.  *(u3
2990: 32 20 2a 29 70 43 6f 6f 72 64 20 3d 20 69 3b 0a  2 *)pCoord = i;.
29a0: 7d 0a 73 74 61 74 69 63 20 69 36 34 20 72 65 61  }.static i64 rea
29b0: 64 49 6e 74 36 34 28 75 38 20 2a 70 29 7b 0a 20  dInt64(u8 *p){. 
29c0: 20 72 65 74 75 72 6e 20 28 0a 20 20 20 20 28 28   return (.    ((
29d0: 28 69 36 34 29 70 5b 30 5d 29 20 3c 3c 20 35 36  (i64)p[0]) << 56
29e0: 29 20 2b 20 0a 20 20 20 20 28 28 28 69 36 34 29  ) + .    (((i64)
29f0: 70 5b 31 5d 29 20 3c 3c 20 34 38 29 20 2b 20 0a  p[1]) << 48) + .
2a00: 20 20 20 20 28 28 28 69 36 34 29 70 5b 32 5d 29      (((i64)p[2])
2a10: 20 3c 3c 20 34 30 29 20 2b 20 0a 20 20 20 20 28   << 40) + .    (
2a20: 28 28 69 36 34 29 70 5b 33 5d 29 20 3c 3c 20 33  ((i64)p[3]) << 3
2a30: 32 29 20 2b 20 0a 20 20 20 20 28 28 28 69 36 34  2) + .    (((i64
2a40: 29 70 5b 34 5d 29 20 3c 3c 20 32 34 29 20 2b 20  )p[4]) << 24) + 
2a50: 0a 20 20 20 20 28 28 28 69 36 34 29 70 5b 35 5d  .    (((i64)p[5]
2a60: 29 20 3c 3c 20 31 36 29 20 2b 20 0a 20 20 20 20  ) << 16) + .    
2a70: 28 28 28 69 36 34 29 70 5b 36 5d 29 20 3c 3c 20  (((i64)p[6]) << 
2a80: 20 38 29 20 2b 20 0a 20 20 20 20 28 28 28 69 36   8) + .    (((i6
2a90: 34 29 70 5b 37 5d 29 20 3c 3c 20 20 30 29 0a 20  4)p[7]) <<  0). 
2aa0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e   );.}../*.** Fun
2ab0: 63 74 69 6f 6e 73 20 74 6f 20 73 65 72 69 61 6c  ctions to serial
2ac0: 69 7a 65 20 61 20 31 36 20 62 69 74 20 69 6e 74  ize a 16 bit int
2ad0: 65 67 65 72 2c 20 33 32 20 62 69 74 20 72 65 61  eger, 32 bit rea
2ae0: 6c 20 6e 75 6d 62 65 72 20 61 6e 64 0a 2a 2a 20  l number and.** 
2af0: 36 34 20 62 69 74 20 69 6e 74 65 67 65 72 2e 20  64 bit integer. 
2b00: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
2b10: 65 64 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ed is the number
2b20: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
2b30: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 61 72 67 75  n.** to the argu
2b40: 6d 65 6e 74 20 62 75 66 66 65 72 20 28 61 6c 77  ment buffer (alw
2b50: 61 79 73 20 32 2c 20 34 20 61 6e 64 20 38 20 72  ays 2, 4 and 8 r
2b60: 65 73 70 65 63 74 69 76 65 6c 79 29 2e 0a 2a 2f  espectively)..*/
2b70: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
2b80: 65 49 6e 74 31 36 28 75 38 20 2a 70 2c 20 69 6e  eInt16(u8 *p, in
2b90: 74 20 69 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 28  t i){.  p[0] = (
2ba0: 69 3e 3e 20 38 29 26 30 78 46 46 3b 0a 20 20 70  i>> 8)&0xFF;.  p
2bb0: 5b 31 5d 20 3d 20 28 69 3e 3e 20 30 29 26 30 78  [1] = (i>> 0)&0x
2bc0: 46 46 3b 0a 20 20 72 65 74 75 72 6e 20 32 3b 0a  FF;.  return 2;.
2bd0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  }.static int wri
2be0: 74 65 43 6f 6f 72 64 28 75 38 20 2a 70 2c 20 52  teCoord(u8 *p, R
2bf0: 74 72 65 65 43 6f 6f 72 64 20 2a 70 43 6f 6f 72  treeCoord *pCoor
2c00: 64 29 7b 0a 20 20 75 33 32 20 69 3b 0a 20 20 61  d){.  u32 i;.  a
2c10: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 52 74  ssert( sizeof(Rt
2c20: 72 65 65 43 6f 6f 72 64 29 3d 3d 34 20 29 3b 0a  reeCoord)==4 );.
2c30: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
2c40: 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 69 20  (u32)==4 );.  i 
2c50: 3d 20 2a 28 75 33 32 20 2a 29 70 43 6f 6f 72 64  = *(u32 *)pCoord
2c60: 3b 0a 20 20 70 5b 30 5d 20 3d 20 28 69 3e 3e 32  ;.  p[0] = (i>>2
2c70: 34 29 26 30 78 46 46 3b 0a 20 20 70 5b 31 5d 20  4)&0xFF;.  p[1] 
2c80: 3d 20 28 69 3e 3e 31 36 29 26 30 78 46 46 3b 0a  = (i>>16)&0xFF;.
2c90: 20 20 70 5b 32 5d 20 3d 20 28 69 3e 3e 20 38 29    p[2] = (i>> 8)
2ca0: 26 30 78 46 46 3b 0a 20 20 70 5b 33 5d 20 3d 20  &0xFF;.  p[3] = 
2cb0: 28 69 3e 3e 20 30 29 26 30 78 46 46 3b 0a 20 20  (i>> 0)&0xFF;.  
2cc0: 72 65 74 75 72 6e 20 34 3b 0a 7d 0a 73 74 61 74  return 4;.}.stat
2cd0: 69 63 20 69 6e 74 20 77 72 69 74 65 49 6e 74 36  ic int writeInt6
2ce0: 34 28 75 38 20 2a 70 2c 20 69 36 34 20 69 29 7b  4(u8 *p, i64 i){
2cf0: 0a 20 20 70 5b 30 5d 20 3d 20 28 69 3e 3e 35 36  .  p[0] = (i>>56
2d00: 29 26 30 78 46 46 3b 0a 20 20 70 5b 31 5d 20 3d  )&0xFF;.  p[1] =
2d10: 20 28 69 3e 3e 34 38 29 26 30 78 46 46 3b 0a 20   (i>>48)&0xFF;. 
2d20: 20 70 5b 32 5d 20 3d 20 28 69 3e 3e 34 30 29 26   p[2] = (i>>40)&
2d30: 30 78 46 46 3b 0a 20 20 70 5b 33 5d 20 3d 20 28  0xFF;.  p[3] = (
2d40: 69 3e 3e 33 32 29 26 30 78 46 46 3b 0a 20 20 70  i>>32)&0xFF;.  p
2d50: 5b 34 5d 20 3d 20 28 69 3e 3e 32 34 29 26 30 78  [4] = (i>>24)&0x
2d60: 46 46 3b 0a 20 20 70 5b 35 5d 20 3d 20 28 69 3e  FF;.  p[5] = (i>
2d70: 3e 31 36 29 26 30 78 46 46 3b 0a 20 20 70 5b 36  >16)&0xFF;.  p[6
2d80: 5d 20 3d 20 28 69 3e 3e 20 38 29 26 30 78 46 46  ] = (i>> 8)&0xFF
2d90: 3b 0a 20 20 70 5b 37 5d 20 3d 20 28 69 3e 3e 20  ;.  p[7] = (i>> 
2da0: 30 29 26 30 78 46 46 3b 0a 20 20 72 65 74 75 72  0)&0xFF;.  retur
2db0: 6e 20 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 8;.}../*.** In
2dc0: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
2dd0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 66 20 6e  rence count of n
2de0: 6f 64 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode p..*/.static
2df0: 20 76 6f 69 64 20 6e 6f 64 65 52 65 66 65 72 65   void nodeRefere
2e00: 6e 63 65 28 52 74 72 65 65 4e 6f 64 65 20 2a 70  nce(RtreeNode *p
2e10: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
2e20: 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d    p->nRef++;.  }
2e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
2e40: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6e  the content of n
2e50: 6f 64 65 20 70 20 28 73 65 74 20 61 6c 6c 20 62  ode p (set all b
2e60: 79 74 65 73 20 74 6f 20 30 78 30 30 29 2e 0a 2a  ytes to 0x00)..*
2e70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f  /.static void no
2e80: 64 65 5a 65 72 6f 28 52 74 72 65 65 20 2a 70 52  deZero(Rtree *pR
2e90: 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20  tree, RtreeNode 
2ea0: 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 26 70  *p){.  memset(&p
2eb0: 2d 3e 7a 44 61 74 61 5b 32 5d 2c 20 30 2c 20 70  ->zData[2], 0, p
2ec0: 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65  Rtree->iNodeSize
2ed0: 2d 32 29 3b 0a 20 20 70 2d 3e 69 73 44 69 72 74  -2);.  p->isDirt
2ee0: 79 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y = 1;.}../*.** 
2ef0: 47 69 76 65 6e 20 61 20 6e 6f 64 65 20 6e 75 6d  Given a node num
2f00: 62 65 72 20 69 4e 6f 64 65 2c 20 72 65 74 75 72  ber iNode, retur
2f10: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
2f20: 69 6e 67 20 6b 65 79 20 74 6f 20 75 73 65 0a 2a  ing key to use.*
2f30: 2a 20 69 6e 20 74 68 65 20 52 74 72 65 65 2e 61  * in the Rtree.a
2f40: 48 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  Hash table..*/.s
2f50: 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65 48 61  tatic int nodeHa
2f60: 73 68 28 69 36 34 20 69 4e 6f 64 65 29 7b 0a 20  sh(i64 iNode){. 
2f70: 20 72 65 74 75 72 6e 20 28 0a 20 20 20 20 28 69   return (.    (i
2f80: 4e 6f 64 65 3e 3e 35 36 29 20 5e 20 28 69 4e 6f  Node>>56) ^ (iNo
2f90: 64 65 3e 3e 34 38 29 20 5e 20 28 69 4e 6f 64 65  de>>48) ^ (iNode
2fa0: 3e 3e 34 30 29 20 5e 20 28 69 4e 6f 64 65 3e 3e  >>40) ^ (iNode>>
2fb0: 33 32 29 20 5e 20 0a 20 20 20 20 28 69 4e 6f 64  32) ^ .    (iNod
2fc0: 65 3e 3e 32 34 29 20 5e 20 28 69 4e 6f 64 65 3e  e>>24) ^ (iNode>
2fd0: 3e 31 36 29 20 5e 20 28 69 4e 6f 64 65 3e 3e 20  >16) ^ (iNode>> 
2fe0: 38 29 20 5e 20 28 69 4e 6f 64 65 3e 3e 20 30 29  8) ^ (iNode>> 0)
2ff0: 0a 20 20 29 20 25 20 48 41 53 48 53 49 5a 45 3b  .  ) % HASHSIZE;
3000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
3010: 20 74 68 65 20 6e 6f 64 65 20 68 61 73 68 20 74   the node hash t
3020: 61 62 6c 65 20 66 6f 72 20 6e 6f 64 65 20 69 4e  able for node iN
3030: 6f 64 65 2e 20 49 66 20 66 6f 75 6e 64 2c 20 72  ode. If found, r
3040: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
3050: 2a 2a 20 74 6f 20 69 74 2e 20 4f 74 68 65 72 77  ** to it. Otherw
3060: 69 73 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ise, return 0..*
3070: 2f 0a 73 74 61 74 69 63 20 52 74 72 65 65 4e 6f  /.static RtreeNo
3080: 64 65 20 2a 6e 6f 64 65 48 61 73 68 4c 6f 6f 6b  de *nodeHashLook
3090: 75 70 28 52 74 72 65 65 20 2a 70 52 74 72 65 65  up(Rtree *pRtree
30a0: 2c 20 69 36 34 20 69 4e 6f 64 65 29 7b 0a 20 20  , i64 iNode){.  
30b0: 52 74 72 65 65 4e 6f 64 65 20 2a 70 3b 0a 20 20  RtreeNode *p;.  
30c0: 66 6f 72 28 70 3d 70 52 74 72 65 65 2d 3e 61 48  for(p=pRtree->aH
30d0: 61 73 68 5b 6e 6f 64 65 48 61 73 68 28 69 4e 6f  ash[nodeHash(iNo
30e0: 64 65 29 5d 3b 20 70 20 26 26 20 70 2d 3e 69 4e  de)]; p && p->iN
30f0: 6f 64 65 21 3d 69 4e 6f 64 65 3b 20 70 3d 70 2d  ode!=iNode; p=p-
3100: 3e 70 4e 65 78 74 29 3b 0a 20 20 72 65 74 75 72  >pNext);.  retur
3110: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n p;.}../*.** Ad
3120: 64 20 6e 6f 64 65 20 70 4e 6f 64 65 20 74 6f 20  d node pNode to 
3130: 74 68 65 20 6e 6f 64 65 20 68 61 73 68 20 74 61  the node hash ta
3140: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
3150: 6f 69 64 20 6e 6f 64 65 48 61 73 68 49 6e 73 65  oid nodeHashInse
3160: 72 74 28 52 74 72 65 65 20 2a 70 52 74 72 65 65  rt(Rtree *pRtree
3170: 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f  , RtreeNode *pNo
3180: 64 65 29 7b 0a 20 20 69 6e 74 20 69 48 61 73 68  de){.  int iHash
3190: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64  ;.  assert( pNod
31a0: 65 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  e->pNext==0 );. 
31b0: 20 69 48 61 73 68 20 3d 20 6e 6f 64 65 48 61 73   iHash = nodeHas
31c0: 68 28 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b  h(pNode->iNode);
31d0: 0a 20 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 20  .  pNode->pNext 
31e0: 3d 20 70 52 74 72 65 65 2d 3e 61 48 61 73 68 5b  = pRtree->aHash[
31f0: 69 48 61 73 68 5d 3b 0a 20 20 70 52 74 72 65 65  iHash];.  pRtree
3200: 2d 3e 61 48 61 73 68 5b 69 48 61 73 68 5d 20 3d  ->aHash[iHash] =
3210: 20 70 4e 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pNode;.}../*.**
3220: 20 52 65 6d 6f 76 65 20 6e 6f 64 65 20 70 4e 6f   Remove node pNo
3230: 64 65 20 66 72 6f 6d 20 74 68 65 20 6e 6f 64 65  de from the node
3240: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a   hash table..*/.
3250: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65  static void node
3260: 48 61 73 68 44 65 6c 65 74 65 28 52 74 72 65 65  HashDelete(Rtree
3270: 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e   *pRtree, RtreeN
3280: 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 52  ode *pNode){.  R
3290: 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20  treeNode **pp;. 
32a0: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64   if( pNode->iNod
32b0: 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 70 20 3d  e!=0 ){.    pp =
32c0: 20 26 70 52 74 72 65 65 2d 3e 61 48 61 73 68 5b   &pRtree->aHash[
32d0: 6e 6f 64 65 48 61 73 68 28 70 4e 6f 64 65 2d 3e  nodeHash(pNode->
32e0: 69 4e 6f 64 65 29 5d 3b 0a 20 20 20 20 66 6f 72  iNode)];.    for
32f0: 28 20 3b 20 28 2a 70 70 29 21 3d 70 4e 6f 64 65  ( ; (*pp)!=pNode
3300: 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
3310: 4e 65 78 74 29 7b 20 61 73 73 65 72 74 28 2a 70  Next){ assert(*p
3320: 70 29 3b 20 7d 0a 20 20 20 20 2a 70 70 20 3d 20  p); }.    *pp = 
3330: 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  pNode->pNext;.  
3340: 20 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d    pNode->pNext =
3350: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
3360: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
3370: 74 75 72 6e 20 6e 65 77 20 72 2d 74 72 65 65 20  turn new r-tree 
3380: 6e 6f 64 65 2e 20 49 6e 69 74 69 61 6c 6c 79 2c  node. Initially,
3390: 20 28 52 74 72 65 65 4e 6f 64 65 2e 69 4e 6f 64   (RtreeNode.iNod
33a0: 65 3d 3d 30 29 2c 0a 2a 2a 20 69 6e 64 69 63 61  e==0),.** indica
33b0: 74 69 6e 67 20 74 68 61 74 20 6e 6f 64 65 20 68  ting that node h
33c0: 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
33d0: 61 73 73 69 67 6e 65 64 20 61 20 6e 6f 64 65 20  assigned a node 
33e0: 6e 75 6d 62 65 72 2e 20 49 74 20 69 73 0a 2a 2a  number. It is.**
33f0: 20 61 73 73 69 67 6e 65 64 20 61 20 6e 6f 64 65   assigned a node
3400: 20 6e 75 6d 62 65 72 20 77 68 65 6e 20 6e 6f 64   number when nod
3410: 65 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  eWrite() is call
3420: 65 64 20 74 6f 20 77 72 69 74 65 20 74 68 65 0a  ed to write the.
3430: 2a 2a 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 73  ** node contents
3440: 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
3450: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
3460: 52 74 72 65 65 4e 6f 64 65 20 2a 6e 6f 64 65 4e  RtreeNode *nodeN
3470: 65 77 28 52 74 72 65 65 20 2a 70 52 74 72 65 65  ew(Rtree *pRtree
3480: 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61  , RtreeNode *pPa
3490: 72 65 6e 74 29 7b 0a 20 20 52 74 72 65 65 4e 6f  rent){.  RtreeNo
34a0: 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 70 4e 6f  de *pNode;.  pNo
34b0: 64 65 20 3d 20 28 52 74 72 65 65 4e 6f 64 65 20  de = (RtreeNode 
34c0: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
34d0: 28 73 69 7a 65 6f 66 28 52 74 72 65 65 4e 6f 64  (sizeof(RtreeNod
34e0: 65 29 20 2b 20 70 52 74 72 65 65 2d 3e 69 4e 6f  e) + pRtree->iNo
34f0: 64 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70  deSize);.  if( p
3500: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 6d 65 6d 73  Node ){.    mems
3510: 65 74 28 70 4e 6f 64 65 2c 20 30 2c 20 73 69 7a  et(pNode, 0, siz
3520: 65 6f 66 28 52 74 72 65 65 4e 6f 64 65 29 20 2b  eof(RtreeNode) +
3530: 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69   pRtree->iNodeSi
3540: 7a 65 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  ze);.    pNode->
3550: 7a 44 61 74 61 20 3d 20 28 75 38 20 2a 29 26 70  zData = (u8 *)&p
3560: 4e 6f 64 65 5b 31 5d 3b 0a 20 20 20 20 70 4e 6f  Node[1];.    pNo
3570: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
3580: 20 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74    pNode->pParent
3590: 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20   = pParent;.    
35a0: 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d  pNode->isDirty =
35b0: 20 31 3b 0a 20 20 20 20 6e 6f 64 65 52 65 66 65   1;.    nodeRefe
35c0: 72 65 6e 63 65 28 70 50 61 72 65 6e 74 29 3b 0a  rence(pParent);.
35d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 6f    }.  return pNo
35e0: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74  de;.}../*.** Obt
35f0: 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
3600: 74 6f 20 61 6e 20 72 2d 74 72 65 65 20 6e 6f 64  to an r-tree nod
3610: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3620: 0a 6e 6f 64 65 41 63 71 75 69 72 65 28 0a 20 20  .nodeAcquire(.  
3630: 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 20  Rtree *pRtree,  
3640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 2d             /* R-
3650: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
3660: 2f 0a 20 20 69 36 34 20 69 4e 6f 64 65 2c 20 20  /.  i64 iNode,  
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3680: 2a 20 4e 6f 64 65 20 6e 75 6d 62 65 72 20 74 6f  * Node number to
3690: 20 6c 6f 61 64 20 2a 2f 0a 20 20 52 74 72 65 65   load */.  Rtree
36a0: 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Node *pParent,  
36b0: 20 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20        /* Either 
36c0: 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 20  the parent node 
36d0: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 52 74 72  or NULL */.  Rtr
36e0: 65 65 4e 6f 64 65 20 2a 2a 70 70 4e 6f 64 65 20  eeNode **ppNode 
36f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3700: 41 63 71 75 69 72 65 64 20 6e 6f 64 65 20 2a 2f  Acquired node */
3710: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
3720: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
3730: 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65  _OK;.  RtreeNode
3740: 20 2a 70 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 43   *pNode;..  /* C
3750: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 71 75  heck if the requ
3760: 65 73 74 65 64 20 6e 6f 64 65 20 69 73 20 61 6c  ested node is al
3770: 72 65 61 64 79 20 69 6e 20 74 68 65 20 68 61 73  ready in the has
3780: 68 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 0a  h table. If so,.
3790: 20 20 2a 2a 20 69 6e 63 72 65 61 73 65 20 69 74    ** increase it
37a0: 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
37b0: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 2e  t and return it.
37c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 4e 6f  .  */.  if( (pNo
37d0: 64 65 20 3d 20 6e 6f 64 65 48 61 73 68 4c 6f 6f  de = nodeHashLoo
37e0: 6b 75 70 28 70 52 74 72 65 65 2c 20 69 4e 6f 64  kup(pRtree, iNod
37f0: 65 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  e)) ){.    asser
3800: 74 28 20 21 70 50 61 72 65 6e 74 20 7c 7c 20 21  t( !pParent || !
3810: 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 20 7c  pNode->pParent |
3820: 7c 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74  | pNode->pParent
3830: 3d 3d 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 20  ==pParent );.   
3840: 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20   if( pParent && 
3850: 21 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 20  !pNode->pParent 
3860: 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65 52 65 66  ){.      nodeRef
3870: 65 72 65 6e 63 65 28 70 50 61 72 65 6e 74 29 3b  erence(pParent);
3880: 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 70 50  .      pNode->pP
3890: 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b  arent = pParent;
38a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 6f 64 65  .    }.    pNode
38b0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 2a 70  ->nRef++;.    *p
38c0: 70 4e 6f 64 65 20 3d 20 70 4e 6f 64 65 3b 0a 20  pNode = pNode;. 
38d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
38e0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  _OK;.  }..  sqli
38f0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
3900: 52 74 72 65 65 2d 3e 70 52 65 61 64 4e 6f 64 65  Rtree->pReadNode
3910: 2c 20 31 2c 20 69 4e 6f 64 65 29 3b 0a 20 20 72  , 1, iNode);.  r
3920: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
3930: 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 4e 6f  (pRtree->pReadNo
3940: 64 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  de);.  if( rc==S
3950: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
3960: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 42 6c 6f 62   const u8 *zBlob
3970: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
3980: 6e 5f 62 6c 6f 62 28 70 52 74 72 65 65 2d 3e 70  n_blob(pRtree->p
3990: 52 65 61 64 4e 6f 64 65 2c 20 30 29 3b 0a 20 20  ReadNode, 0);.  
39a0: 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e 69 4e    if( pRtree->iN
39b0: 6f 64 65 53 69 7a 65 3d 3d 73 71 6c 69 74 65 33  odeSize==sqlite3
39c0: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 52  _column_bytes(pR
39d0: 74 72 65 65 2d 3e 70 52 65 61 64 4e 6f 64 65 2c  tree->pReadNode,
39e0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 6f   0) ){.      pNo
39f0: 64 65 20 3d 20 28 52 74 72 65 65 4e 6f 64 65 20  de = (RtreeNode 
3a00: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
3a10: 28 73 69 7a 65 6f 66 28 52 74 72 65 65 4e 6f 64  (sizeof(RtreeNod
3a20: 65 29 2b 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65  e)+pRtree->iNode
3a30: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
3a40: 20 21 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20   !pNode ){.     
3a50: 20 20 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f     rc2 = SQLITE_
3a60: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
3a70: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64  se{.        pNod
3a80: 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e->pParent = pPa
3a90: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4e  rent;.        pN
3aa0: 6f 64 65 2d 3e 7a 44 61 74 61 20 3d 20 28 75 38  ode->zData = (u8
3ab0: 20 2a 29 26 70 4e 6f 64 65 5b 31 5d 3b 0a 20 20   *)&pNode[1];.  
3ac0: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 52 65        pNode->nRe
3ad0: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  f = 1;.        p
3ae0: 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20 3d 20 69 4e  Node->iNode = iN
3af0: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f  ode;.        pNo
3b00: 64 65 2d 3e 69 73 44 69 72 74 79 20 3d 20 30 3b  de->isDirty = 0;
3b10: 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  .        pNode->
3b20: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
3b30: 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65 2d     memcpy(pNode-
3b40: 3e 7a 44 61 74 61 2c 20 7a 42 6c 6f 62 2c 20 70  >zData, zBlob, p
3b50: 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65  Rtree->iNodeSize
3b60: 29 3b 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 52  );.        nodeR
3b70: 65 66 65 72 65 6e 63 65 28 70 50 61 72 65 6e 74  eference(pParent
3b80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3b90: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
3ba0: 74 65 33 5f 72 65 73 65 74 28 70 52 74 72 65 65  te3_reset(pRtree
3bb0: 2d 3e 70 52 65 61 64 4e 6f 64 65 29 3b 0a 20 20  ->pReadNode);.  
3bc0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3bd0: 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20  K ) rc = rc2;.. 
3be0: 20 2f 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20   /* If the root 
3bf0: 6e 6f 64 65 20 77 61 73 20 6a 75 73 74 20 6c 6f  node was just lo
3c00: 61 64 65 64 2c 20 73 65 74 20 70 52 74 72 65 65  aded, set pRtree
3c10: 2d 3e 69 44 65 70 74 68 20 74 6f 20 74 68 65 20  ->iDepth to the 
3c20: 68 65 69 67 68 74 0a 20 20 2a 2a 20 6f 66 20 74  height.  ** of t
3c30: 68 65 20 72 2d 74 72 65 65 20 73 74 72 75 63 74  he r-tree struct
3c40: 75 72 65 2e 20 41 20 68 65 69 67 68 74 20 6f 66  ure. A height of
3c50: 20 7a 65 72 6f 20 6d 65 61 6e 73 20 61 6c 6c 20   zero means all 
3c60: 64 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f  data is stored o
3c70: 6e 0a 20 20 2a 2a 20 74 68 65 20 72 6f 6f 74 20  n.  ** the root 
3c80: 6e 6f 64 65 2e 20 41 20 68 65 69 67 68 74 20 6f  node. A height o
3c90: 66 20 6f 6e 65 20 6d 65 61 6e 73 20 74 68 65 20  f one means the 
3ca0: 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20  children of the 
3cb0: 72 6f 6f 74 20 6e 6f 64 65 0a 20 20 2a 2a 20 61  root node.  ** a
3cc0: 72 65 20 74 68 65 20 6c 65 61 76 65 73 2c 20 61  re the leaves, a
3cd0: 6e 64 20 73 6f 20 6f 6e 2e 20 49 66 20 74 68 65  nd so on. If the
3ce0: 20 64 65 70 74 68 20 61 73 20 73 70 65 63 69 66   depth as specif
3cf0: 69 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ied on the root 
3d00: 6e 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 72 65  node.  ** is gre
3d10: 61 74 65 72 20 74 68 61 6e 20 52 54 52 45 45 5f  ater than RTREE_
3d20: 4d 41 58 5f 44 45 50 54 48 2c 20 74 68 65 20 72  MAX_DEPTH, the r
3d30: 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
3d40: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
3d50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 6f 64  .  */.  if( pNod
3d60: 65 20 26 26 20 69 4e 6f 64 65 3d 3d 31 20 29 7b  e && iNode==1 ){
3d70: 0a 20 20 20 20 70 52 74 72 65 65 2d 3e 69 44 65  .    pRtree->iDe
3d80: 70 74 68 20 3d 20 72 65 61 64 49 6e 74 31 36 28  pth = readInt16(
3d90: 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 29 3b 0a 20  pNode->zData);. 
3da0: 20 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e 69     if( pRtree->i
3db0: 44 65 70 74 68 3e 52 54 52 45 45 5f 4d 41 58 5f  Depth>RTREE_MAX_
3dc0: 44 45 50 54 48 20 29 7b 0a 20 20 20 20 20 20 72  DEPTH ){.      r
3dd0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
3de0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
3df0: 20 2f 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20   /* If no error 
3e00: 68 61 73 20 6f 63 63 75 72 72 65 64 20 73 6f 20  has occurred so 
3e10: 66 61 72 2c 20 63 68 65 63 6b 20 69 66 20 74 68  far, check if th
3e20: 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  e "number of ent
3e30: 72 69 65 73 22 0a 20 20 2a 2a 20 66 69 65 6c 64  ries".  ** field
3e40: 20 6f 6e 20 74 68 65 20 6e 6f 64 65 20 69 73 20   on the node is 
3e50: 74 6f 6f 20 6c 61 72 67 65 2e 20 49 66 20 73 6f  too large. If so
3e60: 2c 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e  , set the return
3e70: 20 63 6f 64 65 20 74 6f 20 0a 20 20 2a 2a 20 53   code to .  ** S
3e80: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20  QLITE_CORRUPT.. 
3e90: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 6f 64 65 20   */.  if( pNode 
3ea0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
3eb0: 20 29 7b 0a 20 20 20 20 69 66 28 20 4e 43 45 4c   ){.    if( NCEL
3ec0: 4c 28 70 4e 6f 64 65 29 3e 28 28 70 52 74 72 65  L(pNode)>((pRtre
3ed0: 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 2d 34 29 2f  e->iNodeSize-4)/
3ee0: 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65  pRtree->nBytesPe
3ef0: 72 43 65 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  rCell) ){.      
3f00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
3f10: 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  UPT;.    }.  }..
3f20: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3f30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
3f40: 4e 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Node!=0 ){.     
3f50: 20 6e 6f 64 65 48 61 73 68 49 6e 73 65 72 74 28   nodeHashInsert(
3f60: 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a  pRtree, pNode);.
3f70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3f80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
3f90: 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
3fa0: 2a 70 70 4e 6f 64 65 20 3d 20 70 4e 6f 64 65 3b  *ppNode = pNode;
3fb0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
3fc0: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65  lite3_free(pNode
3fd0: 29 3b 0a 20 20 20 20 2a 70 70 4e 6f 64 65 20 3d  );.    *ppNode =
3fe0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
3ff0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
4000: 76 65 72 77 72 69 74 65 20 63 65 6c 6c 20 69 43  verwrite cell iC
4010: 65 6c 6c 20 6f 66 20 6e 6f 64 65 20 70 4e 6f 64  ell of node pNod
4020: 65 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65  e with the conte
4030: 6e 74 73 20 6f 66 20 70 43 65 6c 6c 2e 0a 2a 2f  nts of pCell..*/
4040: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64  .static void nod
4050: 65 4f 76 65 72 77 72 69 74 65 43 65 6c 6c 28 0a  eOverwriteCell(.
4060: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
4070: 20 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70   .  RtreeNode *p
4080: 4e 6f 64 65 2c 20 20 0a 20 20 52 74 72 65 65 43  Node,  .  RtreeC
4090: 65 6c 6c 20 2a 70 43 65 6c 6c 2c 20 0a 20 20 69  ell *pCell, .  i
40a0: 6e 74 20 69 43 65 6c 6c 0a 29 7b 0a 20 20 69 6e  nt iCell.){.  in
40b0: 74 20 69 69 3b 0a 20 20 75 38 20 2a 70 20 3d 20  t ii;.  u8 *p = 
40c0: 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b 34 20  &pNode->zData[4 
40d0: 2b 20 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73  + pRtree->nBytes
40e0: 50 65 72 43 65 6c 6c 2a 69 43 65 6c 6c 5d 3b 0a  PerCell*iCell];.
40f0: 20 20 70 20 2b 3d 20 77 72 69 74 65 49 6e 74 36    p += writeInt6
4100: 34 28 70 2c 20 70 43 65 6c 6c 2d 3e 69 52 6f 77  4(p, pCell->iRow
4110: 69 64 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  id);.  for(ii=0;
4120: 20 69 69 3c 28 70 52 74 72 65 65 2d 3e 6e 44 69   ii<(pRtree->nDi
4130: 6d 2a 32 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  m*2); ii++){.   
4140: 20 70 20 2b 3d 20 77 72 69 74 65 43 6f 6f 72 64   p += writeCoord
4150: 28 70 2c 20 26 70 43 65 6c 6c 2d 3e 61 43 6f 6f  (p, &pCell->aCoo
4160: 72 64 5b 69 69 5d 29 3b 0a 20 20 7d 0a 20 20 70  rd[ii]);.  }.  p
4170: 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d 20  Node->isDirty = 
4180: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  1;.}../*.** Remo
4190: 76 65 20 63 65 6c 6c 20 74 68 65 20 63 65 6c 6c  ve cell the cell
41a0: 20 77 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c   with index iCel
41b0: 6c 20 66 72 6f 6d 20 6e 6f 64 65 20 70 4e 6f 64  l from node pNod
41c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
41d0: 64 20 6e 6f 64 65 44 65 6c 65 74 65 43 65 6c 6c  d nodeDeleteCell
41e0: 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20  (Rtree *pRtree, 
41f0: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
4200: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
4210: 75 38 20 2a 70 44 73 74 20 3d 20 26 70 4e 6f 64  u8 *pDst = &pNod
4220: 65 2d 3e 7a 44 61 74 61 5b 34 20 2b 20 70 52 74  e->zData[4 + pRt
4230: 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65  ree->nBytesPerCe
4240: 6c 6c 2a 69 43 65 6c 6c 5d 3b 0a 20 20 75 38 20  ll*iCell];.  u8 
4250: 2a 70 53 72 63 20 3d 20 26 70 44 73 74 5b 70 52  *pSrc = &pDst[pR
4260: 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43  tree->nBytesPerC
4270: 65 6c 6c 5d 3b 0a 20 20 69 6e 74 20 6e 42 79 74  ell];.  int nByt
4280: 65 20 3d 20 28 4e 43 45 4c 4c 28 70 4e 6f 64 65  e = (NCELL(pNode
4290: 29 20 2d 20 69 43 65 6c 6c 20 2d 20 31 29 20 2a  ) - iCell - 1) *
42a0: 20 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50   pRtree->nBytesP
42b0: 65 72 43 65 6c 6c 3b 0a 20 20 6d 65 6d 6d 6f 76  erCell;.  memmov
42c0: 65 28 70 44 73 74 2c 20 70 53 72 63 2c 20 6e 42  e(pDst, pSrc, nB
42d0: 79 74 65 29 3b 0a 20 20 77 72 69 74 65 49 6e 74  yte);.  writeInt
42e0: 31 36 28 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61  16(&pNode->zData
42f0: 5b 32 5d 2c 20 4e 43 45 4c 4c 28 70 4e 6f 64 65  [2], NCELL(pNode
4300: 29 2d 31 29 3b 0a 20 20 70 4e 6f 64 65 2d 3e 69  )-1);.  pNode->i
4310: 73 44 69 72 74 79 20 3d 20 31 3b 0a 7d 0a 0a 2f  sDirty = 1;.}../
4320: 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 74 68 65 20  *.** Insert the 
4330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 63 65 6c 6c  contents of cell
4340: 20 70 43 65 6c 6c 20 69 6e 74 6f 20 6e 6f 64 65   pCell into node
4350: 20 70 4e 6f 64 65 2e 20 49 66 20 74 68 65 20 69   pNode. If the i
4360: 6e 73 65 72 74 0a 2a 2a 20 69 73 20 73 75 63 63  nsert.** is succ
4370: 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53  essful, return S
4380: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
4390: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  If there is not 
43a0: 65 6e 6f 75 67 68 20 66 72 65 65 20 73 70 61 63  enough free spac
43b0: 65 20 69 6e 20 70 4e 6f 64 65 2c 20 72 65 74 75  e in pNode, retu
43c0: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a  rn SQLITE_FULL..
43d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 6e 6f  */.static int.no
43e0: 64 65 49 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  deInsertCell(.  
43f0: 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 0a  Rtree *pRtree, .
4400: 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f    RtreeNode *pNo
4410: 64 65 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c  de, .  RtreeCell
4420: 20 2a 70 43 65 6c 6c 20 0a 29 7b 0a 20 20 69 6e   *pCell .){.  in
4430: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
4440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4450: 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
4460: 20 63 65 6c 6c 73 20 69 6e 20 70 4e 6f 64 65 20   cells in pNode 
4470: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
4480: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
4490: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
44a0: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 66 6f  mber of cells fo
44b0: 72 20 70 4e 6f 64 65 20 2a 2f 0a 0a 20 20 6e 4d  r pNode */..  nM
44c0: 61 78 43 65 6c 6c 20 3d 20 28 70 52 74 72 65 65  axCell = (pRtree
44d0: 2d 3e 69 4e 6f 64 65 53 69 7a 65 2d 34 29 2f 70  ->iNodeSize-4)/p
44e0: 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72  Rtree->nBytesPer
44f0: 43 65 6c 6c 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  Cell;.  nCell = 
4500: 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a 0a 20  NCELL(pNode);.. 
4510: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 3d   assert( nCell<=
4520: 6e 4d 61 78 43 65 6c 6c 20 29 3b 0a 20 20 69 66  nMaxCell );.  if
4530: 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
4540: 20 29 7b 0a 20 20 20 20 6e 6f 64 65 4f 76 65 72   ){.    nodeOver
4550: 77 72 69 74 65 43 65 6c 6c 28 70 52 74 72 65 65  writeCell(pRtree
4560: 2c 20 70 4e 6f 64 65 2c 20 70 43 65 6c 6c 2c 20  , pNode, pCell, 
4570: 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 77 72 69 74  nCell);.    writ
4580: 65 49 6e 74 31 36 28 26 70 4e 6f 64 65 2d 3e 7a  eInt16(&pNode->z
4590: 44 61 74 61 5b 32 5d 2c 20 6e 43 65 6c 6c 2b 31  Data[2], nCell+1
45a0: 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 69 73  );.    pNode->is
45b0: 44 69 72 74 79 20 3d 20 31 3b 0a 20 20 7d 0a 0a  Dirty = 1;.  }..
45c0: 20 20 72 65 74 75 72 6e 20 28 6e 43 65 6c 6c 3d    return (nCell=
45d0: 3d 6e 4d 61 78 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f  =nMaxCell);.}../
45e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65  *.** If the node
45f0: 20 69 73 20 64 69 72 74 79 2c 20 77 72 69 74 65   is dirty, write
4600: 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 64   it out to the d
4610: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
4620: 69 63 20 69 6e 74 0a 6e 6f 64 65 57 72 69 74 65  ic int.nodeWrite
4630: 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20  (Rtree *pRtree, 
4640: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
4650: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
4660: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
4670: 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 29 7b  Node->isDirty ){
4680: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
4690: 74 20 2a 70 20 3d 20 70 52 74 72 65 65 2d 3e 70  t *p = pRtree->p
46a0: 57 72 69 74 65 4e 6f 64 65 3b 0a 20 20 20 20 69  WriteNode;.    i
46b0: 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20  f( pNode->iNode 
46c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
46d0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2c 20 31  _bind_int64(p, 1
46e0: 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b  , pNode->iNode);
46f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4700: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
4710: 75 6c 6c 28 70 2c 20 31 29 3b 0a 20 20 20 20 7d  ull(p, 1);.    }
4720: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
4730: 64 5f 62 6c 6f 62 28 70 2c 20 32 2c 20 70 4e 6f  d_blob(p, 2, pNo
4740: 64 65 2d 3e 7a 44 61 74 61 2c 20 70 52 74 72 65  de->zData, pRtre
4750: 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 2c 20 53 51  e->iNodeSize, SQ
4760: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
4770: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
4780: 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 69 73  );.    pNode->is
4790: 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72  Dirty = 0;.    r
47a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
47b0: 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  t(p);.    if( pN
47c0: 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 30 20 26 26  ode->iNode==0 &&
47d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
47e0: 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69  {.      pNode->i
47f0: 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6c  Node = sqlite3_l
4800: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
4810: 28 70 52 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  (pRtree->db);.  
4820: 20 20 20 20 6e 6f 64 65 48 61 73 68 49 6e 73 65      nodeHashInse
4830: 72 74 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  rt(pRtree, pNode
4840: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
4850: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4860: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
4870: 65 72 65 6e 63 65 20 74 6f 20 61 20 6e 6f 64 65  erence to a node
4880: 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20 69 73  . If the node is
4890: 20 64 69 72 74 79 20 61 6e 64 20 74 68 65 20 72   dirty and the r
48a0: 65 66 65 72 65 6e 63 65 0a 2a 2a 20 63 6f 75 6e  eference.** coun
48b0: 74 20 64 72 6f 70 73 20 74 6f 20 7a 65 72 6f 2c  t drops to zero,
48c0: 20 74 68 65 20 6e 6f 64 65 20 64 61 74 61 20 69   the node data i
48d0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
48e0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
48f0: 61 74 69 63 20 69 6e 74 0a 6e 6f 64 65 52 65 6c  atic int.nodeRel
4900: 65 61 73 65 28 52 74 72 65 65 20 2a 70 52 74 72  ease(Rtree *pRtr
4910: 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70  ee, RtreeNode *p
4920: 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Node){.  int rc 
4930: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
4940: 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20  f( pNode ){.    
4950: 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e  assert( pNode->n
4960: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 4e 6f  Ref>0 );.    pNo
4970: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
4980: 69 66 28 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 3d  if( pNode->nRef=
4990: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
49a0: 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20  pNode->iNode==1 
49b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 74 72 65  ){.        pRtre
49c0: 65 2d 3e 69 44 65 70 74 68 20 3d 20 2d 31 3b 0a  e->iDepth = -1;.
49d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
49e0: 28 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74  ( pNode->pParent
49f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
4a00: 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
4a10: 72 65 65 2c 20 70 4e 6f 64 65 2d 3e 70 50 61 72  ree, pNode->pPar
4a20: 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ent);.      }.  
4a30: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
4a40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
4a50: 20 72 63 20 3d 20 6e 6f 64 65 57 72 69 74 65 28   rc = nodeWrite(
4a60: 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a  pRtree, pNode);.
4a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 6f        }.      no
4a80: 64 65 48 61 73 68 44 65 6c 65 74 65 28 70 52 74  deHashDelete(pRt
4a90: 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20  ree, pNode);.   
4aa0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
4ab0: 70 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pNode);.    }.  
4ac0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4ad0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4ae0: 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  he 64-bit intege
4af0: 72 20 76 61 6c 75 65 20 61 73 73 6f 63 69 61 74  r value associat
4b00: 65 64 20 77 69 74 68 20 63 65 6c 6c 20 69 43 65  ed with cell iCe
4b10: 6c 6c 20 6f 66 0a 2a 2a 20 6e 6f 64 65 20 70 4e  ll of.** node pN
4b20: 6f 64 65 2e 20 49 66 20 70 4e 6f 64 65 20 69 73  ode. If pNode is
4b30: 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 74 68   a leaf node, th
4b40: 69 73 20 69 73 20 61 20 72 6f 77 69 64 2e 20 49  is is a rowid. I
4b50: 66 20 69 74 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  f it is.** an in
4b60: 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68 65  ternal node, the
4b70: 6e 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  n the 64-bit int
4b80: 65 67 65 72 20 69 73 20 61 20 63 68 69 6c 64 20  eger is a child 
4b90: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  page number..*/.
4ba0: 73 74 61 74 69 63 20 69 36 34 20 6e 6f 64 65 47  static i64 nodeG
4bb0: 65 74 52 6f 77 69 64 28 0a 20 20 52 74 72 65 65  etRowid(.  Rtree
4bc0: 20 2a 70 52 74 72 65 65 2c 20 0a 20 20 52 74 72   *pRtree, .  Rtr
4bd0: 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 0a  eeNode *pNode, .
4be0: 20 20 69 6e 74 20 69 43 65 6c 6c 0a 29 7b 0a 20    int iCell.){. 
4bf0: 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 4e   assert( iCell<N
4c00: 43 45 4c 4c 28 70 4e 6f 64 65 29 20 29 3b 0a 20  CELL(pNode) );. 
4c10: 20 72 65 74 75 72 6e 20 72 65 61 64 49 6e 74 36   return readInt6
4c20: 34 28 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b  4(&pNode->zData[
4c30: 34 20 2b 20 70 52 74 72 65 65 2d 3e 6e 42 79 74  4 + pRtree->nByt
4c40: 65 73 50 65 72 43 65 6c 6c 2a 69 43 65 6c 6c 5d  esPerCell*iCell]
4c50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
4c60: 72 6e 20 63 6f 6f 72 64 69 6e 61 74 65 20 69 43  rn coordinate iC
4c70: 6f 6f 72 64 20 66 72 6f 6d 20 63 65 6c 6c 20 69  oord from cell i
4c80: 43 65 6c 6c 20 69 6e 20 6e 6f 64 65 20 70 4e 6f  Cell in node pNo
4c90: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
4ca0: 69 64 20 6e 6f 64 65 47 65 74 43 6f 6f 72 64 28  id nodeGetCoord(
4cb0: 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
4cc0: 2c 20 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  , .  RtreeNode *
4cd0: 70 4e 6f 64 65 2c 20 0a 20 20 69 6e 74 20 69 43  pNode, .  int iC
4ce0: 65 6c 6c 2c 0a 20 20 69 6e 74 20 69 43 6f 6f 72  ell,.  int iCoor
4cf0: 64 2c 0a 20 20 52 74 72 65 65 43 6f 6f 72 64 20  d,.  RtreeCoord 
4d00: 2a 70 43 6f 6f 72 64 20 20 20 20 20 20 20 20 20  *pCoord         
4d10: 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 77 72    /* Space to wr
4d20: 69 74 65 20 72 65 73 75 6c 74 20 74 6f 20 2a 2f  ite result to */
4d30: 0a 29 7b 0a 20 20 72 65 61 64 43 6f 6f 72 64 28  .){.  readCoord(
4d40: 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b 31 32  &pNode->zData[12
4d50: 20 2b 20 70 52 74 72 65 65 2d 3e 6e 42 79 74 65   + pRtree->nByte
4d60: 73 50 65 72 43 65 6c 6c 2a 69 43 65 6c 6c 20 2b  sPerCell*iCell +
4d70: 20 34 2a 69 43 6f 6f 72 64 5d 2c 20 70 43 6f 6f   4*iCoord], pCoo
4d80: 72 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  rd);.}../*.** De
4d90: 73 65 72 69 61 6c 69 7a 65 20 63 65 6c 6c 20 69  serialize cell i
4da0: 43 65 6c 6c 20 6f 66 20 6e 6f 64 65 20 70 4e 6f  Cell of node pNo
4db0: 64 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  de. Populate the
4dc0: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
4dd0: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 43 65 6c  ed.** to by pCel
4de0: 6c 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  l with the resul
4df0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
4e00: 69 64 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 0a  id nodeGetCell(.
4e10: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
4e20: 20 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70   .  RtreeNode *p
4e30: 4e 6f 64 65 2c 20 0a 20 20 69 6e 74 20 69 43 65  Node, .  int iCe
4e40: 6c 6c 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  ll,.  RtreeCell 
4e50: 2a 70 43 65 6c 6c 0a 29 7b 0a 20 20 69 6e 74 20  *pCell.){.  int 
4e60: 69 69 3b 0a 20 20 70 43 65 6c 6c 2d 3e 69 52 6f  ii;.  pCell->iRo
4e70: 77 69 64 20 3d 20 6e 6f 64 65 47 65 74 52 6f 77  wid = nodeGetRow
4e80: 69 64 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  id(pRtree, pNode
4e90: 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28  , iCell);.  for(
4ea0: 69 69 3d 30 3b 20 69 69 3c 70 52 74 72 65 65 2d  ii=0; ii<pRtree-
4eb0: 3e 6e 44 69 6d 2a 32 3b 20 69 69 2b 2b 29 7b 0a  >nDim*2; ii++){.
4ec0: 20 20 20 20 6e 6f 64 65 47 65 74 43 6f 6f 72 64      nodeGetCoord
4ed0: 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
4ee0: 69 43 65 6c 6c 2c 20 69 69 2c 20 26 70 43 65 6c  iCell, ii, &pCel
4ef0: 6c 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 29 3b 0a  l->aCoord[ii]);.
4f00: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 46 6f 72 77 61    }.}.../* Forwa
4f10: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 66  rd declaration f
4f20: 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  or the function 
4f30: 74 68 61 74 20 64 6f 65 73 20 74 68 65 20 77 6f  that does the wo
4f40: 72 6b 20 6f 66 0a 2a 2a 20 74 68 65 20 76 69 72  rk of.** the vir
4f50: 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
4f60: 65 20 78 43 72 65 61 74 65 28 29 20 61 6e 64 20  e xCreate() and 
4f70: 78 43 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f  xConnect() metho
4f80: 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ds..*/.static in
4f90: 74 20 72 74 72 65 65 49 6e 69 74 28 0a 20 20 73  t rtreeInit(.  s
4fa0: 71 6c 69 74 65 33 20 2a 2c 20 76 6f 69 64 20 2a  qlite3 *, void *
4fb0: 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61  , int, const cha
4fc0: 72 20 2a 63 6f 6e 73 74 2a 2c 20 73 71 6c 69 74  r *const*, sqlit
4fd0: 65 33 5f 76 74 61 62 20 2a 2a 2c 20 63 68 61 72  e3_vtab **, char
4fe0: 20 2a 2a 2c 20 69 6e 74 0a 29 3b 0a 0a 2f 2a 20   **, int.);../* 
4ff0: 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75 61  .** Rtree virtua
5000: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
5010: 43 72 65 61 74 65 20 6d 65 74 68 6f 64 2e 0a 2a  Create method..*
5020: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
5030: 65 65 43 72 65 61 74 65 28 0a 20 20 73 71 6c 69  eeCreate(.  sqli
5040: 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
5050: 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67  *pAux,.  int arg
5060: 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  c, const char *c
5070: 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c  onst*argv,.  sql
5080: 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74  ite3_vtab **ppVt
5090: 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  ab,.  char **pzE
50a0: 72 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 72  rr.){.  return r
50b0: 74 72 65 65 49 6e 69 74 28 64 62 2c 20 70 41 75  treeInit(db, pAu
50c0: 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 70  x, argc, argv, p
50d0: 70 56 74 61 62 2c 20 70 7a 45 72 72 2c 20 31 29  pVtab, pzErr, 1)
50e0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65  ;.}../* .** Rtre
50f0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
5100: 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e 65 63 74 20  module xConnect 
5110: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
5120: 63 20 69 6e 74 20 72 74 72 65 65 43 6f 6e 6e 65  c int rtreeConne
5130: 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
5140: 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  b,.  void *pAux,
5150: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  .  int argc, con
5160: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
5170: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgv,.  sqlite3_v
5180: 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20  tab **ppVtab,.  
5190: 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
51a0: 20 20 72 65 74 75 72 6e 20 72 74 72 65 65 49 6e    return rtreeIn
51b0: 69 74 28 64 62 2c 20 70 41 75 78 2c 20 61 72 67  it(db, pAux, arg
51c0: 63 2c 20 61 72 67 76 2c 20 70 70 56 74 61 62 2c  c, argv, ppVtab,
51d0: 20 70 7a 45 72 72 2c 20 30 29 3b 0a 7d 0a 0a 2f   pzErr, 0);.}../
51e0: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
51f0: 68 65 20 72 2d 74 72 65 65 20 72 65 66 65 72 65  he r-tree refere
5200: 6e 63 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 73 74  nce count..*/.st
5210: 61 74 69 63 20 76 6f 69 64 20 72 74 72 65 65 52  atic void rtreeR
5220: 65 66 65 72 65 6e 63 65 28 52 74 72 65 65 20 2a  eference(Rtree *
5230: 70 52 74 72 65 65 29 7b 0a 20 20 70 52 74 72 65  pRtree){.  pRtre
5240: 65 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 7d 0a 0a 2f  e->nBusy++;.}../
5250: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
5260: 68 65 20 72 2d 74 72 65 65 20 72 65 66 65 72 65  he r-tree refere
5270: 6e 63 65 20 63 6f 75 6e 74 2e 20 57 68 65 6e 20  nce count. When 
5280: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
5290: 75 6e 74 20 72 65 61 63 68 65 73 0a 2a 2a 20 7a  unt reaches.** z
52a0: 65 72 6f 20 74 68 65 20 73 74 72 75 63 74 75 72  ero the structur
52b0: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  e is deleted..*/
52c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 74 72  .static void rtr
52d0: 65 65 52 65 6c 65 61 73 65 28 52 74 72 65 65 20  eeRelease(Rtree 
52e0: 2a 70 52 74 72 65 65 29 7b 0a 20 20 70 52 74 72  *pRtree){.  pRtr
52f0: 65 65 2d 3e 6e 42 75 73 79 2d 2d 3b 0a 20 20 69  ee->nBusy--;.  i
5300: 66 28 20 70 52 74 72 65 65 2d 3e 6e 42 75 73 79  f( pRtree->nBusy
5310: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
5320: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74 72  e3_finalize(pRtr
5330: 65 65 2d 3e 70 52 65 61 64 4e 6f 64 65 29 3b 0a  ee->pReadNode);.
5340: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
5350: 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 57 72  lize(pRtree->pWr
5360: 69 74 65 4e 6f 64 65 29 3b 0a 20 20 20 20 73 71  iteNode);.    sq
5370: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
5380: 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 4e 6f  Rtree->pDeleteNo
5390: 64 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  de);.    sqlite3
53a0: 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65  _finalize(pRtree
53b0: 2d 3e 70 52 65 61 64 52 6f 77 69 64 29 3b 0a 20  ->pReadRowid);. 
53c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
53d0: 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 57 72 69  ize(pRtree->pWri
53e0: 74 65 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71  teRowid);.    sq
53f0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
5400: 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 52 6f  Rtree->pDeleteRo
5410: 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wid);.    sqlite
5420: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65  3_finalize(pRtre
5430: 65 2d 3e 70 52 65 61 64 50 61 72 65 6e 74 29 3b  e->pReadParent);
5440: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
5450: 61 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 57  alize(pRtree->pW
5460: 72 69 74 65 50 61 72 65 6e 74 29 3b 0a 20 20 20  riteParent);.   
5470: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
5480: 65 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74  e(pRtree->pDelet
5490: 65 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71  eParent);.    sq
54a0: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 74 72 65  lite3_free(pRtre
54b0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a  e);.  }.}../* .*
54c0: 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c 20  * Rtree virtual 
54d0: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 44 69  table module xDi
54e0: 73 63 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e  sconnect method.
54f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5500: 74 72 65 65 44 69 73 63 6f 6e 6e 65 63 74 28 73  treeDisconnect(s
5510: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
5520: 61 62 29 7b 0a 20 20 72 74 72 65 65 52 65 6c 65  ab){.  rtreeRele
5530: 61 73 65 28 28 52 74 72 65 65 20 2a 29 70 56 74  ase((Rtree *)pVt
5540: 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ab);.  return SQ
5550: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a  LITE_OK;.}../* .
5560: 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c  ** Rtree virtual
5570: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 44   table module xD
5580: 65 73 74 72 6f 79 20 6d 65 74 68 6f 64 2e 0a 2a  estroy method..*
5590: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
55a0: 65 65 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65  eeDestroy(sqlite
55b0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
55c0: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 20    Rtree *pRtree 
55d0: 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74 61 62  = (Rtree *)pVtab
55e0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
55f0: 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71  ar *zCreate = sq
5600: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
5610: 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 27     "DROP TABLE '
5620: 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27 3b 22 0a  %q'.'%q_node';".
5630: 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20      "DROP TABLE 
5640: 27 25 71 27 2e 27 25 71 5f 72 6f 77 69 64 27 3b  '%q'.'%q_rowid';
5650: 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c  ".    "DROP TABL
5660: 45 20 27 25 71 27 2e 27 25 71 5f 70 61 72 65 6e  E '%q'.'%q_paren
5670: 74 27 3b 22 2c 0a 20 20 20 20 70 52 74 72 65 65  t';",.    pRtree
5680: 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d 3e 7a  ->zDb, pRtree->z
5690: 4e 61 6d 65 2c 20 0a 20 20 20 20 70 52 74 72 65  Name, .    pRtre
56a0: 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d 3e  e->zDb, pRtree->
56b0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 70 52 74 72 65  zName,.    pRtre
56c0: 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d 3e  e->zDb, pRtree->
56d0: 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 69 66 28  zName.  );.  if(
56e0: 20 21 7a 43 72 65 61 74 65 20 29 7b 0a 20 20 20   !zCreate ){.   
56f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
5700: 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
5710: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
5720: 65 63 28 70 52 74 72 65 65 2d 3e 64 62 2c 20 7a  ec(pRtree->db, z
5730: 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29  Create, 0, 0, 0)
5740: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
5750: 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d  ee(zCreate);.  }
5760: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5770: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 74 72 65  E_OK ){.    rtre
5780: 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 29  eRelease(pRtree)
5790: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
57a0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74  rc;.}../* .** Rt
57b0: 72 65 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ree virtual tabl
57c0: 65 20 6d 6f 64 75 6c 65 20 78 4f 70 65 6e 20 6d  e module xOpen m
57d0: 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
57e0: 20 69 6e 74 20 72 74 72 65 65 4f 70 65 6e 28 73   int rtreeOpen(s
57f0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
5800: 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ab, sqlite3_vtab
5810: 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73  _cursor **ppCurs
5820: 6f 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  or){.  int rc = 
5830: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5840: 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73  RtreeCursor *pCs
5850: 72 3b 0a 0a 20 20 70 43 73 72 20 3d 20 28 52 74  r;..  pCsr = (Rt
5860: 72 65 65 43 75 72 73 6f 72 20 2a 29 73 71 6c 69  reeCursor *)sqli
5870: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
5880: 66 28 52 74 72 65 65 43 75 72 73 6f 72 29 29 3b  f(RtreeCursor));
5890: 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20  .  if( pCsr ){. 
58a0: 20 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20     memset(pCsr, 
58b0: 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43  0, sizeof(RtreeC
58c0: 75 72 73 6f 72 29 29 3b 0a 20 20 20 20 70 43 73  ursor));.    pCs
58d0: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20  r->base.pVtab = 
58e0: 70 56 54 61 62 3b 0a 20 20 20 20 72 63 20 3d 20  pVTab;.    rc = 
58f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
5900: 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 28 73 71   *ppCursor = (sq
5910: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
5920: 72 20 2a 29 70 43 73 72 3b 0a 0a 20 20 72 65 74  r *)pCsr;..  ret
5930: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
5940: 2a 20 46 72 65 65 20 74 68 65 20 52 74 72 65 65  * Free the Rtree
5950: 43 75 72 73 6f 72 2e 61 43 6f 6e 73 74 72 61 69  Cursor.aConstrai
5960: 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 69  nt[] array and i
5970: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2f 0a  ts contents..*/.
5980: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
5990: 43 75 72 73 6f 72 43 6f 6e 73 74 72 61 69 6e 74  CursorConstraint
59a0: 73 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70  s(RtreeCursor *p
59b0: 43 73 72 29 7b 0a 20 20 69 66 28 20 70 43 73 72  Csr){.  if( pCsr
59c0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  ->aConstraint ){
59d0: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
5a00: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63 6f  erate through co
5a10: 6e 73 74 72 61 69 6e 74 20 61 72 72 61 79 20 2a  nstraint array *
5a20: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
5a30: 3c 70 43 73 72 2d 3e 6e 43 6f 6e 73 74 72 61 69  <pCsr->nConstrai
5a40: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
5a50: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
5a60: 6f 6d 65 74 72 79 20 2a 70 47 65 6f 6d 20 3d 20  ometry *pGeom = 
5a70: 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  pCsr->aConstrain
5a80: 74 5b 69 5d 2e 70 47 65 6f 6d 3b 0a 20 20 20 20  t[i].pGeom;.    
5a90: 20 20 69 66 28 20 70 47 65 6f 6d 20 29 7b 0a 20    if( pGeom ){. 
5aa0: 20 20 20 20 20 20 20 69 66 28 20 70 47 65 6f 6d         if( pGeom
5ab0: 2d 3e 78 44 65 6c 55 73 65 72 20 29 20 70 47 65  ->xDelUser ) pGe
5ac0: 6f 6d 2d 3e 78 44 65 6c 55 73 65 72 28 70 47 65  om->xDelUser(pGe
5ad0: 6f 6d 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20  om->pUser);.    
5ae0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
5af0: 28 70 47 65 6f 6d 29 3b 0a 20 20 20 20 20 20 7d  (pGeom);.      }
5b00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5b10: 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 43  e3_free(pCsr->aC
5b20: 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
5b30: 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  pCsr->aConstrain
5b40: 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 0;.  }.}../*
5b50: 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75   .** Rtree virtu
5b60: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
5b70: 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 2e 0a 2a  xClose method..*
5b80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
5b90: 65 65 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  eeClose(sqlite3_
5ba0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
5bb0: 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  ){.  Rtree *pRtr
5bc0: 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 28 63  ee = (Rtree *)(c
5bd0: 75 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 6e  ur->pVtab);.  in
5be0: 74 20 72 63 3b 0a 20 20 52 74 72 65 65 43 75 72  t rc;.  RtreeCur
5bf0: 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 52 74 72  sor *pCsr = (Rtr
5c00: 65 65 43 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a  eeCursor *)cur;.
5c10: 20 20 66 72 65 65 43 75 72 73 6f 72 43 6f 6e 73    freeCursorCons
5c20: 74 72 61 69 6e 74 73 28 70 43 73 72 29 3b 0a 20  traints(pCsr);. 
5c30: 20 72 63 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73   rc = nodeReleas
5c40: 65 28 70 52 74 72 65 65 2c 20 70 43 73 72 2d 3e  e(pRtree, pCsr->
5c50: 70 4e 6f 64 65 29 3b 0a 20 20 73 71 6c 69 74 65  pNode);.  sqlite
5c60: 33 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20 20  3_free(pCsr);.  
5c70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5c80: 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75 61  .** Rtree virtua
5c90: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
5ca0: 45 6f 66 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  Eof method..**.*
5cb0: 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
5cc0: 6f 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  o if the cursor 
5cd0: 64 6f 65 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  does not current
5ce0: 6c 79 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61  ly point to a va
5cf0: 6c 69 64 20 0a 2a 2a 20 72 65 63 6f 72 64 20 28  lid .** record (
5d00: 69 2e 65 20 69 66 20 74 68 65 20 73 63 61 6e 20  i.e if the scan 
5d10: 68 61 73 20 66 69 6e 69 73 68 65 64 29 2c 20 6f  has finished), o
5d20: 72 20 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65  r zero otherwise
5d30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5d40: 72 74 72 65 65 45 6f 66 28 73 71 6c 69 74 65 33  rtreeEof(sqlite3
5d50: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
5d60: 72 29 7b 0a 20 20 52 74 72 65 65 43 75 72 73 6f  r){.  RtreeCurso
5d70: 72 20 2a 70 43 73 72 20 3d 20 28 52 74 72 65 65  r *pCsr = (Rtree
5d80: 43 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20  Cursor *)cur;.  
5d90: 72 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 70 4e  return (pCsr->pN
5da0: 6f 64 65 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ode==0);.}../*.*
5db0: 2a 20 54 68 65 20 72 2d 74 72 65 65 20 63 6f 6e  * The r-tree con
5dc0: 73 74 72 61 69 6e 74 20 70 61 73 73 65 64 20 61  straint passed a
5dd0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
5de0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
5df0: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 67 75 61  nction is.** gua
5e00: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
5e10: 4d 41 54 43 48 20 63 6f 6e 73 74 72 61 69 6e 74  MATCH constraint
5e20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5e30: 74 65 73 74 52 74 72 65 65 47 65 6f 6d 28 0a 20  testRtreeGeom(. 
5e40: 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20   Rtree *pRtree, 
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 2f 2a 20 52 2d 54 72 65 65 20 6f 62 6a 65 63   /* R-Tree objec
5e70: 74 20 2a 2f 0a 20 20 52 74 72 65 65 43 6f 6e 73  t */.  RtreeCons
5e80: 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61  traint *pConstra
5e90: 69 6e 74 2c 20 20 20 2f 2a 20 4d 41 54 43 48 20  int,   /* MATCH 
5ea0: 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 65  constraint to te
5eb0: 73 74 20 2a 2f 0a 20 20 52 74 72 65 65 43 65 6c  st */.  RtreeCel
5ec0: 6c 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  l *pCell,       
5ed0: 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
5ee0: 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74  to test */.  int
5ef0: 20 2a 70 62 52 65 73 20 20 20 20 20 20 20 20 20   *pbRes         
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f10: 4f 55 54 3a 20 54 65 73 74 20 72 65 73 75 6c 74  OUT: Test result
5f20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
5f30: 20 20 64 6f 75 62 6c 65 20 61 43 6f 6f 72 64 5b    double aCoord[
5f40: 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53  RTREE_MAX_DIMENS
5f50: 49 4f 4e 53 2a 32 5d 3b 0a 20 20 69 6e 74 20 6e  IONS*2];.  int n
5f60: 43 6f 6f 72 64 20 3d 20 70 52 74 72 65 65 2d 3e  Coord = pRtree->
5f70: 6e 44 69 6d 2a 32 3b 0a 0a 20 20 61 73 73 65 72  nDim*2;..  asser
5f80: 74 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  t( pConstraint->
5f90: 6f 70 3d 3d 52 54 52 45 45 5f 4d 41 54 43 48 20  op==RTREE_MATCH 
5fa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  );.  assert( pCo
5fb0: 6e 73 74 72 61 69 6e 74 2d 3e 70 47 65 6f 6d 20  nstraint->pGeom 
5fc0: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
5fd0: 3c 6e 43 6f 6f 72 64 3b 20 69 2b 2b 29 7b 0a 20  <nCoord; i++){. 
5fe0: 20 20 20 61 43 6f 6f 72 64 5b 69 5d 20 3d 20 44     aCoord[i] = D
5ff0: 43 4f 4f 52 44 28 70 43 65 6c 6c 2d 3e 61 43 6f  COORD(pCell->aCo
6000: 6f 72 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  ord[i]);.  }.  r
6010: 65 74 75 72 6e 20 70 43 6f 6e 73 74 72 61 69 6e  eturn pConstrain
6020: 74 2d 3e 78 47 65 6f 6d 28 70 43 6f 6e 73 74 72  t->xGeom(pConstr
6030: 61 69 6e 74 2d 3e 70 47 65 6f 6d 2c 20 6e 43 6f  aint->pGeom, nCo
6040: 6f 72 64 2c 20 61 43 6f 6f 72 64 2c 20 70 62 52  ord, aCoord, pbR
6050: 65 73 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43  es);.}../* .** C
6060: 75 72 73 6f 72 20 70 43 75 72 73 6f 72 20 63 75  ursor pCursor cu
6070: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
6080: 6f 20 61 20 63 65 6c 6c 20 69 6e 20 61 20 6e 6f  o a cell in a no
6090: 6e 2d 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 20  n-leaf page..** 
60a0: 53 65 74 20 2a 70 62 45 6f 66 20 74 6f 20 74 72  Set *pbEof to tr
60b0: 75 65 20 69 66 20 74 68 65 20 73 75 62 2d 74 72  ue if the sub-tr
60c0: 65 65 20 68 65 61 64 65 64 20 62 79 20 74 68 65  ee headed by the
60d0: 20 63 65 6c 6c 20 69 73 20 66 69 6c 74 65 72 65   cell is filtere
60e0: 64 0a 2a 2a 20 28 65 78 63 6c 75 64 65 64 29 20  d.** (excluded) 
60f0: 62 79 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  by the constrain
6100: 74 73 20 69 6e 20 74 68 65 20 70 43 75 72 73 6f  ts in the pCurso
6110: 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  r->aConstraint[]
6120: 20 0a 2a 2a 20 61 72 72 61 79 2c 20 6f 72 20 66   .** array, or f
6130: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
6140: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
6150: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
6160: 73 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74  sful or an SQLit
6170: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
6180: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
6190: 72 73 20 77 69 74 68 69 6e 20 61 20 67 65 6f 6d  rs within a geom
61a0: 65 74 72 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  etry callback..*
61b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
61c0: 74 52 74 72 65 65 43 65 6c 6c 28 52 74 72 65 65  tRtreeCell(Rtree
61d0: 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 43   *pRtree, RtreeC
61e0: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20  ursor *pCursor, 
61f0: 69 6e 74 20 2a 70 62 45 6f 66 29 7b 0a 20 20 52  int *pbEof){.  R
6200: 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20  treeCell cell;. 
6210: 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 62   int ii;.  int b
6220: 52 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Res = 0;.  int r
6230: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
6240: 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70 52    nodeGetCell(pR
6250: 74 72 65 65 2c 20 70 43 75 72 73 6f 72 2d 3e 70  tree, pCursor->p
6260: 4e 6f 64 65 2c 20 70 43 75 72 73 6f 72 2d 3e 69  Node, pCursor->i
6270: 43 65 6c 6c 2c 20 26 63 65 6c 6c 29 3b 0a 20 20  Cell, &cell);.  
6280: 66 6f 72 28 69 69 3d 30 3b 20 62 52 65 73 3d 3d  for(ii=0; bRes==
6290: 30 20 26 26 20 69 69 3c 70 43 75 72 73 6f 72 2d  0 && ii<pCursor-
62a0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 69  >nConstraint; ii
62b0: 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65 43 6f  ++){.    RtreeCo
62c0: 6e 73 74 72 61 69 6e 74 20 2a 70 20 3d 20 26 70  nstraint *p = &p
62d0: 43 75 72 73 6f 72 2d 3e 61 43 6f 6e 73 74 72 61  Cursor->aConstra
62e0: 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 64 6f 75  int[ii];.    dou
62f0: 62 6c 65 20 63 65 6c 6c 5f 6d 69 6e 20 3d 20 44  ble cell_min = D
6300: 43 4f 4f 52 44 28 63 65 6c 6c 2e 61 43 6f 6f 72  COORD(cell.aCoor
6310: 64 5b 28 70 2d 3e 69 43 6f 6f 72 64 3e 3e 31 29  d[(p->iCoord>>1)
6320: 2a 32 5d 29 3b 0a 20 20 20 20 64 6f 75 62 6c 65  *2]);.    double
6330: 20 63 65 6c 6c 5f 6d 61 78 20 3d 20 44 43 4f 4f   cell_max = DCOO
6340: 52 44 28 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 28  RD(cell.aCoord[(
6350: 70 2d 3e 69 43 6f 6f 72 64 3e 3e 31 29 2a 32 2b  p->iCoord>>1)*2+
6360: 31 5d 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  1]);..    assert
6370: 28 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4c 45  (p->op==RTREE_LE
6380: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45   || p->op==RTREE
6390: 5f 4c 54 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54  _LT || p->op==RT
63a0: 52 45 45 5f 47 45 20 0a 20 20 20 20 20 20 20 20  REE_GE .        
63b0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f  || p->op==RTREE_
63c0: 47 54 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52  GT || p->op==RTR
63d0: 45 45 5f 45 51 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  EE_EQ || p->op==
63e0: 52 54 52 45 45 5f 4d 41 54 43 48 0a 20 20 20 20  RTREE_MATCH.    
63f0: 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20  );..    switch( 
6400: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63  p->op ){.      c
6410: 61 73 65 20 52 54 52 45 45 5f 4c 45 3a 20 63 61  ase RTREE_LE: ca
6420: 73 65 20 52 54 52 45 45 5f 4c 54 3a 20 0a 20 20  se RTREE_LT: .  
6430: 20 20 20 20 20 20 62 52 65 73 20 3d 20 70 2d 3e        bRes = p->
6440: 72 56 61 6c 75 65 3c 63 65 6c 6c 5f 6d 69 6e 3b  rValue<cell_min;
6450: 20 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b   .        break;
6460: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 54 52  ..      case RTR
6470: 45 45 5f 47 45 3a 20 63 61 73 65 20 52 54 52 45  EE_GE: case RTRE
6480: 45 5f 47 54 3a 20 0a 20 20 20 20 20 20 20 20 62  E_GT: .        b
6490: 52 65 73 20 3d 20 70 2d 3e 72 56 61 6c 75 65 3e  Res = p->rValue>
64a0: 63 65 6c 6c 5f 6d 61 78 3b 20 0a 20 20 20 20 20  cell_max; .     
64b0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
64c0: 20 63 61 73 65 20 52 54 52 45 45 5f 45 51 3a 0a   case RTREE_EQ:.
64d0: 20 20 20 20 20 20 20 20 62 52 65 73 20 3d 20 28          bRes = (
64e0: 70 2d 3e 72 56 61 6c 75 65 3e 63 65 6c 6c 5f 6d  p->rValue>cell_m
64f0: 61 78 20 7c 7c 20 70 2d 3e 72 56 61 6c 75 65 3c  ax || p->rValue<
6500: 63 65 6c 6c 5f 6d 69 6e 29 3b 0a 20 20 20 20 20  cell_min);.     
6510: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
6520: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6530: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
6540: 70 3d 3d 52 54 52 45 45 5f 4d 41 54 43 48 20 29  p==RTREE_MATCH )
6550: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 74  ;.        rc = t
6560: 65 73 74 52 74 72 65 65 47 65 6f 6d 28 70 52 74  estRtreeGeom(pRt
6570: 72 65 65 2c 20 70 2c 20 26 63 65 6c 6c 2c 20 26  ree, p, &cell, &
6580: 62 52 65 73 29 3b 0a 20 20 20 20 20 20 20 20 62  bRes);.        b
6590: 52 65 73 20 3d 20 21 62 52 65 73 3b 0a 20 20 20  Res = !bRes;.   
65a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
65b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
65c0: 20 2a 70 62 45 6f 66 20 3d 20 62 52 65 73 3b 0a   *pbEof = bRes;.
65d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
65e0: 2f 2a 20 0a 2a 2a 20 54 65 73 74 20 69 66 20 74  /* .** Test if t
65f0: 68 65 20 63 65 6c 6c 20 74 68 61 74 20 63 75 72  he cell that cur
6600: 73 6f 72 20 70 43 75 72 73 6f 72 20 63 75 72 72  sor pCursor curr
6610: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 0a  ently points to.
6620: 2a 2a 20 77 6f 75 6c 64 20 62 65 20 66 69 6c 74  ** would be filt
6630: 65 72 65 64 20 28 65 78 63 6c 75 64 65 64 29 20  ered (excluded) 
6640: 62 79 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  by the constrain
6650: 74 73 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 43  ts in the .** pC
6660: 75 72 73 6f 72 2d 3e 61 43 6f 6e 73 74 72 61 69  ursor->aConstrai
6670: 6e 74 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 73  nt[] array. If s
6680: 6f 2c 20 73 65 74 20 2a 70 62 45 6f 66 20 74 6f  o, set *pbEof to
6690: 20 74 72 75 65 20 62 65 66 6f 72 65 0a 2a 2a 20   true before.** 
66a0: 72 65 74 75 72 6e 69 6e 67 2e 20 49 66 20 74 68  returning. If th
66b0: 65 20 63 65 6c 6c 20 69 73 20 6e 6f 74 20 66 69  e cell is not fi
66c0: 6c 74 65 72 65 64 20 28 65 78 63 6c 75 64 65 64  ltered (excluded
66d0: 29 20 62 79 20 74 68 65 20 63 6f 6e 73 74 72 61  ) by the constra
66e0: 69 6e 74 73 2c 0a 2a 2a 20 73 65 74 20 70 62 45  ints,.** set pbE
66f0: 6f 66 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  of to zero..**.*
6700: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
6710: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
6720: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
6730: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
6740: 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 20 77  rror.** occurs w
6750: 69 74 68 69 6e 20 61 20 67 65 6f 6d 65 74 72 79  ithin a geometry
6760: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   callback..**.**
6770: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
6780: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
6790: 63 65 6c 6c 20 69 73 20 70 61 72 74 20 6f 66 20  cell is part of 
67a0: 61 20 6c 65 61 66 20 6e 6f 64 65 2e 0a 2a 2f 0a  a leaf node..*/.
67b0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 52  static int testR
67c0: 74 72 65 65 45 6e 74 72 79 28 52 74 72 65 65 20  treeEntry(Rtree 
67d0: 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 43 75  *pRtree, RtreeCu
67e0: 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 69  rsor *pCursor, i
67f0: 6e 74 20 2a 70 62 45 6f 66 29 7b 0a 20 20 52 74  nt *pbEof){.  Rt
6800: 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20  reeCell cell;.  
6810: 69 6e 74 20 69 69 3b 0a 20 20 2a 70 62 45 6f 66  int ii;.  *pbEof
6820: 20 3d 20 30 3b 0a 0a 20 20 6e 6f 64 65 47 65 74   = 0;..  nodeGet
6830: 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 43 75  Cell(pRtree, pCu
6840: 72 73 6f 72 2d 3e 70 4e 6f 64 65 2c 20 70 43 75  rsor->pNode, pCu
6850: 72 73 6f 72 2d 3e 69 43 65 6c 6c 2c 20 26 63 65  rsor->iCell, &ce
6860: 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  ll);.  for(ii=0;
6870: 20 69 69 3c 70 43 75 72 73 6f 72 2d 3e 6e 43 6f   ii<pCursor->nCo
6880: 6e 73 74 72 61 69 6e 74 3b 20 69 69 2b 2b 29 7b  nstraint; ii++){
6890: 0a 20 20 20 20 52 74 72 65 65 43 6f 6e 73 74 72  .    RtreeConstr
68a0: 61 69 6e 74 20 2a 70 20 3d 20 26 70 43 75 72 73  aint *p = &pCurs
68b0: 6f 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  or->aConstraint[
68c0: 69 69 5d 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ii];.    double 
68d0: 63 6f 6f 72 64 20 3d 20 44 43 4f 4f 52 44 28 63  coord = DCOORD(c
68e0: 65 6c 6c 2e 61 43 6f 6f 72 64 5b 70 2d 3e 69 43  ell.aCoord[p->iC
68f0: 6f 6f 72 64 5d 29 3b 0a 20 20 20 20 69 6e 74 20  oord]);.    int 
6900: 72 65 73 3b 0a 20 20 20 20 61 73 73 65 72 74 28  res;.    assert(
6910: 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4c 45 20  p->op==RTREE_LE 
6920: 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f  || p->op==RTREE_
6930: 4c 54 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52  LT || p->op==RTR
6940: 45 45 5f 47 45 20 0a 20 20 20 20 20 20 20 20 7c  EE_GE .        |
6950: 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 47  | p->op==RTREE_G
6960: 54 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45  T || p->op==RTRE
6970: 45 5f 45 51 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52  E_EQ || p->op==R
6980: 54 52 45 45 5f 4d 41 54 43 48 0a 20 20 20 20 29  TREE_MATCH.    )
6990: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 2d  ;.    switch( p-
69a0: 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61 73  >op ){.      cas
69b0: 65 20 52 54 52 45 45 5f 4c 45 3a 20 72 65 73 20  e RTREE_LE: res 
69c0: 3d 20 28 63 6f 6f 72 64 3c 3d 70 2d 3e 72 56 61  = (coord<=p->rVa
69d0: 6c 75 65 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20  lue); break;.   
69e0: 20 20 20 63 61 73 65 20 52 54 52 45 45 5f 4c 54     case RTREE_LT
69f0: 3a 20 72 65 73 20 3d 20 28 63 6f 6f 72 64 3c 70  : res = (coord<p
6a00: 2d 3e 72 56 61 6c 75 65 29 3b 20 20 62 72 65 61  ->rValue);  brea
6a10: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 52 54  k;.      case RT
6a20: 52 45 45 5f 47 45 3a 20 72 65 73 20 3d 20 28 63  REE_GE: res = (c
6a30: 6f 6f 72 64 3e 3d 70 2d 3e 72 56 61 6c 75 65 29  oord>=p->rValue)
6a40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
6a50: 61 73 65 20 52 54 52 45 45 5f 47 54 3a 20 72 65  ase RTREE_GT: re
6a60: 73 20 3d 20 28 63 6f 6f 72 64 3e 70 2d 3e 72 56  s = (coord>p->rV
6a70: 61 6c 75 65 29 3b 20 20 62 72 65 61 6b 3b 0a 20  alue);  break;. 
6a80: 20 20 20 20 20 63 61 73 65 20 52 54 52 45 45 5f       case RTREE_
6a90: 45 51 3a 20 72 65 73 20 3d 20 28 63 6f 6f 72 64  EQ: res = (coord
6aa0: 3d 3d 70 2d 3e 72 56 61 6c 75 65 29 3b 20 62 72  ==p->rValue); br
6ab0: 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75  eak;.      defau
6ac0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  lt: {.        in
6ad0: 74 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73  t rc;.        as
6ae0: 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 52 54 52  sert( p->op==RTR
6af0: 45 45 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  EE_MATCH );.    
6b00: 20 20 20 20 72 63 20 3d 20 74 65 73 74 52 74 72      rc = testRtr
6b10: 65 65 47 65 6f 6d 28 70 52 74 72 65 65 2c 20 70  eeGeom(pRtree, p
6b20: 2c 20 26 63 65 6c 6c 2c 20 26 72 65 73 29 3b 0a  , &cell, &res);.
6b30: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
6b40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6b50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
6b60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6b70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6b80: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
6b90: 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20  ( !res ){.      
6ba0: 2a 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  *pbEof = 1;.    
6bb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6bc0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
6bd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6be0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 73  K;.}../*.** Curs
6bf0: 6f 72 20 70 43 75 72 73 6f 72 20 63 75 72 72 65  or pCursor curre
6c00: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 61 74 20 61  ntly points at a
6c10: 20 6e 6f 64 65 20 74 68 61 74 20 68 65 61 64 73   node that heads
6c20: 20 61 20 73 75 62 2d 74 72 65 65 20 6f 66 0a 2a   a sub-tree of.*
6c30: 2a 20 68 65 69 67 68 74 20 69 48 65 69 67 68 74  * height iHeight
6c40: 20 28 69 66 20 69 48 65 69 67 68 74 3d 3d 30 2c   (if iHeight==0,
6c50: 20 74 68 65 6e 20 74 68 65 20 6e 6f 64 65 20 69   then the node i
6c60: 73 20 61 20 6c 65 61 66 29 2e 20 44 65 73 63 65  s a leaf). Desce
6c70: 6e 64 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74  nd.** to point t
6c80: 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
6c90: 63 65 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 2d  cell of the sub-
6ca0: 74 72 65 65 20 74 68 61 74 20 6d 61 74 63 68 65  tree that matche
6cb0: 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 66 69 67  s the .** config
6cc0: 75 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  ured constraints
6cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6ce0: 64 65 73 63 65 6e 64 54 6f 43 65 6c 6c 28 0a 20  descendToCell(. 
6cf0: 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20   Rtree *pRtree, 
6d00: 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a  .  RtreeCursor *
6d10: 70 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20  pCursor, .  int 
6d20: 69 48 65 69 67 68 74 2c 0a 20 20 69 6e 74 20 2a  iHeight,.  int *
6d30: 70 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20  pEof            
6d40: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
6d50: 20 74 6f 20 74 72 75 65 20 69 66 20 63 61 6e 6e   to true if cann
6d60: 6f 74 20 64 65 73 63 65 6e 64 20 2a 2f 0a 29 7b  ot descend */.){
6d70: 0a 20 20 69 6e 74 20 69 73 45 6f 66 3b 0a 20 20  .  int isEof;.  
6d80: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 69  int rc;.  int ii
6d90: 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70  ;.  RtreeNode *p
6da0: 43 68 69 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  Child;.  sqlite3
6db0: 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 3b 0a 0a  _int64 iRowid;..
6dc0: 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 53 61    RtreeNode *pSa
6dd0: 76 65 64 4e 6f 64 65 20 3d 20 70 43 75 72 73 6f  vedNode = pCurso
6de0: 72 2d 3e 70 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  r->pNode;.  int 
6df0: 69 53 61 76 65 64 43 65 6c 6c 20 3d 20 70 43 75  iSavedCell = pCu
6e00: 72 73 6f 72 2d 3e 69 43 65 6c 6c 3b 0a 0a 20 20  rsor->iCell;..  
6e10: 61 73 73 65 72 74 28 20 69 48 65 69 67 68 74 3e  assert( iHeight>
6e20: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 48 65  =0 );..  if( iHe
6e30: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
6e40: 63 20 3d 20 74 65 73 74 52 74 72 65 65 45 6e 74  c = testRtreeEnt
6e50: 72 79 28 70 52 74 72 65 65 2c 20 70 43 75 72 73  ry(pRtree, pCurs
6e60: 6f 72 2c 20 26 69 73 45 6f 66 29 3b 0a 20 20 7d  or, &isEof);.  }
6e70: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 74  else{.    rc = t
6e80: 65 73 74 52 74 72 65 65 43 65 6c 6c 28 70 52 74  estRtreeCell(pRt
6e90: 72 65 65 2c 20 70 43 75 72 73 6f 72 2c 20 26 69  ree, pCursor, &i
6ea0: 73 45 6f 66 29 3b 0a 20 20 7d 0a 20 20 69 66 28  sEof);.  }.  if(
6eb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
6ec0: 7c 20 69 73 45 6f 66 20 7c 7c 20 69 48 65 69 67  | isEof || iHeig
6ed0: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  ht==0 ){.    got
6ee0: 6f 20 64 65 73 63 65 6e 64 5f 74 6f 5f 63 65 6c  o descend_to_cel
6ef0: 6c 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 69 52  l_out;.  }..  iR
6f00: 6f 77 69 64 20 3d 20 6e 6f 64 65 47 65 74 52 6f  owid = nodeGetRo
6f10: 77 69 64 28 70 52 74 72 65 65 2c 20 70 43 75 72  wid(pRtree, pCur
6f20: 73 6f 72 2d 3e 70 4e 6f 64 65 2c 20 70 43 75 72  sor->pNode, pCur
6f30: 73 6f 72 2d 3e 69 43 65 6c 6c 29 3b 0a 20 20 72  sor->iCell);.  r
6f40: 63 20 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28  c = nodeAcquire(
6f50: 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64 2c 20  pRtree, iRowid, 
6f60: 70 43 75 72 73 6f 72 2d 3e 70 4e 6f 64 65 2c 20  pCursor->pNode, 
6f70: 26 70 43 68 69 6c 64 29 3b 0a 20 20 69 66 28 20  &pChild);.  if( 
6f80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6f90: 0a 20 20 20 20 67 6f 74 6f 20 64 65 73 63 65 6e  .    goto descen
6fa0: 64 5f 74 6f 5f 63 65 6c 6c 5f 6f 75 74 3b 0a 20  d_to_cell_out;. 
6fb0: 20 7d 0a 0a 20 20 6e 6f 64 65 52 65 6c 65 61 73   }..  nodeReleas
6fc0: 65 28 70 52 74 72 65 65 2c 20 70 43 75 72 73 6f  e(pRtree, pCurso
6fd0: 72 2d 3e 70 4e 6f 64 65 29 3b 0a 20 20 70 43 75  r->pNode);.  pCu
6fe0: 72 73 6f 72 2d 3e 70 4e 6f 64 65 20 3d 20 70 43  rsor->pNode = pC
6ff0: 68 69 6c 64 3b 0a 20 20 69 73 45 6f 66 20 3d 20  hild;.  isEof = 
7000: 31 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  1;.  for(ii=0; i
7010: 73 45 6f 66 20 26 26 20 69 69 3c 4e 43 45 4c 4c  sEof && ii<NCELL
7020: 28 70 43 68 69 6c 64 29 3b 20 69 69 2b 2b 29 7b  (pChild); ii++){
7030: 0a 20 20 20 20 70 43 75 72 73 6f 72 2d 3e 69 43  .    pCursor->iC
7040: 65 6c 6c 20 3d 20 69 69 3b 0a 20 20 20 20 72 63  ell = ii;.    rc
7050: 20 3d 20 64 65 73 63 65 6e 64 54 6f 43 65 6c 6c   = descendToCell
7060: 28 70 52 74 72 65 65 2c 20 70 43 75 72 73 6f 72  (pRtree, pCursor
7070: 2c 20 69 48 65 69 67 68 74 2d 31 2c 20 26 69 73  , iHeight-1, &is
7080: 45 6f 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Eof);.    if( rc
7090: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
70a0: 20 20 20 20 20 67 6f 74 6f 20 64 65 73 63 65 6e       goto descen
70b0: 64 5f 74 6f 5f 63 65 6c 6c 5f 6f 75 74 3b 0a 20  d_to_cell_out;. 
70c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
70d0: 69 73 45 6f 66 20 29 7b 0a 20 20 20 20 61 73 73  isEof ){.    ass
70e0: 65 72 74 28 20 70 43 75 72 73 6f 72 2d 3e 70 4e  ert( pCursor->pN
70f0: 6f 64 65 3d 3d 70 43 68 69 6c 64 20 29 3b 0a 20  ode==pChild );. 
7100: 20 20 20 6e 6f 64 65 52 65 66 65 72 65 6e 63 65     nodeReference
7110: 28 70 53 61 76 65 64 4e 6f 64 65 29 3b 0a 20 20  (pSavedNode);.  
7120: 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52    nodeRelease(pR
7130: 74 72 65 65 2c 20 70 43 68 69 6c 64 29 3b 0a 20  tree, pChild);. 
7140: 20 20 20 70 43 75 72 73 6f 72 2d 3e 70 4e 6f 64     pCursor->pNod
7150: 65 20 3d 20 70 53 61 76 65 64 4e 6f 64 65 3b 0a  e = pSavedNode;.
7160: 20 20 20 20 70 43 75 72 73 6f 72 2d 3e 69 43 65      pCursor->iCe
7170: 6c 6c 20 3d 20 69 53 61 76 65 64 43 65 6c 6c 3b  ll = iSavedCell;
7180: 0a 20 20 7d 0a 0a 64 65 73 63 65 6e 64 5f 74 6f  .  }..descend_to
7190: 5f 63 65 6c 6c 5f 6f 75 74 3a 0a 20 20 2a 70 45  _cell_out:.  *pE
71a0: 6f 66 20 3d 20 69 73 45 6f 66 3b 0a 20 20 72 65  of = isEof;.  re
71b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
71c0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  * One of the cel
71d0: 6c 73 20 69 6e 20 6e 6f 64 65 20 70 4e 6f 64 65  ls in node pNode
71e0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
71f0: 6f 20 68 61 76 65 20 61 20 36 34 2d 62 69 74 20  o have a 64-bit 
7200: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75  .** integer valu
7210: 65 20 65 71 75 61 6c 20 74 6f 20 69 52 6f 77 69  e equal to iRowi
7220: 64 2e 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  d. Return the in
7230: 64 65 78 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  dex of this cell
7240: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7250: 6e 6f 64 65 52 6f 77 69 64 49 6e 64 65 78 28 0a  nodeRowidIndex(.
7260: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
7270: 20 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70   .  RtreeNode *p
7280: 4e 6f 64 65 2c 20 0a 20 20 69 36 34 20 69 52 6f  Node, .  i64 iRo
7290: 77 69 64 2c 0a 20 20 69 6e 74 20 2a 70 69 49 6e  wid,.  int *piIn
72a0: 64 65 78 0a 29 7b 0a 20 20 69 6e 74 20 69 69 3b  dex.){.  int ii;
72b0: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e  .  int nCell = N
72c0: 43 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a 20 20 66  CELL(pNode);.  f
72d0: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43 65 6c  or(ii=0; ii<nCel
72e0: 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  l; ii++){.    if
72f0: 28 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 70  ( nodeGetRowid(p
7300: 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69 69  Rtree, pNode, ii
7310: 29 3d 3d 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  )==iRowid ){.   
7320: 20 20 20 2a 70 69 49 6e 64 65 78 20 3d 20 69 69     *piIndex = ii
7330: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
7340: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
7350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7360: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a  ITE_CORRUPT;.}..
7370: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7380: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 65   index of the ce
7390: 6c 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  ll containing a 
73a0: 70 6f 69 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20  pointer to node 
73b0: 70 4e 6f 64 65 0a 2a 2a 20 69 6e 20 69 74 73 20  pNode.** in its 
73c0: 70 61 72 65 6e 74 2e 20 49 66 20 70 4e 6f 64 65  parent. If pNode
73d0: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   is the root nod
73e0: 65 2c 20 72 65 74 75 72 6e 20 2d 31 2e 0a 2a 2f  e, return -1..*/
73f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65  .static int node
7400: 50 61 72 65 6e 74 49 6e 64 65 78 28 52 74 72 65  ParentIndex(Rtre
7410: 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65  e *pRtree, Rtree
7420: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 69 6e 74  Node *pNode, int
7430: 20 2a 70 69 49 6e 64 65 78 29 7b 0a 20 20 52 74   *piIndex){.  Rt
7440: 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74  reeNode *pParent
7450: 20 3d 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e   = pNode->pParen
7460: 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  t;.  if( pParent
7470: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e   ){.    return n
7480: 6f 64 65 52 6f 77 69 64 49 6e 64 65 78 28 70 52  odeRowidIndex(pR
7490: 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  tree, pParent, p
74a0: 4e 6f 64 65 2d 3e 69 4e 6f 64 65 2c 20 70 69 49  Node->iNode, piI
74b0: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 2a 70 69  ndex);.  }.  *pi
74c0: 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 72 65  Index = -1;.  re
74d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
74e0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20  }../* .** Rtree 
74f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
7500: 64 75 6c 65 20 78 4e 65 78 74 20 6d 65 74 68 6f  dule xNext metho
7510: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
7520: 20 72 74 72 65 65 4e 65 78 74 28 73 71 6c 69 74   rtreeNext(sqlit
7530: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
7540: 70 56 74 61 62 43 75 72 73 6f 72 29 7b 0a 20 20  pVtabCursor){.  
7550: 52 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20  Rtree *pRtree = 
7560: 28 52 74 72 65 65 20 2a 29 28 70 56 74 61 62 43  (Rtree *)(pVtabC
7570: 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20  ursor->pVtab);. 
7580: 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43   RtreeCursor *pC
7590: 73 72 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f  sr = (RtreeCurso
75a0: 72 20 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  r *)pVtabCursor;
75b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
75c0: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 52 74 72  TE_OK;..  /* Rtr
75d0: 65 65 43 75 72 73 6f 72 2e 70 4e 6f 64 65 20 6d  eeCursor.pNode m
75e0: 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e  ust not be NULL.
75f0: 20 49 66 20 69 73 20 69 73 20 4e 55 4c 4c 2c 20   If is is NULL, 
7600: 74 68 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72  then this cursor
7610: 20 69 73 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79   is.  ** already
7620: 20 61 74 20 45 4f 46 2e 20 49 74 20 69 73 20 61   at EOF. It is a
7630: 67 61 69 6e 73 74 20 74 68 65 20 72 75 6c 65 73  gainst the rules
7640: 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 78 4e 65   to call the xNe
7650: 78 74 28 29 20 6d 65 74 68 6f 64 20 6f 66 0a 20  xt() method of. 
7660: 20 2a 2a 20 61 20 63 75 72 73 6f 72 20 74 68 61   ** a cursor tha
7670: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 65  t has already re
7680: 61 63 68 65 64 20 45 4f 46 2e 0a 20 20 2a 2f 0a  ached EOF..  */.
7690: 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
76a0: 70 4e 6f 64 65 20 29 3b 0a 0a 20 20 69 66 28 20  pNode );..  if( 
76b0: 70 43 73 72 2d 3e 69 53 74 72 61 74 65 67 79 3d  pCsr->iStrategy=
76c0: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =1 ){.    /* Thi
76d0: 73 20 22 73 63 61 6e 22 20 69 73 20 61 20 64 69  s "scan" is a di
76e0: 72 65 63 74 20 6c 6f 6f 6b 75 70 20 62 79 20 72  rect lookup by r
76f0: 6f 77 69 64 2e 20 54 68 65 72 65 20 69 73 20 6e  owid. There is n
7700: 6f 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 2a 2f  o next entry. */
7710: 0a 20 20 20 20 6e 6f 64 65 52 65 6c 65 61 73 65  .    nodeRelease
7720: 28 70 52 74 72 65 65 2c 20 70 43 73 72 2d 3e 70  (pRtree, pCsr->p
7730: 4e 6f 64 65 29 3b 0a 20 20 20 20 70 43 73 72 2d  Node);.    pCsr-
7740: 3e 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 65  >pNode = 0;.  }e
7750: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 6f 76 65  lse{.    /* Move
7760: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
7770: 72 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  ry that matches 
7780: 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 63  the configured c
7790: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 2a 2f 0a 20  onstraints. */. 
77a0: 20 20 20 69 6e 74 20 69 48 65 69 67 68 74 20 3d     int iHeight =
77b0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   0;.    while( p
77c0: 43 73 72 2d 3e 70 4e 6f 64 65 20 29 7b 0a 20 20  Csr->pNode ){.  
77d0: 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
77e0: 4e 6f 64 65 20 3d 20 70 43 73 72 2d 3e 70 4e 6f  Node = pCsr->pNo
77f0: 64 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  de;.      int nC
7800: 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64  ell = NCELL(pNod
7810: 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 43  e);.      for(pC
7820: 73 72 2d 3e 69 43 65 6c 6c 2b 2b 3b 20 70 43 73  sr->iCell++; pCs
7830: 72 2d 3e 69 43 65 6c 6c 3c 6e 43 65 6c 6c 3b 20  r->iCell<nCell; 
7840: 70 43 73 72 2d 3e 69 43 65 6c 6c 2b 2b 29 7b 0a  pCsr->iCell++){.
7850: 20 20 20 20 20 20 20 20 69 6e 74 20 69 73 45 6f          int isEo
7860: 66 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  f;.        rc = 
7870: 64 65 73 63 65 6e 64 54 6f 43 65 6c 6c 28 70 52  descendToCell(pR
7880: 74 72 65 65 2c 20 70 43 73 72 2c 20 69 48 65 69  tree, pCsr, iHei
7890: 67 68 74 2c 20 26 69 73 45 6f 66 29 3b 0a 20 20  ght, &isEof);.  
78a0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
78b0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 69 73 45 6f  LITE_OK || !isEo
78c0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  f ){.          r
78d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
78e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
78f0: 20 20 70 43 73 72 2d 3e 70 4e 6f 64 65 20 3d 20    pCsr->pNode = 
7900: 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pNode->pParent;.
7910: 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 50        rc = nodeP
7920: 61 72 65 6e 74 49 6e 64 65 78 28 70 52 74 72 65  arentIndex(pRtre
7930: 65 2c 20 70 4e 6f 64 65 2c 20 26 70 43 73 72 2d  e, pNode, &pCsr-
7940: 3e 69 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 69  >iCell);.      i
7950: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7960: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
7970: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
7980: 20 20 20 20 20 6e 6f 64 65 52 65 66 65 72 65 6e       nodeReferen
7990: 63 65 28 70 43 73 72 2d 3e 70 4e 6f 64 65 29 3b  ce(pCsr->pNode);
79a0: 0a 20 20 20 20 20 20 6e 6f 64 65 52 65 6c 65 61  .      nodeRelea
79b0: 73 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  se(pRtree, pNode
79c0: 29 3b 0a 20 20 20 20 20 20 69 48 65 69 67 68 74  );.      iHeight
79d0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
79e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
79f0: 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74  * .** Rtree virt
7a00: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
7a10: 20 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e 0a   xRowid method..
7a20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74  */.static int rt
7a30: 72 65 65 52 6f 77 69 64 28 73 71 6c 69 74 65 33  reeRowid(sqlite3
7a40: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
7a50: 74 61 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74  tabCursor, sqlit
7a60: 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29  e_int64 *pRowid)
7a70: 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  {.  Rtree *pRtre
7a80: 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74  e = (Rtree *)pVt
7a90: 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b  abCursor->pVtab;
7aa0: 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a  .  RtreeCursor *
7ab0: 70 43 73 72 20 3d 20 28 52 74 72 65 65 43 75 72  pCsr = (RtreeCur
7ac0: 73 6f 72 20 2a 29 70 56 74 61 62 43 75 72 73 6f  sor *)pVtabCurso
7ad0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 70 43 73  r;..  assert(pCs
7ae0: 72 2d 3e 70 4e 6f 64 65 29 3b 0a 20 20 2a 70 52  r->pNode);.  *pR
7af0: 6f 77 69 64 20 3d 20 6e 6f 64 65 47 65 74 52 6f  owid = nodeGetRo
7b00: 77 69 64 28 70 52 74 72 65 65 2c 20 70 43 73 72  wid(pRtree, pCsr
7b10: 2d 3e 70 4e 6f 64 65 2c 20 70 43 73 72 2d 3e 69  ->pNode, pCsr->i
7b20: 43 65 6c 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Cell);..  return
7b30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7b40: 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74  * .** Rtree virt
7b50: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
7b60: 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 2e   xColumn method.
7b70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
7b80: 74 72 65 65 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  treeColumn(sqlit
7b90: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
7ba0: 63 75 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e  cur, sqlite3_con
7bb0: 74 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 69  text *ctx, int i
7bc0: 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  ){.  Rtree *pRtr
7bd0: 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 63 75  ee = (Rtree *)cu
7be0: 72 2d 3e 70 56 74 61 62 3b 0a 20 20 52 74 72 65  r->pVtab;.  Rtre
7bf0: 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  eCursor *pCsr = 
7c00: 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29 63  (RtreeCursor *)c
7c10: 75 72 3b 0a 0a 20 20 69 66 28 20 69 3d 3d 30 20  ur;..  if( i==0 
7c20: 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
7c30: 64 20 3d 20 6e 6f 64 65 47 65 74 52 6f 77 69 64  d = nodeGetRowid
7c40: 28 70 52 74 72 65 65 2c 20 70 43 73 72 2d 3e 70  (pRtree, pCsr->p
7c50: 4e 6f 64 65 2c 20 70 43 73 72 2d 3e 69 43 65 6c  Node, pCsr->iCel
7c60: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
7c70: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78  result_int64(ctx
7c80: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  , iRowid);.  }el
7c90: 73 65 7b 0a 20 20 20 20 52 74 72 65 65 43 6f 6f  se{.    RtreeCoo
7ca0: 72 64 20 63 3b 0a 20 20 20 20 6e 6f 64 65 47 65  rd c;.    nodeGe
7cb0: 74 43 6f 6f 72 64 28 70 52 74 72 65 65 2c 20 70  tCoord(pRtree, p
7cc0: 43 73 72 2d 3e 70 4e 6f 64 65 2c 20 70 43 73 72  Csr->pNode, pCsr
7cd0: 2d 3e 69 43 65 6c 6c 2c 20 69 2d 31 2c 20 26 63  ->iCell, i-1, &c
7ce0: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 74 72 65  );.    if( pRtre
7cf0: 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52  e->eCoordType==R
7d00: 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33  TREE_COORD_REAL3
7d10: 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
7d20: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
7d30: 28 63 74 78 2c 20 63 2e 66 29 3b 0a 20 20 20 20  (ctx, c.f);.    
7d40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
7d50: 65 72 74 28 20 70 52 74 72 65 65 2d 3e 65 43 6f  ert( pRtree->eCo
7d60: 6f 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f 43  ordType==RTREE_C
7d70: 4f 4f 52 44 5f 49 4e 54 33 32 20 29 3b 0a 20 20  OORD_INT32 );.  
7d80: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7d90: 6c 74 5f 69 6e 74 28 63 74 78 2c 20 63 2e 69 29  lt_int(ctx, c.i)
7da0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
7db0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7dc0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 55 73 65 20 6e  .}../* .** Use n
7dd0: 6f 64 65 41 63 71 75 69 72 65 28 29 20 74 6f 20  odeAcquire() to 
7de0: 6f 62 74 61 69 6e 20 74 68 65 20 6c 65 61 66 20  obtain the leaf 
7df0: 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  node containing 
7e00: 74 68 65 20 72 65 63 6f 72 64 20 77 69 74 68 20  the record with 
7e10: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 69 64  .** rowid iRowid
7e20: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
7e30: 20 73 65 74 20 2a 70 70 4c 65 61 66 20 74 6f 20   set *ppLeaf to 
7e40: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 6f 64  point to the nod
7e50: 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  e and.** return 
7e60: 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
7e70: 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 72  ere is no such r
7e80: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 74 61 62  ecord in the tab
7e90: 6c 65 2c 20 73 65 74 0a 2a 2a 20 2a 70 70 4c 65  le, set.** *ppLe
7ea0: 61 66 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  af to 0 and retu
7eb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
7ec0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7ed0: 2c 20 73 65 74 20 2a 70 70 4c 65 61 66 0a 2a 2a  , set *ppLeaf.**
7ee0: 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   to zero and ret
7ef0: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
7f00: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
7f10: 74 69 63 20 69 6e 74 20 66 69 6e 64 4c 65 61 66  tic int findLeaf
7f20: 4e 6f 64 65 28 52 74 72 65 65 20 2a 70 52 74 72  Node(Rtree *pRtr
7f30: 65 65 2c 20 69 36 34 20 69 52 6f 77 69 64 2c 20  ee, i64 iRowid, 
7f40: 52 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70 4c 65  RtreeNode **ppLe
7f50: 61 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  af){.  int rc;. 
7f60: 20 2a 70 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20   *ppLeaf = 0;.  
7f70: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
7f80: 36 34 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64  64(pRtree->pRead
7f90: 52 6f 77 69 64 2c 20 31 2c 20 69 52 6f 77 69 64  Rowid, 1, iRowid
7fa0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
7fb0: 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70 52  _step(pRtree->pR
7fc0: 65 61 64 52 6f 77 69 64 29 3d 3d 53 51 4c 49 54  eadRowid)==SQLIT
7fd0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 36 34  E_ROW ){.    i64
7fe0: 20 69 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33   iNode = sqlite3
7ff0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 52  _column_int64(pR
8000: 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64  tree->pReadRowid
8010: 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 6e  , 0);.    rc = n
8020: 6f 64 65 41 63 71 75 69 72 65 28 70 52 74 72 65  odeAcquire(pRtre
8030: 65 2c 20 69 4e 6f 64 65 2c 20 30 2c 20 70 70 4c  e, iNode, 0, ppL
8040: 65 61 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eaf);.    sqlite
8050: 33 5f 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e  3_reset(pRtree->
8060: 70 52 65 61 64 52 6f 77 69 64 29 3b 0a 20 20 7d  pReadRowid);.  }
8070: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
8080: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 74  qlite3_reset(pRt
8090: 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 29  ree->pReadRowid)
80a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
80b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
80c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
80d0: 6c 65 64 20 74 6f 20 63 6f 6e 66 69 67 75 72 65  led to configure
80e0: 20 74 68 65 20 52 74 72 65 65 43 6f 6e 73 74 72   the RtreeConstr
80f0: 61 69 6e 74 20 6f 62 6a 65 63 74 20 70 61 73 73  aint object pass
8100: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  ed.** as the sec
8110: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 66 6f 72  ond argument for
8120: 20 61 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61   a MATCH constra
8130: 69 6e 74 2e 20 54 68 65 20 76 61 6c 75 65 20 70  int. The value p
8140: 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  assed as the.** 
8150: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
8160: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
8170: 69 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  is the right-han
8180: 64 20 6f 70 65 72 61 6e 64 20 74 6f 20 74 68 65  d operand to the
8190: 20 4d 41 54 43 48 0a 2a 2a 20 6f 70 65 72 61 74   MATCH.** operat
81a0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
81b0: 74 20 64 65 73 65 72 69 61 6c 69 7a 65 47 65 6f  t deserializeGeo
81c0: 6d 65 74 72 79 28 73 71 6c 69 74 65 33 5f 76 61  metry(sqlite3_va
81d0: 6c 75 65 20 2a 70 56 61 6c 75 65 2c 20 52 74 72  lue *pValue, Rtr
81e0: 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43  eeConstraint *pC
81f0: 6f 6e 73 29 7b 0a 20 20 52 74 72 65 65 4d 61 74  ons){.  RtreeMat
8200: 63 68 41 72 67 20 2a 70 3b 0a 20 20 73 71 6c 69  chArg *p;.  sqli
8210: 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74  te3_rtree_geomet
8220: 72 79 20 2a 70 47 65 6f 6d 3b 0a 20 20 69 6e 74  ry *pGeom;.  int
8230: 20 6e 42 6c 6f 62 3b 0a 0a 20 20 2f 2a 20 43 68   nBlob;..  /* Ch
8240: 65 63 6b 20 74 68 61 74 20 76 61 6c 75 65 20 69  eck that value i
8250: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 62 6c 6f  s actually a blo
8260: 62 2e 20 2a 2f 0a 20 20 69 66 28 20 21 73 71 6c  b. */.  if( !sql
8270: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
8280: 70 56 61 6c 75 65 29 3d 3d 53 51 4c 49 54 45 5f  pValue)==SQLITE_
8290: 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 53 51  BLOB ) return SQ
82a0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f  LITE_ERROR;..  /
82b0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
82c0: 20 62 6c 6f 62 20 69 73 20 72 6f 75 67 68 6c 79   blob is roughly
82d0: 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
82e0: 20 2a 2f 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71   */.  nBlob = sq
82f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8300: 73 28 70 56 61 6c 75 65 29 3b 0a 20 20 69 66 28  s(pValue);.  if(
8310: 20 6e 42 6c 6f 62 3c 28 69 6e 74 29 73 69 7a 65   nBlob<(int)size
8320: 6f 66 28 52 74 72 65 65 4d 61 74 63 68 41 72 67  of(RtreeMatchArg
8330: 29 20 0a 20 20 20 7c 7c 20 28 28 6e 42 6c 6f 62  ) .   || ((nBlob
8340: 2d 73 69 7a 65 6f 66 28 52 74 72 65 65 4d 61 74  -sizeof(RtreeMat
8350: 63 68 41 72 67 29 29 25 73 69 7a 65 6f 66 28 64  chArg))%sizeof(d
8360: 6f 75 62 6c 65 29 29 21 3d 30 0a 20 20 29 7b 0a  ouble))!=0.  ){.
8370: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8380: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
8390: 70 47 65 6f 6d 20 3d 20 28 73 71 6c 69 74 65 33  pGeom = (sqlite3
83a0: 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 20  _rtree_geometry 
83b0: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
83c0: 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 73  (.      sizeof(s
83d0: 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f  qlite3_rtree_geo
83e0: 6d 65 74 72 79 29 20 2b 20 6e 42 6c 6f 62 0a 20  metry) + nBlob. 
83f0: 20 29 3b 0a 20 20 69 66 28 20 21 70 47 65 6f 6d   );.  if( !pGeom
8400: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
8410: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
8420: 28 70 47 65 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pGeom, 0, sizeo
8430: 66 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f  f(sqlite3_rtree_
8440: 67 65 6f 6d 65 74 72 79 29 29 3b 0a 20 20 70 20  geometry));.  p 
8450: 3d 20 28 52 74 72 65 65 4d 61 74 63 68 41 72 67  = (RtreeMatchArg
8460: 20 2a 29 26 70 47 65 6f 6d 5b 31 5d 3b 0a 0a 20   *)&pGeom[1];.. 
8470: 20 6d 65 6d 63 70 79 28 70 2c 20 73 71 6c 69 74   memcpy(p, sqlit
8480: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56  e3_value_blob(pV
8490: 61 6c 75 65 29 2c 20 6e 42 6c 6f 62 29 3b 0a 20  alue), nBlob);. 
84a0: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 52   if( p->magic!=R
84b0: 54 52 45 45 5f 47 45 4f 4d 45 54 52 59 5f 4d 41  TREE_GEOMETRY_MA
84c0: 47 49 43 20 0a 20 20 20 7c 7c 20 6e 42 6c 6f 62  GIC .   || nBlob
84d0: 21 3d 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 52  !=(int)(sizeof(R
84e0: 74 72 65 65 4d 61 74 63 68 41 72 67 29 20 2b 20  treeMatchArg) + 
84f0: 28 70 2d 3e 6e 50 61 72 61 6d 2d 31 29 2a 73 69  (p->nParam-1)*si
8500: 7a 65 6f 66 28 64 6f 75 62 6c 65 29 29 0a 20 20  zeof(double)).  
8510: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
8520: 72 65 65 28 70 47 65 6f 6d 29 3b 0a 20 20 20 20  ree(pGeom);.    
8530: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8540: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 47 65 6f  ROR;.  }..  pGeo
8550: 6d 2d 3e 70 43 6f 6e 74 65 78 74 20 3d 20 70 2d  m->pContext = p-
8560: 3e 70 43 6f 6e 74 65 78 74 3b 0a 20 20 70 47 65  >pContext;.  pGe
8570: 6f 6d 2d 3e 6e 50 61 72 61 6d 20 3d 20 70 2d 3e  om->nParam = p->
8580: 6e 50 61 72 61 6d 3b 0a 20 20 70 47 65 6f 6d 2d  nParam;.  pGeom-
8590: 3e 61 50 61 72 61 6d 20 3d 20 70 2d 3e 61 50 61  >aParam = p->aPa
85a0: 72 61 6d 3b 0a 0a 20 20 70 43 6f 6e 73 2d 3e 78  ram;..  pCons->x
85b0: 47 65 6f 6d 20 3d 20 70 2d 3e 78 47 65 6f 6d 3b  Geom = p->xGeom;
85c0: 0a 20 20 70 43 6f 6e 73 2d 3e 70 47 65 6f 6d 20  .  pCons->pGeom 
85d0: 3d 20 70 47 65 6f 6d 3b 0a 20 20 72 65 74 75 72  = pGeom;.  retur
85e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
85f0: 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72  /* .** Rtree vir
8600: 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
8610: 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64  e xFilter method
8620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8630: 72 74 72 65 65 46 69 6c 74 65 72 28 0a 20 20 73  rtreeFilter(.  s
8640: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
8650: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c  or *pVtabCursor,
8660: 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20   .  int idxNum, 
8670: 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53  const char *idxS
8680: 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  tr,.  int argc, 
8690: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
86a0: 61 72 67 76 0a 29 7b 0a 20 20 52 74 72 65 65 20  argv.){.  Rtree 
86b0: 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65  *pRtree = (Rtree
86c0: 20 2a 29 70 56 74 61 62 43 75 72 73 6f 72 2d 3e   *)pVtabCursor->
86d0: 70 56 74 61 62 3b 0a 20 20 52 74 72 65 65 43 75  pVtab;.  RtreeCu
86e0: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 52 74  rsor *pCsr = (Rt
86f0: 72 65 65 43 75 72 73 6f 72 20 2a 29 70 56 74 61  reeCursor *)pVta
8700: 62 43 75 72 73 6f 72 3b 0a 0a 20 20 52 74 72 65  bCursor;..  Rtre
8710: 65 4e 6f 64 65 20 2a 70 52 6f 6f 74 20 3d 20 30  eNode *pRoot = 0
8720: 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  ;.  int ii;.  in
8730: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8740: 3b 0a 0a 20 20 72 74 72 65 65 52 65 66 65 72 65  ;..  rtreeRefere
8750: 6e 63 65 28 70 52 74 72 65 65 29 3b 0a 0a 20 20  nce(pRtree);..  
8760: 66 72 65 65 43 75 72 73 6f 72 43 6f 6e 73 74 72  freeCursorConstr
8770: 61 69 6e 74 73 28 70 43 73 72 29 3b 0a 20 20 70  aints(pCsr);.  p
8780: 43 73 72 2d 3e 69 53 74 72 61 74 65 67 79 20 3d  Csr->iStrategy =
8790: 20 69 64 78 4e 75 6d 3b 0a 0a 20 20 69 66 28 20   idxNum;..  if( 
87a0: 69 64 78 4e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20  idxNum==1 ){.   
87b0: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
87c0: 20 2d 20 6c 6f 6f 6b 75 70 20 62 79 20 72 6f 77   - lookup by row
87d0: 69 64 2e 20 2a 2f 0a 20 20 20 20 52 74 72 65 65  id. */.    Rtree
87e0: 4e 6f 64 65 20 2a 70 4c 65 61 66 3b 20 20 20 20  Node *pLeaf;    
87f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 6f 6e 20 77      /* Leaf on w
8800: 68 69 63 68 20 74 68 65 20 72 65 71 75 69 72 65  hich the require
8810: 64 20 63 65 6c 6c 20 72 65 73 69 64 65 73 20 2a  d cell resides *
8820: 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
8830: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
8840: 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b  _int64(argv[0]);
8850: 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 65  .    rc = findLe
8860: 61 66 4e 6f 64 65 28 70 52 74 72 65 65 2c 20 69  afNode(pRtree, i
8870: 52 6f 77 69 64 2c 20 26 70 4c 65 61 66 29 3b 0a  Rowid, &pLeaf);.
8880: 20 20 20 20 70 43 73 72 2d 3e 70 4e 6f 64 65 20      pCsr->pNode 
8890: 3d 20 70 4c 65 61 66 3b 20 0a 20 20 20 20 69 66  = pLeaf; .    if
88a0: 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ( pLeaf ){.     
88b0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
88c0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
88d0: 72 63 20 3d 20 6e 6f 64 65 52 6f 77 69 64 49 6e  rc = nodeRowidIn
88e0: 64 65 78 28 70 52 74 72 65 65 2c 20 70 4c 65 61  dex(pRtree, pLea
88f0: 66 2c 20 69 52 6f 77 69 64 2c 20 26 70 43 73 72  f, iRowid, &pCsr
8900: 2d 3e 69 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->iCell);.    }.
8910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
8920: 4e 6f 72 6d 61 6c 20 63 61 73 65 20 2d 20 72 2d  Normal case - r-
8930: 74 72 65 65 20 73 63 61 6e 2e 20 53 65 74 20 75  tree scan. Set u
8940: 70 20 74 68 65 20 52 74 72 65 65 43 75 72 73 6f  p the RtreeCurso
8950: 72 2e 61 43 6f 6e 73 74 72 61 69 6e 74 20 61 72  r.aConstraint ar
8960: 72 61 79 20 0a 20 20 20 20 2a 2a 20 77 69 74 68  ray .    ** with
8970: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20   the configured 
8980: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 0a 20 20  constraints. .  
8990: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 72 67    */.    if( arg
89a0: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 43 73  c>0 ){.      pCs
89b0: 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  r->aConstraint =
89c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
89d0: 73 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6e 73  sizeof(RtreeCons
89e0: 74 72 61 69 6e 74 29 2a 61 72 67 63 29 3b 0a 20  traint)*argc);. 
89f0: 20 20 20 20 20 70 43 73 72 2d 3e 6e 43 6f 6e 73       pCsr->nCons
8a00: 74 72 61 69 6e 74 20 3d 20 61 72 67 63 3b 0a 20  traint = argc;. 
8a10: 20 20 20 20 20 69 66 28 20 21 70 43 73 72 2d 3e       if( !pCsr->
8a20: 61 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20  aConstraint ){. 
8a30: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
8a40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
8a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
8a60: 65 6d 73 65 74 28 70 43 73 72 2d 3e 61 43 6f 6e  emset(pCsr->aCon
8a70: 73 74 72 61 69 6e 74 2c 20 30 2c 20 73 69 7a 65  straint, 0, size
8a80: 6f 66 28 52 74 72 65 65 43 6f 6e 73 74 72 61 69  of(RtreeConstrai
8a90: 6e 74 29 2a 61 72 67 63 29 3b 0a 20 20 20 20 20  nt)*argc);.     
8aa0: 20 20 20 61 73 73 65 72 74 28 20 28 69 64 78 53     assert( (idxS
8ab0: 74 72 3d 3d 30 20 26 26 20 61 72 67 63 3d 3d 30  tr==0 && argc==0
8ac0: 29 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e  ) || (int)strlen
8ad0: 28 69 64 78 53 74 72 29 3d 3d 61 72 67 63 2a 32  (idxStr)==argc*2
8ae0: 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
8af0: 69 69 3d 30 3b 20 69 69 3c 61 72 67 63 3b 20 69  ii=0; ii<argc; i
8b00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
8b10: 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20  RtreeConstraint 
8b20: 2a 70 20 3d 20 26 70 43 73 72 2d 3e 61 43 6f 6e  *p = &pCsr->aCon
8b30: 73 74 72 61 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  straint[ii];.   
8b40: 20 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 69         p->op = i
8b50: 64 78 53 74 72 5b 69 69 2a 32 5d 3b 0a 20 20 20  dxStr[ii*2];.   
8b60: 20 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64         p->iCoord
8b70: 20 3d 20 69 64 78 53 74 72 5b 69 69 2a 32 2b 31   = idxStr[ii*2+1
8b80: 5d 2d 27 61 27 3b 0a 20 20 20 20 20 20 20 20 20  ]-'a';.         
8b90: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 52 54 52 45   if( p->op==RTRE
8ba0: 45 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 20  E_MATCH ){.     
8bb0: 20 20 20 20 20 20 20 2f 2a 20 41 20 4d 41 54 43         /* A MATC
8bc0: 48 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20  H operator. The 
8bd0: 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20  right-hand-side 
8be0: 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 20 74  must be a blob t
8bf0: 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
8c00: 2a 2a 20 63 61 6e 20 62 65 20 63 61 73 74 20 69  ** can be cast i
8c10: 6e 74 6f 20 61 6e 20 52 74 72 65 65 4d 61 74 63  nto an RtreeMatc
8c20: 68 41 72 67 20 6f 62 6a 65 63 74 2e 20 4f 6e 65  hArg object. One
8c30: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20   created using. 
8c40: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e             ** an
8c50: 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67   sqlite3_rtree_g
8c60: 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b  eometry_callback
8c70: 28 29 20 53 51 4c 20 75 73 65 72 20 66 75 6e 63  () SQL user func
8c80: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20 20  tion..          
8c90: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
8ca0: 20 72 63 20 3d 20 64 65 73 65 72 69 61 6c 69 7a   rc = deserializ
8cb0: 65 47 65 6f 6d 65 74 72 79 28 61 72 67 76 5b 69  eGeometry(argv[i
8cc0: 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  i], p);.        
8cd0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
8ce0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
8cf0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8d00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8d10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8d20: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 56 61 6c           p->rVal
8d30: 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
8d40: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 69  ue_double(argv[i
8d50: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
8d60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8d70: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
8d80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8d90: 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d  K ){.      pCsr-
8da0: 3e 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >pNode = 0;.    
8db0: 20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71 75 69    rc = nodeAcqui
8dc0: 72 65 28 70 52 74 72 65 65 2c 20 31 2c 20 30 2c  re(pRtree, 1, 0,
8dd0: 20 26 70 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a   &pRoot);.    }.
8de0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
8df0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
8e00: 6e 74 20 69 73 45 6f 66 20 3d 20 31 3b 0a 20 20  nt isEof = 1;.  
8e10: 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20      int nCell = 
8e20: 4e 43 45 4c 4c 28 70 52 6f 6f 74 29 3b 0a 20 20  NCELL(pRoot);.  
8e30: 20 20 20 20 70 43 73 72 2d 3e 70 4e 6f 64 65 20      pCsr->pNode 
8e40: 3d 20 70 52 6f 6f 74 3b 0a 20 20 20 20 20 20 66  = pRoot;.      f
8e50: 6f 72 28 70 43 73 72 2d 3e 69 43 65 6c 6c 3d 30  or(pCsr->iCell=0
8e60: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
8e70: 26 26 20 70 43 73 72 2d 3e 69 43 65 6c 6c 3c 6e  && pCsr->iCell<n
8e80: 43 65 6c 6c 3b 20 70 43 73 72 2d 3e 69 43 65 6c  Cell; pCsr->iCel
8e90: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  l++){.        as
8ea0: 73 65 72 74 28 20 70 43 73 72 2d 3e 70 4e 6f 64  sert( pCsr->pNod
8eb0: 65 3d 3d 70 52 6f 6f 74 20 29 3b 0a 20 20 20 20  e==pRoot );.    
8ec0: 20 20 20 20 72 63 20 3d 20 64 65 73 63 65 6e 64      rc = descend
8ed0: 54 6f 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70  ToCell(pRtree, p
8ee0: 43 73 72 2c 20 70 52 74 72 65 65 2d 3e 69 44 65  Csr, pRtree->iDe
8ef0: 70 74 68 2c 20 26 69 73 45 6f 66 29 3b 0a 20 20  pth, &isEof);.  
8f00: 20 20 20 20 20 20 69 66 28 20 21 69 73 45 6f 66        if( !isEof
8f10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
8f20: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
8f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8f40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
8f50: 26 20 69 73 45 6f 66 20 29 7b 0a 20 20 20 20 20  & isEof ){.     
8f60: 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d     assert( pCsr-
8f70: 3e 70 4e 6f 64 65 3d 3d 70 52 6f 6f 74 20 29 3b  >pNode==pRoot );
8f80: 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 52 65 6c  .        nodeRel
8f90: 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 52 6f  ease(pRtree, pRo
8fa0: 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43 73  ot);.        pCs
8fb0: 72 2d 3e 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  r->pNode = 0;.  
8fc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
8fd0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
8fe0: 4b 20 7c 7c 20 21 70 43 73 72 2d 3e 70 4e 6f 64  K || !pCsr->pNod
8ff0: 65 20 7c 7c 20 70 43 73 72 2d 3e 69 43 65 6c 6c  e || pCsr->iCell
9000: 3c 4e 43 45 4c 4c 28 70 43 73 72 2d 3e 70 4e 6f  <NCELL(pCsr->pNo
9010: 64 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  de) );.    }.  }
9020: 0a 0a 20 20 72 74 72 65 65 52 65 6c 65 61 73 65  ..  rtreeRelease
9030: 28 70 52 74 72 65 65 29 3b 0a 20 20 72 65 74 75  (pRtree);.  retu
9040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9050: 52 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61  Rtree virtual ta
9060: 62 6c 65 20 6d 6f 64 75 6c 65 20 78 42 65 73 74  ble module xBest
9070: 49 6e 64 65 78 20 6d 65 74 68 6f 64 2e 20 54 68  Index method. Th
9080: 65 72 65 20 61 72 65 20 74 68 72 65 65 0a 2a 2a  ere are three.**
9090: 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61   table scan stra
90a0: 74 65 67 69 65 73 20 74 6f 20 63 68 6f 6f 73 65  tegies to choose
90b0: 20 66 72 6f 6d 20 28 69 6e 20 6f 72 64 65 72 20   from (in order 
90c0: 66 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 0a 2a 2a  from most to .**
90d0: 20 6c 65 61 73 74 20 64 65 73 69 72 61 62 6c 65   least desirable
90e0: 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 64 78 4e 75  ):.**.**   idxNu
90f0: 6d 20 20 20 20 20 69 64 78 53 74 72 20 20 20 20  m     idxStr    
9100: 20 20 20 20 53 74 72 61 74 65 67 79 0a 2a 2a 20      Strategy.** 
9110: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9140: 2d 2d 0a 2a 2a 20 20 20 20 20 31 20 20 20 20 20  --.**     1     
9150: 20 20 20 55 6e 75 73 65 64 20 20 20 20 20 20 20     Unused       
9160: 20 44 69 72 65 63 74 20 6c 6f 6f 6b 75 70 20 62   Direct lookup b
9170: 79 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20  y rowid..**     
9180: 32 20 20 20 20 20 20 20 20 53 65 65 20 62 65 6c  2        See bel
9190: 6f 77 20 20 20 20 20 52 2d 74 72 65 65 20 71 75  ow     R-tree qu
91a0: 65 72 79 20 6f 72 20 66 75 6c 6c 2d 74 61 62 6c  ery or full-tabl
91b0: 65 20 73 63 61 6e 2e 0a 2a 2a 20 20 20 2d 2d 2d  e scan..**   ---
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
91f0: 0a 2a 2a 20 49 66 20 73 74 72 61 74 65 67 79 20  .** If strategy 
9200: 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20  1 is used, then 
9210: 69 64 78 53 74 72 20 69 73 20 6e 6f 74 20 6d 65  idxStr is not me
9220: 61 6e 69 6e 67 66 75 6c 2e 20 49 66 20 73 74 72  aningful. If str
9230: 61 74 65 67 79 0a 2a 2a 20 32 20 69 73 20 75 73  ategy.** 2 is us
9240: 65 64 2c 20 69 64 78 53 74 72 20 69 73 20 66 6f  ed, idxStr is fo
9250: 72 6d 61 74 74 65 64 20 74 6f 20 63 6f 6e 74 61  rmatted to conta
9260: 69 6e 20 32 20 62 79 74 65 73 20 66 6f 72 20 65  in 2 bytes for e
9270: 61 63 68 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  ach .** constrai
9280: 6e 74 20 75 73 65 64 2e 20 54 68 65 20 66 69 72  nt used. The fir
9290: 73 74 20 74 77 6f 20 62 79 74 65 73 20 6f 66 20  st two bytes of 
92a0: 69 64 78 53 74 72 20 63 6f 72 72 65 73 70 6f 6e  idxStr correspon
92b0: 64 20 74 6f 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  d to .** the con
92c0: 73 74 72 61 69 6e 74 20 69 6e 20 73 71 6c 69 74  straint in sqlit
92d0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2e 61 43  e3_index_info.aC
92e0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 5d  onstraintUsage[]
92f0: 20 77 69 74 68 0a 2a 2a 20 28 61 72 67 76 49 6e   with.** (argvIn
9300: 64 65 78 3d 3d 31 29 20 65 74 63 2e 0a 2a 2a 0a  dex==1) etc..**.
9310: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
9320: 65 61 63 68 20 70 61 69 72 20 6f 66 20 62 79 74  each pair of byt
9330: 65 73 20 69 6e 20 69 64 78 53 74 72 20 69 64 65  es in idxStr ide
9340: 6e 74 69 66 69 65 73 20 74 68 65 20 63 6f 6e 73  ntifies the cons
9350: 74 72 61 69 6e 74 0a 2a 2a 20 6f 70 65 72 61 74  traint.** operat
9360: 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  or as follows:.*
9370: 2a 0a 2a 2a 20 20 20 4f 70 65 72 61 74 6f 72 20  *.**   Operator 
9380: 20 20 20 42 79 74 65 20 56 61 6c 75 65 0a 2a 2a     Byte Value.**
9390: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
93a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
93b0: 20 20 3d 20 20 20 20 20 20 20 20 30 78 34 31 20    =        0x41 
93c0: 28 27 41 27 29 0a 2a 2a 20 20 20 20 20 3c 3d 20  ('A').**     <= 
93d0: 20 20 20 20 20 20 20 30 78 34 32 20 28 27 42 27         0x42 ('B'
93e0: 29 0a 2a 2a 20 20 20 20 20 20 3c 20 20 20 20 20  ).**      <     
93f0: 20 20 20 30 78 34 33 20 28 27 43 27 29 0a 2a 2a     0x43 ('C').**
9400: 20 20 20 20 20 3e 3d 20 20 20 20 20 20 20 20 30       >=        0
9410: 78 34 34 20 28 27 44 27 29 0a 2a 2a 20 20 20 20  x44 ('D').**    
9420: 20 20 3e 20 20 20 20 20 20 20 20 30 78 34 35 20    >        0x45 
9430: 28 27 45 27 29 0a 2a 2a 20 20 20 4d 41 54 43 48  ('E').**   MATCH
9440: 20 20 20 20 20 20 20 30 78 34 36 20 28 27 46 27         0x46 ('F'
9450: 29 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ).**   ---------
9460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
9470: 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 6f  .** The second o
9480: 66 20 65 61 63 68 20 70 61 69 72 20 6f 66 20 62  f each pair of b
9490: 79 74 65 73 20 69 64 65 6e 74 69 66 69 65 73 20  ytes identifies 
94a0: 74 68 65 20 63 6f 6f 72 64 69 6e 61 74 65 20 63  the coordinate c
94b0: 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 77 68 69 63  olumn.** to whic
94c0: 68 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  h the constraint
94d0: 20 61 70 70 6c 69 65 73 2e 20 54 68 65 20 6c 65   applies. The le
94e0: 66 74 6d 6f 73 74 20 63 6f 6f 72 64 69 6e 61 74  ftmost coordinat
94f0: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 27  e column.** is '
9500: 61 27 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 66  a', the second f
9510: 72 6f 6d 20 74 68 65 20 6c 65 66 74 20 27 62 27  rom the left 'b'
9520: 20 65 74 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   etc..*/.static 
9530: 69 6e 74 20 72 74 72 65 65 42 65 73 74 49 6e 64  int rtreeBestInd
9540: 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ex(sqlite3_vtab 
9550: 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *tab, sqlite3_in
9560: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
9570: 66 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  fo){.  int rc = 
9580: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
9590: 20 69 69 3b 0a 0a 20 20 69 6e 74 20 69 49 64 78   ii;..  int iIdx
95a0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 49 64   = 0;.  char zId
95b0: 78 53 74 72 5b 52 54 52 45 45 5f 4d 41 58 5f 44  xStr[RTREE_MAX_D
95c0: 49 4d 45 4e 53 49 4f 4e 53 2a 38 2b 31 5d 3b 0a  IMENSIONS*8+1];.
95d0: 20 20 6d 65 6d 73 65 74 28 7a 49 64 78 53 74 72    memset(zIdxStr
95e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 7a 49 64 78  , 0, sizeof(zIdx
95f0: 53 74 72 29 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Str));.  UNUSED_
9600: 50 41 52 41 4d 45 54 45 52 28 74 61 62 29 3b 0a  PARAMETER(tab);.
9610: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 49  .  assert( pIdxI
9620: 6e 66 6f 2d 3e 69 64 78 53 74 72 3d 3d 30 20 29  nfo->idxStr==0 )
9630: 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
9640: 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
9650: 74 72 61 69 6e 74 20 26 26 20 69 49 64 78 3c 28  traint && iIdx<(
9660: 69 6e 74 29 28 73 69 7a 65 6f 66 28 7a 49 64 78  int)(sizeof(zIdx
9670: 53 74 72 29 2d 31 29 3b 20 69 69 2b 2b 29 7b 0a  Str)-1); ii++){.
9680: 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74      struct sqlit
9690: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
96a0: 69 6e 74 20 2a 70 20 3d 20 26 70 49 64 78 49 6e  int *p = &pIdxIn
96b0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  fo->aConstraint[
96c0: 69 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  ii];..    if( p-
96d0: 3e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 69 43  >usable && p->iC
96e0: 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 70 2d 3e 6f  olumn==0 && p->o
96f0: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p==SQLITE_INDEX_
9700: 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 7b  CONSTRAINT_EQ ){
9710: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
9720: 65 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f  e an equality co
9730: 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
9740: 72 6f 77 69 64 2e 20 55 73 65 20 73 74 72 61 74  rowid. Use strat
9750: 65 67 79 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20  egy 1. */.      
9760: 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f  int jj;.      fo
9770: 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 69 69 3b 20 6a  r(jj=0; jj<ii; j
9780: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  j++){.        pI
9790: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
97a0: 69 6e 74 55 73 61 67 65 5b 6a 6a 5d 2e 61 72 67  intUsage[jj].arg
97b0: 76 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  vIndex = 0;.    
97c0: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
97d0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
97e0: 6a 5d 2e 6f 6d 69 74 20 3d 20 30 3b 0a 20 20 20  j].omit = 0;.   
97f0: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 64 78 49     }.      pIdxI
9800: 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 31 3b  nfo->idxNum = 1;
9810: 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
9820: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
9830: 65 5b 69 69 5d 2e 61 72 67 76 49 6e 64 65 78 20  e[ii].argvIndex 
9840: 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64 78 49  = 1;.      pIdxI
9850: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
9860: 55 73 61 67 65 5b 6a 6a 5d 2e 6f 6d 69 74 20 3d  Usage[jj].omit =
9870: 20 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   1;..      /* Th
9880: 69 73 20 73 74 72 61 74 65 67 79 20 69 6e 76 6f  is strategy invo
9890: 6c 76 65 73 20 61 20 74 77 6f 20 72 6f 77 69 64  lves a two rowid
98a0: 20 6c 6f 6f 6b 75 70 73 20 6f 6e 20 61 6e 20 42   lookups on an B
98b0: 2d 54 72 65 65 20 73 74 72 75 63 74 75 72 65 73  -Tree structures
98c0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
98d0: 65 6e 20 61 20 6c 69 6e 65 61 72 20 73 65 61 72  en a linear sear
98e0: 63 68 20 6f 66 20 61 6e 20 52 2d 54 72 65 65 20  ch of an R-Tree 
98f0: 6e 6f 64 65 2e 20 54 68 69 73 20 73 68 6f 75 6c  node. This shoul
9900: 64 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  d be .      ** c
9910: 6f 6e 73 69 64 65 72 65 64 20 61 6c 6d 6f 73 74  onsidered almost
9920: 20 61 73 20 71 75 69 63 6b 20 61 73 20 61 20 64   as quick as a d
9930: 69 72 65 63 74 20 72 6f 77 69 64 20 6c 6f 6f 6b  irect rowid look
9940: 75 70 20 28 66 6f 72 20 77 68 69 63 68 20 0a 20  up (for which . 
9950: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 20 75       ** sqlite u
9960: 73 65 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  ses an internal 
9970: 63 6f 73 74 20 6f 66 20 30 2e 30 29 2e 0a 20 20  cost of 0.0)..  
9980: 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 70 49      */ .      pI
9990: 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
99a0: 64 43 6f 73 74 20 3d 20 31 30 2e 30 3b 0a 20 20  dCost = 10.0;.  
99b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
99c0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
99d0: 20 69 66 28 20 70 2d 3e 75 73 61 62 6c 65 20 26   if( p->usable &
99e0: 26 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 30 20  & (p->iColumn>0 
99f0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  || p->op==SQLITE
9a00: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
9a10: 54 5f 4d 41 54 43 48 29 20 29 7b 0a 20 20 20 20  T_MATCH) ){.    
9a20: 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 20 20 73    u8 op;.      s
9a30: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
9a40: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
9a50: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
9a60: 41 49 4e 54 5f 45 51 3a 20 6f 70 20 3d 20 52 54  AINT_EQ: op = RT
9a70: 52 45 45 5f 45 51 3b 20 62 72 65 61 6b 3b 0a 20  REE_EQ; break;. 
9a80: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
9a90: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
9aa0: 49 4e 54 5f 47 54 3a 20 6f 70 20 3d 20 52 54 52  INT_GT: op = RTR
9ab0: 45 45 5f 47 54 3b 20 62 72 65 61 6b 3b 0a 20 20  EE_GT; break;.  
9ac0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9ad0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
9ae0: 4e 54 5f 4c 45 3a 20 6f 70 20 3d 20 52 54 52 45  NT_LE: op = RTRE
9af0: 45 5f 4c 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20  E_LE; break;.   
9b00: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9b10: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
9b20: 54 5f 4c 54 3a 20 6f 70 20 3d 20 52 54 52 45 45  T_LT: op = RTREE
9b30: 5f 4c 54 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  _LT; break;.    
9b40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9b50: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
9b60: 5f 47 45 3a 20 6f 70 20 3d 20 52 54 52 45 45 5f  _GE: op = RTREE_
9b70: 47 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  GE; break;.     
9b80: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
9b90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9ba0: 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op==SQLITE_INDE
9bb0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
9bc0: 43 48 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  CH );.          
9bd0: 6f 70 20 3d 20 52 54 52 45 45 5f 4d 41 54 43 48  op = RTREE_MATCH
9be0: 3b 20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ; .          bre
9bf0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9c00: 20 20 7a 49 64 78 53 74 72 5b 69 49 64 78 2b 2b    zIdxStr[iIdx++
9c10: 5d 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 7a 49  ] = op;.      zI
9c20: 64 78 53 74 72 5b 69 49 64 78 2b 2b 5d 20 3d 20  dxStr[iIdx++] = 
9c30: 70 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 31 20 2b  p->iColumn - 1 +
9c40: 20 27 61 27 3b 0a 20 20 20 20 20 20 70 49 64 78   'a';.      pIdx
9c50: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
9c60: 74 55 73 61 67 65 5b 69 69 5d 2e 61 72 67 76 49  tUsage[ii].argvI
9c70: 6e 64 65 78 20 3d 20 28 69 49 64 78 2f 32 29 3b  ndex = (iIdx/2);
9c80: 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
9c90: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
9ca0: 65 5b 69 69 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a  e[ii].omit = 1;.
9cb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 64      }.  }..  pId
9cc0: 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
9cd0: 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  2;.  pIdxInfo->n
9ce0: 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
9cf0: 3d 20 31 3b 0a 20 20 69 66 28 20 69 49 64 78 3e  = 1;.  if( iIdx>
9d00: 30 20 26 26 20 30 3d 3d 28 70 49 64 78 49 6e 66  0 && 0==(pIdxInf
9d10: 6f 2d 3e 69 64 78 53 74 72 20 3d 20 73 71 6c 69  o->idxStr = sqli
9d20: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
9d30: 2c 20 7a 49 64 78 53 74 72 29 29 20 29 7b 0a 20  , zIdxStr)) ){. 
9d40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9d50: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73  _NOMEM;.  }.  as
9d60: 73 65 72 74 28 20 69 49 64 78 3e 3d 30 20 29 3b  sert( iIdx>=0 );
9d70: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
9d80: 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 32 30  imatedCost = (20
9d90: 30 30 30 30 30 2e 30 20 2f 20 28 64 6f 75 62 6c  00000.0 / (doubl
9da0: 65 29 28 69 49 64 78 20 2b 20 31 29 29 3b 0a 20  e)(iIdx + 1));. 
9db0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9dc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
9dd0: 4e 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c 20 76 6f  N-dimensional vo
9de0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 65 6c 6c  lumn of the cell
9df0: 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 2e 0a 2a   stored in *p..*
9e00: 2f 0a 73 74 61 74 69 63 20 66 6c 6f 61 74 20 63  /.static float c
9e10: 65 6c 6c 41 72 65 61 28 52 74 72 65 65 20 2a 70  ellArea(Rtree *p
9e20: 52 74 72 65 65 2c 20 52 74 72 65 65 43 65 6c 6c  Rtree, RtreeCell
9e30: 20 2a 70 29 7b 0a 20 20 66 6c 6f 61 74 20 61 72   *p){.  float ar
9e40: 65 61 20 3d 20 31 2e 30 3b 0a 20 20 69 6e 74 20  ea = 1.0;.  int 
9e50: 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  ii;.  for(ii=0; 
9e60: 69 69 3c 28 70 52 74 72 65 65 2d 3e 6e 44 69 6d  ii<(pRtree->nDim
9e70: 2a 32 29 3b 20 69 69 2b 3d 32 29 7b 0a 20 20 20  *2); ii+=2){.   
9e80: 20 61 72 65 61 20 3d 20 61 72 65 61 20 2a 20 28   area = area * (
9e90: 44 43 4f 4f 52 44 28 70 2d 3e 61 43 6f 6f 72 64  DCOORD(p->aCoord
9ea0: 5b 69 69 2b 31 5d 29 20 2d 20 44 43 4f 4f 52 44  [ii+1]) - DCOORD
9eb0: 28 70 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 29 29  (p->aCoord[ii]))
9ec0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
9ed0: 72 65 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rea;.}../*.** Re
9ee0: 74 75 72 6e 20 74 68 65 20 6d 61 72 67 69 6e 20  turn the margin 
9ef0: 6c 65 6e 67 74 68 20 6f 66 20 63 65 6c 6c 20 70  length of cell p
9f00: 2e 20 54 68 65 20 6d 61 72 67 69 6e 20 6c 65 6e  . The margin len
9f10: 67 74 68 20 69 73 20 74 68 65 20 73 75 6d 0a 2a  gth is the sum.*
9f20: 2a 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 73  * of the objects
9f30: 20 73 69 7a 65 20 69 6e 20 65 61 63 68 20 64 69   size in each di
9f40: 6d 65 6e 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  mension..*/.stat
9f50: 69 63 20 66 6c 6f 61 74 20 63 65 6c 6c 4d 61 72  ic float cellMar
9f60: 67 69 6e 28 52 74 72 65 65 20 2a 70 52 74 72 65  gin(Rtree *pRtre
9f70: 65 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 29  e, RtreeCell *p)
9f80: 7b 0a 20 20 66 6c 6f 61 74 20 6d 61 72 67 69 6e  {.  float margin
9f90: 20 3d 20 30 2e 30 3b 0a 20 20 69 6e 74 20 69 69   = 0.0;.  int ii
9fa0: 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
9fb0: 3c 28 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 32  <(pRtree->nDim*2
9fc0: 29 3b 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 6d  ); ii+=2){.    m
9fd0: 61 72 67 69 6e 20 2b 3d 20 28 44 43 4f 4f 52 44  argin += (DCOORD
9fe0: 28 70 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d  (p->aCoord[ii+1]
9ff0: 29 20 2d 20 44 43 4f 4f 52 44 28 70 2d 3e 61 43  ) - DCOORD(p->aC
a000: 6f 6f 72 64 5b 69 69 5d 29 29 3b 0a 20 20 7d 0a  oord[ii]));.  }.
a010: 20 20 72 65 74 75 72 6e 20 6d 61 72 67 69 6e 3b    return margin;
a020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f 72 65 20  .}../*.** Store 
a030: 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 63 65 6c  the union of cel
a040: 6c 73 20 70 31 20 61 6e 64 20 70 32 20 69 6e 20  ls p1 and p2 in 
a050: 70 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  p1..*/.static vo
a060: 69 64 20 63 65 6c 6c 55 6e 69 6f 6e 28 52 74 72  id cellUnion(Rtr
a070: 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65  ee *pRtree, Rtre
a080: 65 43 65 6c 6c 20 2a 70 31 2c 20 52 74 72 65 65  eCell *p1, Rtree
a090: 43 65 6c 6c 20 2a 70 32 29 7b 0a 20 20 69 6e 74  Cell *p2){.  int
a0a0: 20 69 69 3b 0a 20 20 69 66 28 20 70 52 74 72 65   ii;.  if( pRtre
a0b0: 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52  e->eCoordType==R
a0c0: 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33  TREE_COORD_REAL3
a0d0: 32 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d  2 ){.    for(ii=
a0e0: 30 3b 20 69 69 3c 28 70 52 74 72 65 65 2d 3e 6e  0; ii<(pRtree->n
a0f0: 44 69 6d 2a 32 29 3b 20 69 69 2b 3d 32 29 7b 0a  Dim*2); ii+=2){.
a100: 20 20 20 20 20 20 70 31 2d 3e 61 43 6f 6f 72 64        p1->aCoord
a110: 5b 69 69 5d 2e 66 20 3d 20 4d 49 4e 28 70 31 2d  [ii].f = MIN(p1-
a120: 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e 66 2c 20 70  >aCoord[ii].f, p
a130: 32 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e 66 29  2->aCoord[ii].f)
a140: 3b 0a 20 20 20 20 20 20 70 31 2d 3e 61 43 6f 6f  ;.      p1->aCoo
a150: 72 64 5b 69 69 2b 31 5d 2e 66 20 3d 20 4d 41 58  rd[ii+1].f = MAX
a160: 28 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31  (p1->aCoord[ii+1
a170: 5d 2e 66 2c 20 70 32 2d 3e 61 43 6f 6f 72 64 5b  ].f, p2->aCoord[
a180: 69 69 2b 31 5d 2e 66 29 3b 0a 20 20 20 20 7d 0a  ii+1].f);.    }.
a190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
a1a0: 28 69 69 3d 30 3b 20 69 69 3c 28 70 52 74 72 65  (ii=0; ii<(pRtre
a1b0: 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20 69 69 2b 3d  e->nDim*2); ii+=
a1c0: 32 29 7b 0a 20 20 20 20 20 20 70 31 2d 3e 61 43  2){.      p1->aC
a1d0: 6f 6f 72 64 5b 69 69 5d 2e 69 20 3d 20 4d 49 4e  oord[ii].i = MIN
a1e0: 28 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e  (p1->aCoord[ii].
a1f0: 69 2c 20 70 32 2d 3e 61 43 6f 6f 72 64 5b 69 69  i, p2->aCoord[ii
a200: 5d 2e 69 29 3b 0a 20 20 20 20 20 20 70 31 2d 3e  ].i);.      p1->
a210: 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69 20 3d  aCoord[ii+1].i =
a220: 20 4d 41 58 28 70 31 2d 3e 61 43 6f 6f 72 64 5b   MAX(p1->aCoord[
a230: 69 69 2b 31 5d 2e 69 2c 20 70 32 2d 3e 61 43 6f  ii+1].i, p2->aCo
a240: 6f 72 64 5b 69 69 2b 31 5d 2e 69 29 3b 0a 20 20  ord[ii+1].i);.  
a250: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
a260: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
a270: 74 68 65 20 61 72 65 61 20 63 6f 76 65 72 65 64  the area covered
a280: 20 62 79 20 70 32 20 69 73 20 61 20 73 75 62 73   by p2 is a subs
a290: 65 74 20 6f 66 20 74 68 65 20 61 72 65 61 20 63  et of the area c
a2a0: 6f 76 65 72 65 64 0a 2a 2a 20 62 79 20 70 31 2e  overed.** by p1.
a2b0: 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   False otherwise
a2c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a2d0: 63 65 6c 6c 43 6f 6e 74 61 69 6e 73 28 52 74 72  cellContains(Rtr
a2e0: 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65  ee *pRtree, Rtre
a2f0: 65 43 65 6c 6c 20 2a 70 31 2c 20 52 74 72 65 65  eCell *p1, Rtree
a300: 43 65 6c 6c 20 2a 70 32 29 7b 0a 20 20 69 6e 74  Cell *p2){.  int
a310: 20 69 69 3b 0a 20 20 69 6e 74 20 69 73 49 6e 74   ii;.  int isInt
a320: 20 3d 20 28 70 52 74 72 65 65 2d 3e 65 43 6f 6f   = (pRtree->eCoo
a330: 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f 43 4f  rdType==RTREE_CO
a340: 4f 52 44 5f 49 4e 54 33 32 29 3b 0a 20 20 66 6f  ORD_INT32);.  fo
a350: 72 28 69 69 3d 30 3b 20 69 69 3c 28 70 52 74 72  r(ii=0; ii<(pRtr
a360: 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20 69 69 2b  ee->nDim*2); ii+
a370: 3d 32 29 7b 0a 20 20 20 20 52 74 72 65 65 43 6f  =2){.    RtreeCo
a380: 6f 72 64 20 2a 61 31 20 3d 20 26 70 31 2d 3e 61  ord *a1 = &p1->a
a390: 43 6f 6f 72 64 5b 69 69 5d 3b 0a 20 20 20 20 52  Coord[ii];.    R
a3a0: 74 72 65 65 43 6f 6f 72 64 20 2a 61 32 20 3d 20  treeCoord *a2 = 
a3b0: 26 70 32 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 3b  &p2->aCoord[ii];
a3c0: 0a 20 20 20 20 69 66 28 20 28 21 69 73 49 6e 74  .    if( (!isInt
a3d0: 20 26 26 20 28 61 32 5b 30 5d 2e 66 3c 61 31 5b   && (a2[0].f<a1[
a3e0: 30 5d 2e 66 20 7c 7c 20 61 32 5b 31 5d 2e 66 3e  0].f || a2[1].f>
a3f0: 61 31 5b 31 5d 2e 66 29 29 20 0a 20 20 20 20 20  a1[1].f)) .     
a400: 7c 7c 20 28 20 69 73 49 6e 74 20 26 26 20 28 61  || ( isInt && (a
a410: 32 5b 30 5d 2e 69 3c 61 31 5b 30 5d 2e 69 20 7c  2[0].i<a1[0].i |
a420: 7c 20 61 32 5b 31 5d 2e 69 3e 61 31 5b 31 5d 2e  | a2[1].i>a1[1].
a430: 69 29 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  i)) .    ){.    
a440: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
a450: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
a460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
a470: 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 63 65 6c  n the amount cel
a480: 6c 20 70 20 77 6f 75 6c 64 20 67 72 6f 77 20 62  l p would grow b
a490: 79 20 69 66 20 69 74 20 77 65 72 65 20 75 6e 69  y if it were uni
a4a0: 6f 6e 65 64 20 77 69 74 68 20 70 43 65 6c 6c 2e  oned with pCell.
a4b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 66 6c 6f 61 74  .*/.static float
a4c0: 20 63 65 6c 6c 47 72 6f 77 74 68 28 52 74 72 65   cellGrowth(Rtre
a4d0: 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65  e *pRtree, Rtree
a4e0: 43 65 6c 6c 20 2a 70 2c 20 52 74 72 65 65 43 65  Cell *p, RtreeCe
a4f0: 6c 6c 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 66 6c  ll *pCell){.  fl
a500: 6f 61 74 20 61 72 65 61 3b 0a 20 20 52 74 72 65  oat area;.  Rtre
a510: 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 6d 65  eCell cell;.  me
a520: 6d 63 70 79 28 26 63 65 6c 6c 2c 20 70 2c 20 73  mcpy(&cell, p, s
a530: 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29  izeof(RtreeCell)
a540: 29 3b 0a 20 20 61 72 65 61 20 3d 20 63 65 6c 6c  );.  area = cell
a550: 41 72 65 61 28 70 52 74 72 65 65 2c 20 26 63 65  Area(pRtree, &ce
a560: 6c 6c 29 3b 0a 20 20 63 65 6c 6c 55 6e 69 6f 6e  ll);.  cellUnion
a570: 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c 20  (pRtree, &cell, 
a580: 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  pCell);.  return
a590: 20 28 63 65 6c 6c 41 72 65 61 28 70 52 74 72 65   (cellArea(pRtre
a5a0: 65 2c 20 26 63 65 6c 6c 29 2d 61 72 65 61 29 3b  e, &cell)-area);
a5b0: 0a 7d 0a 0a 23 69 66 20 56 41 52 49 41 4e 54 5f  .}..#if VARIANT_
a5c0: 52 53 54 41 52 54 52 45 45 5f 43 48 4f 4f 53 45  RSTARTREE_CHOOSE
a5d0: 53 55 42 54 52 45 45 20 7c 7c 20 56 41 52 49 41  SUBTREE || VARIA
a5e0: 4e 54 5f 52 53 54 41 52 54 52 45 45 5f 53 50 4c  NT_RSTARTREE_SPL
a5f0: 49 54 0a 73 74 61 74 69 63 20 66 6c 6f 61 74 20  IT.static float 
a600: 63 65 6c 6c 4f 76 65 72 6c 61 70 28 0a 20 20 52  cellOverlap(.  R
a610: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 0a 20  tree *pRtree, . 
a620: 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 2c 20 0a   RtreeCell *p, .
a630: 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61 43 65    RtreeCell *aCe
a640: 6c 6c 2c 20 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  ll, .  int nCell
a650: 2c 20 0a 20 20 69 6e 74 20 69 45 78 63 6c 75 64  , .  int iExclud
a660: 65 0a 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  e.){.  int ii;. 
a670: 20 66 6c 6f 61 74 20 6f 76 65 72 6c 61 70 20 3d   float overlap =
a680: 20 30 2e 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30   0.0;.  for(ii=0
a690: 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b  ; ii<nCell; ii++
a6a0: 29 7b 0a 23 69 66 20 56 41 52 49 41 4e 54 5f 52  ){.#if VARIANT_R
a6b0: 53 54 41 52 54 52 45 45 5f 43 48 4f 4f 53 45 53  STARTREE_CHOOSES
a6c0: 55 42 54 52 45 45 0a 20 20 20 20 69 66 28 20 69  UBTREE.    if( i
a6d0: 69 21 3d 69 45 78 63 6c 75 64 65 20 29 0a 23 65  i!=iExclude ).#e
a6e0: 6c 73 65 0a 20 20 20 20 61 73 73 65 72 74 28 20  lse.    assert( 
a6f0: 69 45 78 63 6c 75 64 65 3d 3d 2d 31 20 29 3b 0a  iExclude==-1 );.
a700: 20 20 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d      UNUSED_PARAM
a710: 45 54 45 52 28 69 45 78 63 6c 75 64 65 29 3b 0a  ETER(iExclude);.
a720: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
a730: 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20     int jj;.     
a740: 20 66 6c 6f 61 74 20 6f 20 3d 20 31 2e 30 3b 0a   float o = 1.0;.
a750: 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
a760: 6a 6a 3c 28 70 52 74 72 65 65 2d 3e 6e 44 69 6d  jj<(pRtree->nDim
a770: 2a 32 29 3b 20 6a 6a 2b 3d 32 29 7b 0a 20 20 20  *2); jj+=2){.   
a780: 20 20 20 20 20 64 6f 75 62 6c 65 20 78 31 3b 0a       double x1;.
a790: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 78          double x
a7a0: 32 3b 0a 0a 20 20 20 20 20 20 20 20 78 31 20 3d  2;..        x1 =
a7b0: 20 4d 41 58 28 44 43 4f 4f 52 44 28 70 2d 3e 61   MAX(DCOORD(p->a
a7c0: 43 6f 6f 72 64 5b 6a 6a 5d 29 2c 20 44 43 4f 4f  Coord[jj]), DCOO
a7d0: 52 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f  RD(aCell[ii].aCo
a7e0: 6f 72 64 5b 6a 6a 5d 29 29 3b 0a 20 20 20 20 20  ord[jj]));.     
a7f0: 20 20 20 78 32 20 3d 20 4d 49 4e 28 44 43 4f 4f     x2 = MIN(DCOO
a800: 52 44 28 70 2d 3e 61 43 6f 6f 72 64 5b 6a 6a 2b  RD(p->aCoord[jj+
a810: 31 5d 29 2c 20 44 43 4f 4f 52 44 28 61 43 65 6c  1]), DCOORD(aCel
a820: 6c 5b 69 69 5d 2e 61 43 6f 6f 72 64 5b 6a 6a 2b  l[ii].aCoord[jj+
a830: 31 5d 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  1]));..        i
a840: 66 28 20 78 32 3c 78 31 20 29 7b 0a 20 20 20 20  f( x2<x1 ){.    
a850: 20 20 20 20 20 20 6f 20 3d 20 30 2e 30 3b 0a 20        o = 0.0;. 
a860: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a870: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a880: 20 20 20 20 20 20 20 20 20 6f 20 3d 20 6f 20 2a           o = o *
a890: 20 28 78 32 2d 78 31 29 3b 0a 20 20 20 20 20 20   (x2-x1);.      
a8a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a8b0: 20 20 6f 76 65 72 6c 61 70 20 2b 3d 20 6f 3b 0a    overlap += o;.
a8c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
a8d0: 72 6e 20 6f 76 65 72 6c 61 70 3b 0a 7d 0a 23 65  rn overlap;.}.#e
a8e0: 6e 64 69 66 0a 0a 23 69 66 20 56 41 52 49 41 4e  ndif..#if VARIAN
a8f0: 54 5f 52 53 54 41 52 54 52 45 45 5f 43 48 4f 4f  T_RSTARTREE_CHOO
a900: 53 45 53 55 42 54 52 45 45 0a 73 74 61 74 69 63  SESUBTREE.static
a910: 20 66 6c 6f 61 74 20 63 65 6c 6c 4f 76 65 72 6c   float cellOverl
a920: 61 70 45 6e 6c 61 72 67 65 6d 65 6e 74 28 0a 20  apEnlargement(. 
a930: 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20   Rtree *pRtree, 
a940: 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 2c  .  RtreeCell *p,
a950: 20 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70   .  RtreeCell *p
a960: 49 6e 73 65 72 74 2c 20 0a 20 20 52 74 72 65 65  Insert, .  Rtree
a970: 43 65 6c 6c 20 2a 61 43 65 6c 6c 2c 20 0a 20 20  Cell *aCell, .  
a980: 69 6e 74 20 6e 43 65 6c 6c 2c 20 0a 20 20 69 6e  int nCell, .  in
a990: 74 20 69 45 78 63 6c 75 64 65 0a 29 7b 0a 20 20  t iExclude.){.  
a9a0: 66 6c 6f 61 74 20 62 65 66 6f 72 65 3b 0a 20 20  float before;.  
a9b0: 66 6c 6f 61 74 20 61 66 74 65 72 3b 0a 20 20 62  float after;.  b
a9c0: 65 66 6f 72 65 20 3d 20 63 65 6c 6c 4f 76 65 72  efore = cellOver
a9d0: 6c 61 70 28 70 52 74 72 65 65 2c 20 70 2c 20 61  lap(pRtree, p, a
a9e0: 43 65 6c 6c 2c 20 6e 43 65 6c 6c 2c 20 69 45 78  Cell, nCell, iEx
a9f0: 63 6c 75 64 65 29 3b 0a 20 20 63 65 6c 6c 55 6e  clude);.  cellUn
aa00: 69 6f 6e 28 70 52 74 72 65 65 2c 20 70 2c 20 70  ion(pRtree, p, p
aa10: 49 6e 73 65 72 74 29 3b 0a 20 20 61 66 74 65 72  Insert);.  after
aa20: 20 3d 20 63 65 6c 6c 4f 76 65 72 6c 61 70 28 70   = cellOverlap(p
aa30: 52 74 72 65 65 2c 20 70 2c 20 61 43 65 6c 6c 2c  Rtree, p, aCell,
aa40: 20 6e 43 65 6c 6c 2c 20 69 45 78 63 6c 75 64 65   nCell, iExclude
aa50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 74 65  );.  return afte
aa60: 72 2d 62 65 66 6f 72 65 3b 0a 7d 0a 23 65 6e 64  r-before;.}.#end
aa70: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
aa80: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
aa90: 6e 74 73 20 74 68 65 20 43 68 6f 6f 73 65 4c 65  nts the ChooseLe
aaa0: 61 66 20 61 6c 67 6f 72 69 74 68 6d 20 66 72 6f  af algorithm fro
aab0: 6d 20 47 75 74 6d 61 6e 5b 38 34 5d 2e 0a 2a 2a  m Gutman[84]..**
aac0: 20 43 68 6f 6f 73 65 53 75 62 54 72 65 65 20 69   ChooseSubTree i
aad0: 6e 20 72 2a 74 72 65 65 20 74 65 72 6d 69 6e 6f  n r*tree termino
aae0: 6c 6f 67 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  logy..*/.static 
aaf0: 69 6e 74 20 43 68 6f 6f 73 65 4c 65 61 66 28 0a  int ChooseLeaf(.
ab00: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab20: 2a 20 52 74 72 65 65 20 74 61 62 6c 65 20 2a 2f  * Rtree table */
ab30: 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43  .  RtreeCell *pC
ab40: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
ab50: 2f 2a 20 43 65 6c 6c 20 74 6f 20 69 6e 73 65 72  /* Cell to inser
ab60: 74 20 69 6e 74 6f 20 72 74 72 65 65 20 2a 2f 0a  t into rtree */.
ab70: 20 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20 20    int iHeight,  
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab90: 2a 20 48 65 69 67 68 74 20 6f 66 20 73 75 62 2d  * Height of sub-
aba0: 74 72 65 65 20 72 6f 6f 74 65 64 20 61 74 20 70  tree rooted at p
abb0: 43 65 6c 6c 20 2a 2f 0a 20 20 52 74 72 65 65 4e  Cell */.  RtreeN
abc0: 6f 64 65 20 2a 2a 70 70 4c 65 61 66 20 20 20 20  ode **ppLeaf    
abd0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
abe0: 65 6c 65 63 74 65 64 20 6c 65 61 66 20 70 61 67  elected leaf pag
abf0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
ac00: 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 52 74  ;.  int ii;.  Rt
ac10: 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a  reeNode *pNode;.
ac20: 20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71 75 69    rc = nodeAcqui
ac30: 72 65 28 70 52 74 72 65 65 2c 20 31 2c 20 30 2c  re(pRtree, 1, 0,
ac40: 20 26 70 4e 6f 64 65 29 3b 0a 0a 20 20 66 6f 72   &pNode);..  for
ac50: 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
ac60: 45 5f 4f 4b 20 26 26 20 69 69 3c 28 70 52 74 72  E_OK && ii<(pRtr
ac70: 65 65 2d 3e 69 44 65 70 74 68 2d 69 48 65 69 67  ee->iDepth-iHeig
ac80: 68 74 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ht); ii++){.    
ac90: 69 6e 74 20 69 43 65 6c 6c 3b 0a 20 20 20 20 73  int iCell;.    s
aca0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 65  qlite3_int64 iBe
acb0: 73 74 3b 0a 0a 20 20 20 20 66 6c 6f 61 74 20 66  st;..    float f
acc0: 4d 69 6e 47 72 6f 77 74 68 3b 0a 20 20 20 20 66  MinGrowth;.    f
acd0: 6c 6f 61 74 20 66 4d 69 6e 41 72 65 61 3b 0a 20  loat fMinArea;. 
ace0: 20 20 20 66 6c 6f 61 74 20 66 4d 69 6e 4f 76 65     float fMinOve
acf0: 72 6c 61 70 3b 0a 0a 20 20 20 20 69 6e 74 20 6e  rlap;..    int n
ad00: 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f  Cell = NCELL(pNo
ad10: 64 65 29 3b 0a 20 20 20 20 52 74 72 65 65 43 65  de);.    RtreeCe
ad20: 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20 20 52 74 72  ll cell;.    Rtr
ad30: 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64 3b 0a  eeNode *pChild;.
ad40: 0a 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20 2a  .    RtreeCell *
ad50: 61 43 65 6c 6c 20 3d 20 30 3b 0a 0a 23 69 66 20  aCell = 0;..#if 
ad60: 56 41 52 49 41 4e 54 5f 52 53 54 41 52 54 52 45  VARIANT_RSTARTRE
ad70: 45 5f 43 48 4f 4f 53 45 53 55 42 54 52 45 45 0a  E_CHOOSESUBTREE.
ad80: 20 20 20 20 69 66 28 20 69 69 3d 3d 28 70 52 74      if( ii==(pRt
ad90: 72 65 65 2d 3e 69 44 65 70 74 68 2d 31 29 20 29  ree->iDepth-1) )
ada0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a  {.      int jj;.
adb0: 20 20 20 20 20 20 61 43 65 6c 6c 20 3d 20 73 71        aCell = sq
adc0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
add0: 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29 2a 6e  eof(RtreeCell)*n
ade0: 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  Cell);.      if(
adf0: 20 21 61 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20   !aCell ){.     
ae00: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
ae10: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 6e 6f  OMEM;.        no
ae20: 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65  deRelease(pRtree
ae30: 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  , pNode);.      
ae40: 20 20 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20    pNode = 0;.   
ae50: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
ae60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
ae70: 28 6a 6a 3d 30 3b 20 6a 6a 3c 6e 43 65 6c 6c 3b  (jj=0; jj<nCell;
ae80: 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
ae90: 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72  nodeGetCell(pRtr
aea0: 65 65 2c 20 70 4e 6f 64 65 2c 20 6a 6a 2c 20 26  ee, pNode, jj, &
aeb0: 61 43 65 6c 6c 5b 6a 6a 5d 29 3b 0a 20 20 20 20  aCell[jj]);.    
aec0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
aed0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
aee0: 74 68 65 20 63 68 69 6c 64 20 6e 6f 64 65 20 77  the child node w
aef0: 68 69 63 68 20 77 69 6c 6c 20 62 65 20 65 6e 6c  hich will be enl
af00: 61 72 67 65 64 20 74 68 65 20 6c 65 61 73 74 20  arged the least 
af10: 69 66 20 70 43 65 6c 6c 0a 20 20 20 20 2a 2a 20  if pCell.    ** 
af20: 69 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  is inserted into
af30: 20 69 74 2e 20 52 65 73 6f 6c 76 65 20 74 69 65   it. Resolve tie
af40: 73 20 62 79 20 63 68 6f 6f 73 69 6e 67 20 74 68  s by choosing th
af50: 65 20 65 6e 74 72 79 20 77 69 74 68 0a 20 20 20  e entry with.   
af60: 20 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   ** the smallest
af70: 20 61 72 65 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   area..    */.  
af80: 20 20 66 6f 72 28 69 43 65 6c 6c 3d 30 3b 20 69    for(iCell=0; i
af90: 43 65 6c 6c 3c 6e 43 65 6c 6c 3b 20 69 43 65 6c  Cell<nCell; iCel
afa0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  l++){.      int 
afb0: 62 42 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  bBest = 0;.     
afc0: 20 66 6c 6f 61 74 20 67 72 6f 77 74 68 3b 0a 20   float growth;. 
afd0: 20 20 20 20 20 66 6c 6f 61 74 20 61 72 65 61 3b       float area;
afe0: 0a 20 20 20 20 20 20 66 6c 6f 61 74 20 6f 76 65  .      float ove
aff0: 72 6c 61 70 20 3d 20 30 2e 30 3b 0a 20 20 20 20  rlap = 0.0;.    
b000: 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70 52    nodeGetCell(pR
b010: 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69 43 65  tree, pNode, iCe
b020: 6c 6c 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 20 20  ll, &cell);.    
b030: 20 20 67 72 6f 77 74 68 20 3d 20 63 65 6c 6c 47    growth = cellG
b040: 72 6f 77 74 68 28 70 52 74 72 65 65 2c 20 26 63  rowth(pRtree, &c
b050: 65 6c 6c 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ell, pCell);.   
b060: 20 20 20 61 72 65 61 20 3d 20 63 65 6c 6c 41 72     area = cellAr
b070: 65 61 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c  ea(pRtree, &cell
b080: 29 3b 0a 0a 23 69 66 20 56 41 52 49 41 4e 54 5f  );..#if VARIANT_
b090: 52 53 54 41 52 54 52 45 45 5f 43 48 4f 4f 53 45  RSTARTREE_CHOOSE
b0a0: 53 55 42 54 52 45 45 0a 20 20 20 20 20 20 69 66  SUBTREE.      if
b0b0: 28 20 69 69 3d 3d 28 70 52 74 72 65 65 2d 3e 69  ( ii==(pRtree->i
b0c0: 44 65 70 74 68 2d 31 29 20 29 7b 0a 20 20 20 20  Depth-1) ){.    
b0d0: 20 20 20 20 6f 76 65 72 6c 61 70 20 3d 20 63 65      overlap = ce
b0e0: 6c 6c 4f 76 65 72 6c 61 70 45 6e 6c 61 72 67 65  llOverlapEnlarge
b0f0: 6d 65 6e 74 28 70 52 74 72 65 65 2c 26 63 65 6c  ment(pRtree,&cel
b100: 6c 2c 70 43 65 6c 6c 2c 61 43 65 6c 6c 2c 6e 43  l,pCell,aCell,nC
b110: 65 6c 6c 2c 69 43 65 6c 6c 29 3b 0a 20 20 20 20  ell,iCell);.    
b120: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69    }.      if( (i
b130: 43 65 6c 6c 3d 3d 30 29 20 0a 20 20 20 20 20 20  Cell==0) .      
b140: 20 7c 7c 20 28 6f 76 65 72 6c 61 70 3c 66 4d 69   || (overlap<fMi
b150: 6e 4f 76 65 72 6c 61 70 29 20 0a 20 20 20 20 20  nOverlap) .     
b160: 20 20 7c 7c 20 28 6f 76 65 72 6c 61 70 3d 3d 66    || (overlap==f
b170: 4d 69 6e 4f 76 65 72 6c 61 70 20 26 26 20 67 72  MinOverlap && gr
b180: 6f 77 74 68 3c 66 4d 69 6e 47 72 6f 77 74 68 29  owth<fMinGrowth)
b190: 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f 76 65 72  .       || (over
b1a0: 6c 61 70 3d 3d 66 4d 69 6e 4f 76 65 72 6c 61 70  lap==fMinOverlap
b1b0: 20 26 26 20 67 72 6f 77 74 68 3d 3d 66 4d 69 6e   && growth==fMin
b1c0: 47 72 6f 77 74 68 20 26 26 20 61 72 65 61 3c 66  Growth && area<f
b1d0: 4d 69 6e 41 72 65 61 29 0a 20 20 20 20 20 20 29  MinArea).      )
b1e0: 7b 0a 20 20 20 20 20 20 20 20 62 42 65 73 74 20  {.        bBest 
b1f0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c  = 1;.      }.#el
b200: 73 65 0a 20 20 20 20 20 20 69 66 28 20 69 43 65  se.      if( iCe
b210: 6c 6c 3d 3d 30 7c 7c 67 72 6f 77 74 68 3c 66 4d  ll==0||growth<fM
b220: 69 6e 47 72 6f 77 74 68 7c 7c 28 67 72 6f 77 74  inGrowth||(growt
b230: 68 3d 3d 66 4d 69 6e 47 72 6f 77 74 68 20 26 26  h==fMinGrowth &&
b240: 20 61 72 65 61 3c 66 4d 69 6e 41 72 65 61 29 20   area<fMinArea) 
b250: 29 7b 0a 20 20 20 20 20 20 20 20 62 42 65 73 74  ){.        bBest
b260: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 1;.      }.#e
b270: 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 62  ndif.      if( b
b280: 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
b290: 66 4d 69 6e 4f 76 65 72 6c 61 70 20 3d 20 6f 76  fMinOverlap = ov
b2a0: 65 72 6c 61 70 3b 0a 20 20 20 20 20 20 20 20 66  erlap;.        f
b2b0: 4d 69 6e 47 72 6f 77 74 68 20 3d 20 67 72 6f 77  MinGrowth = grow
b2c0: 74 68 3b 0a 20 20 20 20 20 20 20 20 66 4d 69 6e  th;.        fMin
b2d0: 41 72 65 61 20 3d 20 61 72 65 61 3b 0a 20 20 20  Area = area;.   
b2e0: 20 20 20 20 20 69 42 65 73 74 20 3d 20 63 65 6c       iBest = cel
b2f0: 6c 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  l.iRowid;.      
b300: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  }.    }..    sql
b310: 69 74 65 33 5f 66 72 65 65 28 61 43 65 6c 6c 29  ite3_free(aCell)
b320: 3b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 41  ;.    rc = nodeA
b330: 63 71 75 69 72 65 28 70 52 74 72 65 65 2c 20 69  cquire(pRtree, i
b340: 42 65 73 74 2c 20 70 4e 6f 64 65 2c 20 26 70 43  Best, pNode, &pC
b350: 68 69 6c 64 29 3b 0a 20 20 20 20 6e 6f 64 65 52  hild);.    nodeR
b360: 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
b370: 4e 6f 64 65 29 3b 0a 20 20 20 20 70 4e 6f 64 65  Node);.    pNode
b380: 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 7d 0a 0a   = pChild;.  }..
b390: 20 20 2a 70 70 4c 65 61 66 20 3d 20 70 4e 6f 64    *ppLeaf = pNod
b3a0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
b3b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 65 6c 6c 20  }../*.** A cell 
b3c0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 63 6f  with the same co
b3d0: 6e 74 65 6e 74 20 61 73 20 70 43 65 6c 6c 20 68  ntent as pCell h
b3e0: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73  as just been ins
b3f0: 65 72 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 74 68  erted into.** th
b400: 65 20 6e 6f 64 65 20 70 4e 6f 64 65 2e 20 54 68  e node pNode. Th
b410: 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61  is function upda
b420: 74 65 73 20 74 68 65 20 62 6f 75 6e 64 69 6e 67  tes the bounding
b430: 20 62 6f 78 20 63 65 6c 6c 73 20 69 6e 0a 2a 2a   box cells in.**
b440: 20 61 6c 6c 20 61 6e 63 65 73 74 6f 72 20 65 6c   all ancestor el
b450: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
b460: 63 20 69 6e 74 20 41 64 6a 75 73 74 54 72 65 65  c int AdjustTree
b470: 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  (.  Rtree *pRtre
b480: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
b490: 20 20 20 20 20 20 2f 2a 20 52 74 72 65 65 20 74        /* Rtree t
b4a0: 61 62 6c 65 20 2a 2f 0a 20 20 52 74 72 65 65 4e  able */.  RtreeN
b4b0: 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20  ode *pNode,     
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b4d0: 64 6a 75 73 74 20 61 6e 63 65 73 74 72 79 20 6f  djust ancestry o
b4e0: 66 20 74 68 69 73 20 6e 6f 64 65 2e 20 2a 2f 0a  f this node. */.
b4f0: 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43 65    RtreeCell *pCe
b500: 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ll              
b510: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 65 6c 6c      /* This cell
b520: 20 77 61 73 20 6a 75 73 74 20 69 6e 73 65 72 74   was just insert
b530: 65 64 20 2a 2f 0a 29 7b 0a 20 20 52 74 72 65 65  ed */.){.  Rtree
b540: 4e 6f 64 65 20 2a 70 20 3d 20 70 4e 6f 64 65 3b  Node *p = pNode;
b550: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 50 61  .  while( p->pPa
b560: 72 65 6e 74 20 29 7b 0a 20 20 20 20 52 74 72 65  rent ){.    Rtre
b570: 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 20 3d  eNode *pParent =
b580: 20 70 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20   p->pParent;.   
b590: 20 52 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b   RtreeCell cell;
b5a0: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 3b 0a  .    int iCell;.
b5b0: 0a 20 20 20 20 69 66 28 20 6e 6f 64 65 50 61 72  .    if( nodePar
b5c0: 65 6e 74 49 6e 64 65 78 28 70 52 74 72 65 65 2c  entIndex(pRtree,
b5d0: 20 70 2c 20 26 69 43 65 6c 6c 29 20 29 7b 0a 20   p, &iCell) ){. 
b5e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
b5f0: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
b600: 7d 0a 0a 20 20 20 20 6e 6f 64 65 47 65 74 43 65  }..    nodeGetCe
b610: 6c 6c 28 70 52 74 72 65 65 2c 20 70 50 61 72 65  ll(pRtree, pPare
b620: 6e 74 2c 20 69 43 65 6c 6c 2c 20 26 63 65 6c 6c  nt, iCell, &cell
b630: 29 3b 0a 20 20 20 20 69 66 28 20 21 63 65 6c 6c  );.    if( !cell
b640: 43 6f 6e 74 61 69 6e 73 28 70 52 74 72 65 65 2c  Contains(pRtree,
b650: 20 26 63 65 6c 6c 2c 20 70 43 65 6c 6c 29 20 29   &cell, pCell) )
b660: 7b 0a 20 20 20 20 20 20 63 65 6c 6c 55 6e 69 6f  {.      cellUnio
b670: 6e 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c  n(pRtree, &cell,
b680: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 6e   pCell);.      n
b690: 6f 64 65 4f 76 65 72 77 72 69 74 65 43 65 6c 6c  odeOverwriteCell
b6a0: 28 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74  (pRtree, pParent
b6b0: 2c 20 26 63 65 6c 6c 2c 20 69 43 65 6c 6c 29 3b  , &cell, iCell);
b6c0: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 70 20 3d  .    }. .    p =
b6d0: 20 70 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 20 20   pParent;.  }.  
b6e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b6f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
b700: 20 6d 61 70 70 69 6e 67 20 28 69 52 6f 77 69 64   mapping (iRowid
b710: 2d 3e 69 4e 6f 64 65 29 20 74 6f 20 74 68 65 20  ->iNode) to the 
b720: 3c 72 74 72 65 65 3e 5f 72 6f 77 69 64 20 74 61  <rtree>_rowid ta
b730: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
b740: 6e 74 20 72 6f 77 69 64 57 72 69 74 65 28 52 74  nt rowidWrite(Rt
b750: 72 65 65 20 2a 70 52 74 72 65 65 2c 20 73 71 6c  ree *pRtree, sql
b760: 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69  ite3_int64 iRowi
b770: 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
b780: 20 69 4e 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74   iNode){.  sqlit
b790: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52  e3_bind_int64(pR
b7a0: 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69  tree->pWriteRowi
b7b0: 64 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20  d, 1, iRowid);. 
b7c0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
b7d0: 74 36 34 28 70 52 74 72 65 65 2d 3e 70 57 72 69  t64(pRtree->pWri
b7e0: 74 65 52 6f 77 69 64 2c 20 32 2c 20 69 4e 6f 64  teRowid, 2, iNod
b7f0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  e);.  sqlite3_st
b800: 65 70 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74  ep(pRtree->pWrit
b810: 65 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72  eRowid);.  retur
b820: 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  n sqlite3_reset(
b830: 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f  pRtree->pWriteRo
b840: 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  wid);.}../*.** W
b850: 72 69 74 65 20 6d 61 70 70 69 6e 67 20 28 69 4e  rite mapping (iN
b860: 6f 64 65 2d 3e 69 50 61 72 29 20 74 6f 20 74 68  ode->iPar) to th
b870: 65 20 3c 72 74 72 65 65 3e 5f 70 61 72 65 6e 74  e <rtree>_parent
b880: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
b890: 63 20 69 6e 74 20 70 61 72 65 6e 74 57 72 69 74  c int parentWrit
b8a0: 65 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  e(Rtree *pRtree,
b8b0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
b8c0: 4e 6f 64 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  Node, sqlite3_in
b8d0: 74 36 34 20 69 50 61 72 29 7b 0a 20 20 73 71 6c  t64 iPar){.  sql
b8e0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
b8f0: 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61  pRtree->pWritePa
b900: 72 65 6e 74 2c 20 31 2c 20 69 4e 6f 64 65 29 3b  rent, 1, iNode);
b910: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
b920: 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70 57  int64(pRtree->pW
b930: 72 69 74 65 50 61 72 65 6e 74 2c 20 32 2c 20 69  riteParent, 2, i
b940: 50 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Par);.  sqlite3_
b950: 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70 57 72  step(pRtree->pWr
b960: 69 74 65 50 61 72 65 6e 74 29 3b 0a 20 20 72 65  iteParent);.  re
b970: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 73  turn sqlite3_res
b980: 65 74 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74  et(pRtree->pWrit
b990: 65 50 61 72 65 6e 74 29 3b 0a 7d 0a 0a 73 74 61  eParent);.}..sta
b9a0: 74 69 63 20 69 6e 74 20 72 74 72 65 65 49 6e 73  tic int rtreeIns
b9b0: 65 72 74 43 65 6c 6c 28 52 74 72 65 65 20 2a 2c  ertCell(Rtree *,
b9c0: 20 52 74 72 65 65 4e 6f 64 65 20 2a 2c 20 52 74   RtreeNode *, Rt
b9d0: 72 65 65 43 65 6c 6c 20 2a 2c 20 69 6e 74 29 3b  reeCell *, int);
b9e0: 0a 0a 23 69 66 20 56 41 52 49 41 4e 54 5f 47 55  ..#if VARIANT_GU
b9f0: 54 54 4d 41 4e 5f 4c 49 4e 45 41 52 5f 53 50 4c  TTMAN_LINEAR_SPL
ba00: 49 54 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  IT./*.** Impleme
ba10: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
ba20: 69 6e 65 61 72 20 76 61 72 69 61 6e 74 20 6f 66  inear variant of
ba30: 20 74 68 65 20 50 69 63 6b 4e 65 78 74 28 29 20   the PickNext() 
ba40: 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a  function from.**
ba50: 20 47 75 74 74 6d 61 6e 5b 38 34 5d 2e 0a 2a 2f   Guttman[84]..*/
ba60: 0a 73 74 61 74 69 63 20 52 74 72 65 65 43 65 6c  .static RtreeCel
ba70: 6c 20 2a 4c 69 6e 65 61 72 50 69 63 6b 4e 65 78  l *LinearPickNex
ba80: 74 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  t(.  Rtree *pRtr
ba90: 65 65 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  ee,.  RtreeCell 
baa0: 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 6e  *aCell, .  int n
bab0: 43 65 6c 6c 2c 20 0a 20 20 52 74 72 65 65 43 65  Cell, .  RtreeCe
bac0: 6c 6c 20 2a 70 4c 65 66 74 42 6f 78 2c 20 0a 20  ll *pLeftBox, . 
bad0: 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 52 69 67   RtreeCell *pRig
bae0: 68 74 42 6f 78 2c 0a 20 20 69 6e 74 20 2a 61 69  htBox,.  int *ai
baf0: 55 73 65 64 0a 29 7b 0a 20 20 69 6e 74 20 69 69  Used.){.  int ii
bb00: 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 61 69  ;.  for(ii=0; ai
bb10: 55 73 65 64 5b 69 69 5d 3b 20 69 69 2b 2b 29 3b  Used[ii]; ii++);
bb20: 0a 20 20 61 69 55 73 65 64 5b 69 69 5d 20 3d 20  .  aiUsed[ii] = 
bb30: 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 61 43 65  1;.  return &aCe
bb40: 6c 6c 5b 69 69 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ll[ii];.}../*.**
bb50: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
bb60: 6f 66 20 74 68 65 20 6c 69 6e 65 61 72 20 76 61  of the linear va
bb70: 72 69 61 6e 74 20 6f 66 20 74 68 65 20 50 69 63  riant of the Pic
bb80: 6b 53 65 65 64 73 28 29 20 66 75 6e 63 74 69 6f  kSeeds() functio
bb90: 6e 20 66 72 6f 6d 0a 2a 2a 20 47 75 74 74 6d 61  n from.** Guttma
bba0: 6e 5b 38 34 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63  n[84]..*/.static
bbb0: 20 76 6f 69 64 20 4c 69 6e 65 61 72 50 69 63 6b   void LinearPick
bbc0: 53 65 65 64 73 28 0a 20 20 52 74 72 65 65 20 2a  Seeds(.  Rtree *
bbd0: 70 52 74 72 65 65 2c 0a 20 20 52 74 72 65 65 43  pRtree,.  RtreeC
bbe0: 65 6c 6c 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69  ell *aCell, .  i
bbf0: 6e 74 20 6e 43 65 6c 6c 2c 20 0a 20 20 69 6e 74  nt nCell, .  int
bc00: 20 2a 70 69 4c 65 66 74 53 65 65 64 2c 20 0a 20   *piLeftSeed, . 
bc10: 20 69 6e 74 20 2a 70 69 52 69 67 68 74 53 65 65   int *piRightSee
bc20: 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  d.){.  int i;.  
bc30: 69 6e 74 20 69 4c 65 66 74 53 65 65 64 20 3d 20  int iLeftSeed = 
bc40: 30 3b 0a 20 20 69 6e 74 20 69 52 69 67 68 74 53  0;.  int iRightS
bc50: 65 65 64 20 3d 20 31 3b 0a 20 20 66 6c 6f 61 74  eed = 1;.  float
bc60: 20 6d 61 78 4e 6f 72 6d 61 6c 49 6e 6e 65 72 57   maxNormalInnerW
bc70: 69 64 74 68 20 3d 20 30 2e 30 3b 0a 0a 20 20 2f  idth = 0.0;..  /
bc80: 2a 20 50 69 63 6b 20 74 77 6f 20 22 73 65 65 64  * Pick two "seed
bc90: 22 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65  " cells from the
bca0: 20 61 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 2e   array of cells.
bcb0: 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 75   The algorithm u
bcc0: 73 65 64 0a 20 20 2a 2a 20 68 65 72 65 20 69 73  sed.  ** here is
bcd0: 20 74 68 65 20 4c 69 6e 65 61 72 50 69 63 6b 53   the LinearPickS
bce0: 65 65 64 73 20 61 6c 67 6f 72 69 74 68 6d 20 66  eeds algorithm f
bcf0: 72 6f 6d 20 47 75 74 6d 61 6e 5b 31 39 38 34 5d  rom Gutman[1984]
bd00: 2e 20 54 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  . The .  ** indi
bd10: 63 65 73 20 6f 66 20 74 68 65 20 74 77 6f 20 73  ces of the two s
bd20: 65 65 64 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  eed cells in the
bd30: 20 61 72 72 61 79 20 61 72 65 20 73 74 6f 72 65   array are store
bd40: 64 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20  d in local.  ** 
bd50: 76 61 72 69 61 62 6c 65 73 20 69 4c 65 66 74 53  variables iLeftS
bd60: 65 65 6b 20 61 6e 64 20 69 52 69 67 68 74 53 65  eek and iRightSe
bd70: 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ed..  */.  for(i
bd80: 3d 30 3b 20 69 3c 70 52 74 72 65 65 2d 3e 6e 44  =0; i<pRtree->nD
bd90: 69 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6c  im; i++){.    fl
bda0: 6f 61 74 20 78 31 20 3d 20 44 43 4f 4f 52 44 28  oat x1 = DCOORD(
bdb0: 61 43 65 6c 6c 5b 30 5d 2e 61 43 6f 6f 72 64 5b  aCell[0].aCoord[
bdc0: 69 2a 32 5d 29 3b 0a 20 20 20 20 66 6c 6f 61 74  i*2]);.    float
bdd0: 20 78 32 20 3d 20 44 43 4f 4f 52 44 28 61 43 65   x2 = DCOORD(aCe
bde0: 6c 6c 5b 30 5d 2e 61 43 6f 6f 72 64 5b 69 2a 32  ll[0].aCoord[i*2
bdf0: 2b 31 5d 29 3b 0a 20 20 20 20 66 6c 6f 61 74 20  +1]);.    float 
be00: 78 33 20 3d 20 78 31 3b 0a 20 20 20 20 66 6c 6f  x3 = x1;.    flo
be10: 61 74 20 78 34 20 3d 20 78 32 3b 0a 20 20 20 20  at x4 = x2;.    
be20: 69 6e 74 20 6a 6a 3b 0a 0a 20 20 20 20 69 6e 74  int jj;..    int
be30: 20 69 43 65 6c 6c 4c 65 66 74 20 3d 20 30 3b 0a   iCellLeft = 0;.
be40: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 52 69 67      int iCellRig
be50: 68 74 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72  ht = 0;..    for
be60: 28 6a 6a 3d 31 3b 20 6a 6a 3c 6e 43 65 6c 6c 3b  (jj=1; jj<nCell;
be70: 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6c   jj++){.      fl
be80: 6f 61 74 20 6c 65 66 74 20 3d 20 44 43 4f 4f 52  oat left = DCOOR
be90: 44 28 61 43 65 6c 6c 5b 6a 6a 5d 2e 61 43 6f 6f  D(aCell[jj].aCoo
bea0: 72 64 5b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  rd[i*2]);.      
beb0: 66 6c 6f 61 74 20 72 69 67 68 74 20 3d 20 44 43  float right = DC
bec0: 4f 4f 52 44 28 61 43 65 6c 6c 5b 6a 6a 5d 2e 61  OORD(aCell[jj].a
bed0: 43 6f 6f 72 64 5b 69 2a 32 2b 31 5d 29 3b 0a 0a  Coord[i*2+1]);..
bee0: 20 20 20 20 20 20 69 66 28 20 6c 65 66 74 3c 78        if( left<x
bef0: 31 20 29 20 78 31 20 3d 20 6c 65 66 74 3b 0a 20  1 ) x1 = left;. 
bf00: 20 20 20 20 20 69 66 28 20 72 69 67 68 74 3e 78       if( right>x
bf10: 34 20 29 20 78 34 20 3d 20 72 69 67 68 74 3b 0a  4 ) x4 = right;.
bf20: 20 20 20 20 20 20 69 66 28 20 6c 65 66 74 3e 78        if( left>x
bf30: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 78 33 20  3 ){.        x3 
bf40: 3d 20 6c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  = left;.        
bf50: 69 43 65 6c 6c 52 69 67 68 74 20 3d 20 6a 6a 3b  iCellRight = jj;
bf60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
bf70: 66 28 20 72 69 67 68 74 3c 78 32 20 29 7b 0a 20  f( right<x2 ){. 
bf80: 20 20 20 20 20 20 20 78 32 20 3d 20 72 69 67 68         x2 = righ
bf90: 74 3b 0a 20 20 20 20 20 20 20 20 69 43 65 6c 6c  t;.        iCell
bfa0: 4c 65 66 74 20 3d 20 6a 6a 3b 0a 20 20 20 20 20  Left = jj;.     
bfb0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
bfc0: 28 20 78 34 21 3d 78 31 20 29 7b 0a 20 20 20 20  ( x4!=x1 ){.    
bfd0: 20 20 66 6c 6f 61 74 20 6e 6f 72 6d 61 6c 77 69    float normalwi
bfe0: 64 74 68 20 3d 20 28 78 33 20 2d 20 78 32 29 20  dth = (x3 - x2) 
bff0: 2f 20 28 78 34 20 2d 20 78 31 29 3b 0a 20 20 20  / (x4 - x1);.   
c000: 20 20 20 69 66 28 20 6e 6f 72 6d 61 6c 77 69 64     if( normalwid
c010: 74 68 3e 6d 61 78 4e 6f 72 6d 61 6c 49 6e 6e 65  th>maxNormalInne
c020: 72 57 69 64 74 68 20 29 7b 0a 20 20 20 20 20 20  rWidth ){.      
c030: 20 20 69 4c 65 66 74 53 65 65 64 20 3d 20 69 43    iLeftSeed = iC
c040: 65 6c 6c 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ellLeft;.       
c050: 20 69 52 69 67 68 74 53 65 65 64 20 3d 20 69 43   iRightSeed = iC
c060: 65 6c 6c 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ellRight;.      
c070: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  }.    }.  }..  *
c080: 70 69 4c 65 66 74 53 65 65 64 20 3d 20 69 4c 65  piLeftSeed = iLe
c090: 66 74 53 65 65 64 3b 0a 20 20 2a 70 69 52 69 67  ftSeed;.  *piRig
c0a0: 68 74 53 65 65 64 20 3d 20 69 52 69 67 68 74 53  htSeed = iRightS
c0b0: 65 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eed;.}.#endif /*
c0c0: 20 56 41 52 49 41 4e 54 5f 47 55 54 54 4d 41 4e   VARIANT_GUTTMAN
c0d0: 5f 4c 49 4e 45 41 52 5f 53 50 4c 49 54 20 2a 2f  _LINEAR_SPLIT */
c0e0: 0a 0a 23 69 66 20 56 41 52 49 41 4e 54 5f 47 55  ..#if VARIANT_GU
c0f0: 54 54 4d 41 4e 5f 51 55 41 44 52 41 54 49 43 5f  TTMAN_QUADRATIC_
c100: 53 50 4c 49 54 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  SPLIT./*.** Impl
c110: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
c120: 65 20 71 75 61 64 72 61 74 69 63 20 76 61 72 69  e quadratic vari
c130: 61 6e 74 20 6f 66 20 74 68 65 20 50 69 63 6b 4e  ant of the PickN
c140: 65 78 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ext() function f
c150: 72 6f 6d 0a 2a 2a 20 47 75 74 74 6d 61 6e 5b 38  rom.** Guttman[8
c160: 34 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74  4]..*/.static Rt
c170: 72 65 65 43 65 6c 6c 20 2a 51 75 61 64 72 61 74  reeCell *Quadrat
c180: 69 63 50 69 63 6b 4e 65 78 74 28 0a 20 20 52 74  icPickNext(.  Rt
c190: 72 65 65 20 2a 70 52 74 72 65 65 2c 0a 20 20 52  ree *pRtree,.  R
c1a0: 74 72 65 65 43 65 6c 6c 20 2a 61 43 65 6c 6c 2c  treeCell *aCell,
c1b0: 20 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 0a   .  int nCell, .
c1c0: 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 4c 65    RtreeCell *pLe
c1d0: 66 74 42 6f 78 2c 20 0a 20 20 52 74 72 65 65 43  ftBox, .  RtreeC
c1e0: 65 6c 6c 20 2a 70 52 69 67 68 74 42 6f 78 2c 0a  ell *pRightBox,.
c1f0: 20 20 69 6e 74 20 2a 61 69 55 73 65 64 0a 29 7b    int *aiUsed.){
c200: 0a 20 20 23 64 65 66 69 6e 65 20 46 41 42 53 28  .  #define FABS(
c210: 61 29 20 28 28 61 29 3c 30 2e 30 3f 2d 31 2e 30  a) ((a)<0.0?-1.0
c220: 2a 28 61 29 3a 28 61 29 29 0a 0a 20 20 69 6e 74  *(a):(a))..  int
c230: 20 69 53 65 6c 65 63 74 20 3d 20 2d 31 3b 0a 20   iSelect = -1;. 
c240: 20 66 6c 6f 61 74 20 66 44 69 66 66 3b 0a 20 20   float fDiff;.  
c250: 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28 69 69  int ii;.  for(ii
c260: 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69  =0; ii<nCell; ii
c270: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 69 55  ++){.    if( aiU
c280: 73 65 64 5b 69 69 5d 3d 3d 30 20 29 7b 0a 20 20  sed[ii]==0 ){.  
c290: 20 20 20 20 66 6c 6f 61 74 20 6c 65 66 74 20 3d      float left =
c2a0: 20 63 65 6c 6c 47 72 6f 77 74 68 28 70 52 74 72   cellGrowth(pRtr
c2b0: 65 65 2c 20 70 4c 65 66 74 42 6f 78 2c 20 26 61  ee, pLeftBox, &a
c2c0: 43 65 6c 6c 5b 69 69 5d 29 3b 0a 20 20 20 20 20  Cell[ii]);.     
c2d0: 20 66 6c 6f 61 74 20 72 69 67 68 74 20 3d 20 63   float right = c
c2e0: 65 6c 6c 47 72 6f 77 74 68 28 70 52 74 72 65 65  ellGrowth(pRtree
c2f0: 2c 20 70 4c 65 66 74 42 6f 78 2c 20 26 61 43 65  , pLeftBox, &aCe
c300: 6c 6c 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 66  ll[ii]);.      f
c310: 6c 6f 61 74 20 64 69 66 66 20 3d 20 46 41 42 53  loat diff = FABS
c320: 28 72 69 67 68 74 2d 6c 65 66 74 29 3b 0a 20 20  (right-left);.  
c330: 20 20 20 20 69 66 28 20 69 53 65 6c 65 63 74 3c      if( iSelect<
c340: 30 20 7c 7c 20 64 69 66 66 3e 66 44 69 66 66 20  0 || diff>fDiff 
c350: 29 7b 0a 20 20 20 20 20 20 20 20 66 44 69 66 66  ){.        fDiff
c360: 20 3d 20 64 69 66 66 3b 0a 20 20 20 20 20 20 20   = diff;.       
c370: 20 69 53 65 6c 65 63 74 20 3d 20 69 69 3b 0a 20   iSelect = ii;. 
c380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c390: 0a 20 20 61 69 55 73 65 64 5b 69 53 65 6c 65 63  .  aiUsed[iSelec
c3a0: 74 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  t] = 1;.  return
c3b0: 20 26 61 43 65 6c 6c 5b 69 53 65 6c 65 63 74 5d   &aCell[iSelect]
c3c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
c3d0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
c3e0: 20 71 75 61 64 72 61 74 69 63 20 76 61 72 69 61   quadratic varia
c3f0: 6e 74 20 6f 66 20 74 68 65 20 50 69 63 6b 53 65  nt of the PickSe
c400: 65 64 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  eds() function f
c410: 72 6f 6d 0a 2a 2a 20 47 75 74 74 6d 61 6e 5b 38  rom.** Guttman[8
c420: 34 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  4]..*/.static vo
c430: 69 64 20 51 75 61 64 72 61 74 69 63 50 69 63 6b  id QuadraticPick
c440: 53 65 65 64 73 28 0a 20 20 52 74 72 65 65 20 2a  Seeds(.  Rtree *
c450: 70 52 74 72 65 65 2c 0a 20 20 52 74 72 65 65 43  pRtree,.  RtreeC
c460: 65 6c 6c 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69  ell *aCell, .  i
c470: 6e 74 20 6e 43 65 6c 6c 2c 20 0a 20 20 69 6e 74  nt nCell, .  int
c480: 20 2a 70 69 4c 65 66 74 53 65 65 64 2c 20 0a 20   *piLeftSeed, . 
c490: 20 69 6e 74 20 2a 70 69 52 69 67 68 74 53 65 65   int *piRightSee
c4a0: 64 0a 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  d.){.  int ii;. 
c4b0: 20 69 6e 74 20 6a 6a 3b 0a 0a 20 20 69 6e 74 20   int jj;..  int 
c4c0: 69 4c 65 66 74 53 65 65 64 20 3d 20 30 3b 0a 20  iLeftSeed = 0;. 
c4d0: 20 69 6e 74 20 69 52 69 67 68 74 53 65 65 64 20   int iRightSeed 
c4e0: 3d 20 31 3b 0a 20 20 66 6c 6f 61 74 20 66 57 61  = 1;.  float fWa
c4f0: 73 74 65 20 3d 20 30 2e 30 3b 0a 0a 20 20 66 6f  ste = 0.0;..  fo
c500: 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c  r(ii=0; ii<nCell
c510: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  ; ii++){.    for
c520: 28 6a 6a 3d 69 69 2b 31 3b 20 6a 6a 3c 6e 43 65  (jj=ii+1; jj<nCe
c530: 6c 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ll; jj++){.     
c540: 20 66 6c 6f 61 74 20 72 69 67 68 74 20 3d 20 63   float right = c
c550: 65 6c 6c 41 72 65 61 28 70 52 74 72 65 65 2c 20  ellArea(pRtree, 
c560: 26 61 43 65 6c 6c 5b 6a 6a 5d 29 3b 0a 20 20 20  &aCell[jj]);.   
c570: 20 20 20 66 6c 6f 61 74 20 67 72 6f 77 74 68 20     float growth 
c580: 3d 20 63 65 6c 6c 47 72 6f 77 74 68 28 70 52 74  = cellGrowth(pRt
c590: 72 65 65 2c 20 26 61 43 65 6c 6c 5b 69 69 5d 2c  ree, &aCell[ii],
c5a0: 20 26 61 43 65 6c 6c 5b 6a 6a 5d 29 3b 0a 20 20   &aCell[jj]);.  
c5b0: 20 20 20 20 66 6c 6f 61 74 20 77 61 73 74 65 20      float waste 
c5c0: 3d 20 67 72 6f 77 74 68 20 2d 20 72 69 67 68 74  = growth - right
c5d0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 77 61 73  ;..      if( was
c5e0: 74 65 3e 66 57 61 73 74 65 20 29 7b 0a 20 20 20  te>fWaste ){.   
c5f0: 20 20 20 20 20 69 4c 65 66 74 53 65 65 64 20 3d       iLeftSeed =
c600: 20 69 69 3b 0a 20 20 20 20 20 20 20 20 69 52 69   ii;.        iRi
c610: 67 68 74 53 65 65 64 20 3d 20 6a 6a 3b 0a 20 20  ghtSeed = jj;.  
c620: 20 20 20 20 20 20 66 57 61 73 74 65 20 3d 20 77        fWaste = w
c630: 61 73 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  aste;.      }.  
c640: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 69 4c 65    }.  }..  *piLe
c650: 66 74 53 65 65 64 20 3d 20 69 4c 65 66 74 53 65  ftSeed = iLeftSe
c660: 65 64 3b 0a 20 20 2a 70 69 52 69 67 68 74 53 65  ed;.  *piRightSe
c670: 65 64 20 3d 20 69 52 69 67 68 74 53 65 65 64 3b  ed = iRightSeed;
c680: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 41 52  .}.#endif /* VAR
c690: 49 41 4e 54 5f 47 55 54 54 4d 41 4e 5f 51 55 41  IANT_GUTTMAN_QUA
c6a0: 44 52 41 54 49 43 5f 53 50 4c 49 54 20 2a 2f 0a  DRATIC_SPLIT */.
c6b0: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  ./*.** Arguments
c6c0: 20 61 49 64 78 2c 20 61 44 69 73 74 61 6e 63 65   aIdx, aDistance
c6d0: 20 61 6e 64 20 61 53 70 61 72 65 20 61 6c 6c 20   and aSpare all 
c6e0: 70 6f 69 6e 74 20 74 6f 20 61 72 72 61 79 73 20  point to arrays 
c6f0: 6f 66 20 73 69 7a 65 0a 2a 2a 20 6e 49 64 78 2e  of size.** nIdx.
c700: 20 54 68 65 20 61 49 64 78 20 61 72 72 61 79 20   The aIdx array 
c710: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 65 74  contains the set
c720: 20 6f 66 20 69 6e 74 65 67 65 72 73 20 66 72 6f   of integers fro
c730: 6d 20 30 20 74 6f 20 0a 2a 2a 20 28 6e 49 64 78  m 0 to .** (nIdx
c740: 2d 31 29 20 69 6e 20 6e 6f 20 70 61 72 74 69 63  -1) in no partic
c750: 75 6c 61 72 20 6f 72 64 65 72 2e 20 54 68 69 73  ular order. This
c760: 20 66 75 6e 63 74 69 6f 6e 20 73 6f 72 74 73 20   function sorts 
c770: 74 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20 69 6e  the values.** in
c780: 20 61 49 64 78 20 61 63 63 6f 72 64 69 6e 67 20   aIdx according 
c790: 74 6f 20 74 68 65 20 69 6e 64 65 78 65 64 20 76  to the indexed v
c7a0: 61 6c 75 65 73 20 69 6e 20 61 44 69 73 74 61 6e  alues in aDistan
c7b0: 63 65 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  ce. For.** examp
c7c0: 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65  le, assuming the
c7d0: 20 69 6e 70 75 74 73 3a 0a 2a 2a 0a 2a 2a 20 20   inputs:.**.**  
c7e0: 20 61 49 64 78 20 20 20 20 20 20 3d 20 7b 20 30   aIdx      = { 0
c7f0: 2c 20 20 20 31 2c 20 20 20 32 2c 20 20 20 33 20  ,   1,   2,   3 
c800: 7d 0a 2a 2a 20 20 20 61 44 69 73 74 61 6e 63 65  }.**   aDistance
c810: 20 3d 20 7b 20 35 2e 30 2c 20 32 2e 30 2c 20 37   = { 5.0, 2.0, 7
c820: 2e 30 2c 20 36 2e 30 20 7d 0a 2a 2a 0a 2a 2a 20  .0, 6.0 }.**.** 
c830: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
c840: 74 73 20 74 68 65 20 61 49 64 78 20 61 72 72 61  ts the aIdx arra
c850: 79 20 74 6f 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a  y to contain:.**
c860: 0a 2a 2a 20 20 20 61 49 64 78 20 20 20 20 20 20  .**   aIdx      
c870: 3d 20 7b 20 30 2c 20 20 20 31 2c 20 20 20 32 2c  = { 0,   1,   2,
c880: 20 20 20 33 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65     3 }.**.** The
c890: 20 61 53 70 61 72 65 20 61 72 72 61 79 20 69 73   aSpare array is
c8a0: 20 75 73 65 64 20 61 73 20 74 65 6d 70 6f 72 61   used as tempora
c8b0: 72 79 20 77 6f 72 6b 69 6e 67 20 73 70 61 63 65  ry working space
c8c0: 20 62 79 20 74 68 65 0a 2a 2a 20 73 6f 72 74 69   by the.** sorti
c8d0: 6e 67 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2f  ng algorithm..*/
c8e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 6f 72  .static void Sor
c8f0: 74 42 79 44 69 73 74 61 6e 63 65 28 0a 20 20 69  tByDistance(.  i
c900: 6e 74 20 2a 61 49 64 78 2c 20 0a 20 20 69 6e 74  nt *aIdx, .  int
c910: 20 6e 49 64 78 2c 20 0a 20 20 66 6c 6f 61 74 20   nIdx, .  float 
c920: 2a 61 44 69 73 74 61 6e 63 65 2c 20 0a 20 20 69  *aDistance, .  i
c930: 6e 74 20 2a 61 53 70 61 72 65 0a 29 7b 0a 20 20  nt *aSpare.){.  
c940: 69 66 28 20 6e 49 64 78 3e 31 20 29 7b 0a 20 20  if( nIdx>1 ){.  
c950: 20 20 69 6e 74 20 69 4c 65 66 74 20 3d 20 30 3b    int iLeft = 0;
c960: 0a 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 20  .    int iRight 
c970: 3d 20 30 3b 0a 0a 20 20 20 20 69 6e 74 20 6e 4c  = 0;..    int nL
c980: 65 66 74 20 3d 20 6e 49 64 78 2f 32 3b 0a 20 20  eft = nIdx/2;.  
c990: 20 20 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 6e    int nRight = n
c9a0: 49 64 78 2d 6e 4c 65 66 74 3b 0a 20 20 20 20 69  Idx-nLeft;.    i
c9b0: 6e 74 20 2a 61 4c 65 66 74 20 3d 20 61 49 64 78  nt *aLeft = aIdx
c9c0: 3b 0a 20 20 20 20 69 6e 74 20 2a 61 52 69 67 68  ;.    int *aRigh
c9d0: 74 20 3d 20 26 61 49 64 78 5b 6e 4c 65 66 74 5d  t = &aIdx[nLeft]
c9e0: 3b 0a 0a 20 20 20 20 53 6f 72 74 42 79 44 69 73  ;..    SortByDis
c9f0: 74 61 6e 63 65 28 61 4c 65 66 74 2c 20 6e 4c 65  tance(aLeft, nLe
ca00: 66 74 2c 20 61 44 69 73 74 61 6e 63 65 2c 20 61  ft, aDistance, a
ca10: 53 70 61 72 65 29 3b 0a 20 20 20 20 53 6f 72 74  Spare);.    Sort
ca20: 42 79 44 69 73 74 61 6e 63 65 28 61 52 69 67 68  ByDistance(aRigh
ca30: 74 2c 20 6e 52 69 67 68 74 2c 20 61 44 69 73 74  t, nRight, aDist
ca40: 61 6e 63 65 2c 20 61 53 70 61 72 65 29 3b 0a 0a  ance, aSpare);..
ca50: 20 20 20 20 6d 65 6d 63 70 79 28 61 53 70 61 72      memcpy(aSpar
ca60: 65 2c 20 61 4c 65 66 74 2c 20 73 69 7a 65 6f 66  e, aLeft, sizeof
ca70: 28 69 6e 74 29 2a 6e 4c 65 66 74 29 3b 0a 20 20  (int)*nLeft);.  
ca80: 20 20 61 4c 65 66 74 20 3d 20 61 53 70 61 72 65    aLeft = aSpare
ca90: 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c  ;..    while( iL
caa0: 65 66 74 3c 6e 4c 65 66 74 20 7c 7c 20 69 52 69  eft<nLeft || iRi
cab0: 67 68 74 3c 6e 52 69 67 68 74 20 29 7b 0a 20 20  ght<nRight ){.  
cac0: 20 20 20 20 69 66 28 20 69 4c 65 66 74 3d 3d 6e      if( iLeft==n
cad0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
cae0: 61 49 64 78 5b 69 4c 65 66 74 2b 69 52 69 67 68  aIdx[iLeft+iRigh
caf0: 74 5d 20 3d 20 61 52 69 67 68 74 5b 69 52 69 67  t] = aRight[iRig
cb00: 68 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 52 69  ht];.        iRi
cb10: 67 68 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ght++;.      }el
cb20: 73 65 20 69 66 28 20 69 52 69 67 68 74 3d 3d 6e  se if( iRight==n
cb30: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
cb40: 20 61 49 64 78 5b 69 4c 65 66 74 2b 69 52 69 67   aIdx[iLeft+iRig
cb50: 68 74 5d 20 3d 20 61 4c 65 66 74 5b 69 4c 65 66  ht] = aLeft[iLef
cb60: 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 4c 65 66  t];.        iLef
cb70: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
cb80: 7b 0a 20 20 20 20 20 20 20 20 66 6c 6f 61 74 20  {.        float 
cb90: 66 4c 65 66 74 20 3d 20 61 44 69 73 74 61 6e 63  fLeft = aDistanc
cba0: 65 5b 61 4c 65 66 74 5b 69 4c 65 66 74 5d 5d 3b  e[aLeft[iLeft]];
cbb0: 0a 20 20 20 20 20 20 20 20 66 6c 6f 61 74 20 66  .        float f
cbc0: 52 69 67 68 74 20 3d 20 61 44 69 73 74 61 6e 63  Right = aDistanc
cbd0: 65 5b 61 52 69 67 68 74 5b 69 52 69 67 68 74 5d  e[aRight[iRight]
cbe0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ];.        if( f
cbf0: 4c 65 66 74 3c 66 52 69 67 68 74 20 29 7b 0a 20  Left<fRight ){. 
cc00: 20 20 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c           aIdx[iL
cc10: 65 66 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 4c  eft+iRight] = aL
cc20: 65 66 74 5b 69 4c 65 66 74 5d 3b 0a 20 20 20 20  eft[iLeft];.    
cc30: 20 20 20 20 20 20 69 4c 65 66 74 2b 2b 3b 0a 20        iLeft++;. 
cc40: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
cc50: 20 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c 65          aIdx[iLe
cc60: 66 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 52 69  ft+iRight] = aRi
cc70: 67 68 74 5b 69 52 69 67 68 74 5d 3b 0a 20 20 20  ght[iRight];.   
cc80: 20 20 20 20 20 20 20 69 52 69 67 68 74 2b 2b 3b         iRight++;
cc90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cca0: 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a   }.    }..#if 0.
ccb0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
ccc0: 74 20 74 68 65 20 73 6f 72 74 20 77 6f 72 6b 65  t the sort worke
ccd0: 64 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20  d */.    {.     
cce0: 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 66   int jj;.      f
ccf0: 6f 72 28 6a 6a 3d 31 3b 20 6a 6a 3c 6e 49 64 78  or(jj=1; jj<nIdx
cd00: 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
cd10: 20 66 6c 6f 61 74 20 6c 65 66 74 20 3d 20 61 44   float left = aD
cd20: 69 73 74 61 6e 63 65 5b 61 49 64 78 5b 6a 6a 2d  istance[aIdx[jj-
cd30: 31 5d 5d 3b 0a 20 20 20 20 20 20 20 20 66 6c 6f  1]];.        flo
cd40: 61 74 20 72 69 67 68 74 20 3d 20 61 44 69 73 74  at right = aDist
cd50: 61 6e 63 65 5b 61 49 64 78 5b 6a 6a 5d 5d 3b 0a  ance[aIdx[jj]];.
cd60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
cd70: 6c 65 66 74 3c 3d 72 69 67 68 74 20 29 3b 0a 20  left<=right );. 
cd80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
cd90: 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
cda0: 20 41 72 67 75 6d 65 6e 74 73 20 61 49 64 78 2c   Arguments aIdx,
cdb0: 20 61 43 65 6c 6c 20 61 6e 64 20 61 53 70 61 72   aCell and aSpar
cdc0: 65 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61  e all point to a
cdd0: 72 72 61 79 73 20 6f 66 20 73 69 7a 65 0a 2a 2a  rrays of size.**
cde0: 20 6e 49 64 78 2e 20 54 68 65 20 61 49 64 78 20   nIdx. The aIdx 
cdf0: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 74  array contains t
ce00: 68 65 20 73 65 74 20 6f 66 20 69 6e 74 65 67 65  he set of intege
ce10: 72 73 20 66 72 6f 6d 20 30 20 74 6f 20 0a 2a 2a  rs from 0 to .**
ce20: 20 28 6e 49 64 78 2d 31 29 20 69 6e 20 6e 6f 20   (nIdx-1) in no 
ce30: 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
ce40: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
ce50: 73 6f 72 74 73 20 74 68 65 20 76 61 6c 75 65 73  sorts the values
ce60: 0a 2a 2a 20 69 6e 20 61 49 64 78 20 61 63 63 6f  .** in aIdx acco
ce70: 72 64 69 6e 67 20 74 6f 20 64 69 6d 65 6e 73 69  rding to dimensi
ce80: 6f 6e 20 69 44 69 6d 20 6f 66 20 74 68 65 20 63  on iDim of the c
ce90: 65 6c 6c 73 20 69 6e 20 61 43 65 6c 6c 2e 20 54  ells in aCell. T
cea0: 68 65 0a 2a 2a 20 6d 69 6e 69 6d 75 6d 20 76 61  he.** minimum va
ceb0: 6c 75 65 20 6f 66 20 64 69 6d 65 6e 73 69 6f 6e  lue of dimension
cec0: 20 69 44 69 6d 20 69 73 20 63 6f 6e 73 69 64 65   iDim is conside
ced0: 72 65 64 20 66 69 72 73 74 2c 20 74 68 65 0a 2a  red first, the.*
cee0: 2a 20 6d 61 78 69 6d 75 6d 20 75 73 65 64 20 74  * maximum used t
cef0: 6f 20 62 72 65 61 6b 20 74 69 65 73 2e 0a 2a 2a  o break ties..**
cf00: 0a 2a 2a 20 54 68 65 20 61 53 70 61 72 65 20 61  .** The aSpare a
cf10: 72 72 61 79 20 69 73 20 75 73 65 64 20 61 73 20  rray is used as 
cf20: 74 65 6d 70 6f 72 61 72 79 20 77 6f 72 6b 69 6e  temporary workin
cf30: 67 20 73 70 61 63 65 20 62 79 20 74 68 65 0a 2a  g space by the.*
cf40: 2a 20 73 6f 72 74 69 6e 67 20 61 6c 67 6f 72 69  * sorting algori
cf50: 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  thm..*/.static v
cf60: 6f 69 64 20 53 6f 72 74 42 79 44 69 6d 65 6e 73  oid SortByDimens
cf70: 69 6f 6e 28 0a 20 20 52 74 72 65 65 20 2a 70 52  ion(.  Rtree *pR
cf80: 74 72 65 65 2c 0a 20 20 69 6e 74 20 2a 61 49 64  tree,.  int *aId
cf90: 78 2c 20 0a 20 20 69 6e 74 20 6e 49 64 78 2c 20  x, .  int nIdx, 
cfa0: 0a 20 20 69 6e 74 20 69 44 69 6d 2c 20 0a 20 20  .  int iDim, .  
cfb0: 52 74 72 65 65 43 65 6c 6c 20 2a 61 43 65 6c 6c  RtreeCell *aCell
cfc0: 2c 20 0a 20 20 69 6e 74 20 2a 61 53 70 61 72 65  , .  int *aSpare
cfd0: 0a 29 7b 0a 20 20 69 66 28 20 6e 49 64 78 3e 31  .){.  if( nIdx>1
cfe0: 20 29 7b 0a 0a 20 20 20 20 69 6e 74 20 69 4c 65   ){..    int iLe
cff0: 66 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ft = 0;.    int 
d000: 69 52 69 67 68 74 20 3d 20 30 3b 0a 0a 20 20 20  iRight = 0;..   
d010: 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 6e 49 64   int nLeft = nId
d020: 78 2f 32 3b 0a 20 20 20 20 69 6e 74 20 6e 52 69  x/2;.    int nRi
d030: 67 68 74 20 3d 20 6e 49 64 78 2d 6e 4c 65 66 74  ght = nIdx-nLeft
d040: 3b 0a 20 20 20 20 69 6e 74 20 2a 61 4c 65 66 74  ;.    int *aLeft
d050: 20 3d 20 61 49 64 78 3b 0a 20 20 20 20 69 6e 74   = aIdx;.    int
d060: 20 2a 61 52 69 67 68 74 20 3d 20 26 61 49 64 78   *aRight = &aIdx
d070: 5b 6e 4c 65 66 74 5d 3b 0a 0a 20 20 20 20 53 6f  [nLeft];..    So
d080: 72 74 42 79 44 69 6d 65 6e 73 69 6f 6e 28 70 52  rtByDimension(pR
d090: 74 72 65 65 2c 20 61 4c 65 66 74 2c 20 6e 4c 65  tree, aLeft, nLe
d0a0: 66 74 2c 20 69 44 69 6d 2c 20 61 43 65 6c 6c 2c  ft, iDim, aCell,
d0b0: 20 61 53 70 61 72 65 29 3b 0a 20 20 20 20 53 6f   aSpare);.    So
d0c0: 72 74 42 79 44 69 6d 65 6e 73 69 6f 6e 28 70 52  rtByDimension(pR
d0d0: 74 72 65 65 2c 20 61 52 69 67 68 74 2c 20 6e 52  tree, aRight, nR
d0e0: 69 67 68 74 2c 20 69 44 69 6d 2c 20 61 43 65 6c  ight, iDim, aCel
d0f0: 6c 2c 20 61 53 70 61 72 65 29 3b 0a 0a 20 20 20  l, aSpare);..   
d100: 20 6d 65 6d 63 70 79 28 61 53 70 61 72 65 2c 20   memcpy(aSpare, 
d110: 61 4c 65 66 74 2c 20 73 69 7a 65 6f 66 28 69 6e  aLeft, sizeof(in
d120: 74 29 2a 6e 4c 65 66 74 29 3b 0a 20 20 20 20 61  t)*nLeft);.    a
d130: 4c 65 66 74 20 3d 20 61 53 70 61 72 65 3b 0a 20  Left = aSpare;. 
d140: 20 20 20 77 68 69 6c 65 28 20 69 4c 65 66 74 3c     while( iLeft<
d150: 6e 4c 65 66 74 20 7c 7c 20 69 52 69 67 68 74 3c  nLeft || iRight<
d160: 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  nRight ){.      
d170: 64 6f 75 62 6c 65 20 78 6c 65 66 74 31 20 3d 20  double xleft1 = 
d180: 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 61 4c 65  DCOORD(aCell[aLe
d190: 66 74 5b 69 4c 65 66 74 5d 5d 2e 61 43 6f 6f 72  ft[iLeft]].aCoor
d1a0: 64 5b 69 44 69 6d 2a 32 5d 29 3b 0a 20 20 20 20  d[iDim*2]);.    
d1b0: 20 20 64 6f 75 62 6c 65 20 78 6c 65 66 74 32 20    double xleft2 
d1c0: 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 61  = DCOORD(aCell[a
d1d0: 4c 65 66 74 5b 69 4c 65 66 74 5d 5d 2e 61 43 6f  Left[iLeft]].aCo
d1e0: 6f 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 29 3b 0a  ord[iDim*2+1]);.
d1f0: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 78 72 69        double xri
d200: 67 68 74 31 20 3d 20 44 43 4f 4f 52 44 28 61 43  ght1 = DCOORD(aC
d210: 65 6c 6c 5b 61 52 69 67 68 74 5b 69 52 69 67 68  ell[aRight[iRigh
d220: 74 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a  t]].aCoord[iDim*
d230: 32 5d 29 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  2]);.      doubl
d240: 65 20 78 72 69 67 68 74 32 20 3d 20 44 43 4f 4f  e xright2 = DCOO
d250: 52 44 28 61 43 65 6c 6c 5b 61 52 69 67 68 74 5b  RD(aCell[aRight[
d260: 69 52 69 67 68 74 5d 5d 2e 61 43 6f 6f 72 64 5b  iRight]].aCoord[
d270: 69 44 69 6d 2a 32 2b 31 5d 29 3b 0a 20 20 20 20  iDim*2+1]);.    
d280: 20 20 69 66 28 20 28 69 4c 65 66 74 21 3d 6e 4c    if( (iLeft!=nL
d290: 65 66 74 29 20 26 26 20 28 28 69 52 69 67 68 74  eft) && ((iRight
d2a0: 3d 3d 6e 52 69 67 68 74 29 0a 20 20 20 20 20 20  ==nRight).      
d2b0: 20 7c 7c 20 28 78 6c 65 66 74 31 3c 78 72 69 67   || (xleft1<xrig
d2c0: 68 74 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ht1).       || (
d2d0: 78 6c 65 66 74 31 3d 3d 78 72 69 67 68 74 31 20  xleft1==xright1 
d2e0: 26 26 20 78 6c 65 66 74 32 3c 78 72 69 67 68 74  && xleft2<xright
d2f0: 32 29 0a 20 20 20 20 20 20 29 29 7b 0a 20 20 20  2).      )){.   
d300: 20 20 20 20 20 61 49 64 78 5b 69 4c 65 66 74 2b       aIdx[iLeft+
d310: 69 52 69 67 68 74 5d 20 3d 20 61 4c 65 66 74 5b  iRight] = aLeft[
d320: 69 4c 65 66 74 5d 3b 0a 20 20 20 20 20 20 20 20  iLeft];.        
d330: 69 4c 65 66 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  iLeft++;.      }
d340: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 49  else{.        aI
d350: 64 78 5b 69 4c 65 66 74 2b 69 52 69 67 68 74 5d  dx[iLeft+iRight]
d360: 20 3d 20 61 52 69 67 68 74 5b 69 52 69 67 68 74   = aRight[iRight
d370: 5d 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  ];.        iRigh
d380: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
d390: 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a   }..#if 0.    /*
d3a0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
d3b0: 73 6f 72 74 20 77 6f 72 6b 65 64 20 2a 2f 0a 20  sort worked */. 
d3c0: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a     {.      int j
d3d0: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  j;.      for(jj=
d3e0: 31 3b 20 6a 6a 3c 6e 49 64 78 3b 20 6a 6a 2b 2b  1; jj<nIdx; jj++
d3f0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 6f 61 74  ){.        float
d400: 20 78 6c 65 66 74 31 20 3d 20 61 43 65 6c 6c 5b   xleft1 = aCell[
d410: 61 49 64 78 5b 6a 6a 2d 31 5d 5d 2e 61 43 6f 6f  aIdx[jj-1]].aCoo
d420: 72 64 5b 69 44 69 6d 2a 32 5d 3b 0a 20 20 20 20  rd[iDim*2];.    
d430: 20 20 20 20 66 6c 6f 61 74 20 78 6c 65 66 74 32      float xleft2
d440: 20 3d 20 61 43 65 6c 6c 5b 61 49 64 78 5b 6a 6a   = aCell[aIdx[jj
d450: 2d 31 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d  -1]].aCoord[iDim
d460: 2a 32 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 66  *2+1];.        f
d470: 6c 6f 61 74 20 78 72 69 67 68 74 31 20 3d 20 61  loat xright1 = a
d480: 43 65 6c 6c 5b 61 49 64 78 5b 6a 6a 5d 5d 2e 61  Cell[aIdx[jj]].a
d490: 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 3b 0a 20  Coord[iDim*2];. 
d4a0: 20 20 20 20 20 20 20 66 6c 6f 61 74 20 78 72 69         float xri
d4b0: 67 68 74 32 20 3d 20 61 43 65 6c 6c 5b 61 49 64  ght2 = aCell[aId
d4c0: 78 5b 6a 6a 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44  x[jj]].aCoord[iD
d4d0: 69 6d 2a 32 2b 31 5d 3b 0a 20 20 20 20 20 20 20  im*2+1];.       
d4e0: 20 61 73 73 65 72 74 28 20 78 6c 65 66 74 31 3c   assert( xleft1<
d4f0: 3d 78 72 69 67 68 74 31 20 26 26 20 28 78 6c 65  =xright1 && (xle
d500: 66 74 31 3c 78 72 69 67 68 74 31 20 7c 7c 20 78  ft1<xright1 || x
d510: 6c 65 66 74 32 3c 3d 78 72 69 67 68 74 32 29 20  left2<=xright2) 
d520: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d530: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
d540: 69 66 20 56 41 52 49 41 4e 54 5f 52 53 54 41 52  if VARIANT_RSTAR
d550: 54 52 45 45 5f 53 50 4c 49 54 0a 2f 2a 0a 2a 2a  TREE_SPLIT./*.**
d560: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
d570: 6f 66 20 74 68 65 20 52 2a 2d 74 72 65 65 20 76  of the R*-tree v
d580: 61 72 69 61 6e 74 20 6f 66 20 53 70 6c 69 74 4e  ariant of SplitN
d590: 6f 64 65 20 66 72 6f 6d 20 42 65 63 6b 6d 61 6e  ode from Beckman
d5a0: 5b 31 39 39 30 5d 2e 0a 2a 2f 0a 73 74 61 74 69  [1990]..*/.stati
d5b0: 63 20 69 6e 74 20 73 70 6c 69 74 4e 6f 64 65 53  c int splitNodeS
d5c0: 74 61 72 74 72 65 65 28 0a 20 20 52 74 72 65 65  tartree(.  Rtree
d5d0: 20 2a 70 52 74 72 65 65 2c 0a 20 20 52 74 72 65   *pRtree,.  Rtre
d5e0: 65 43 65 6c 6c 20 2a 61 43 65 6c 6c 2c 0a 20 20  eCell *aCell,.  
d5f0: 69 6e 74 20 6e 43 65 6c 6c 2c 0a 20 20 52 74 72  int nCell,.  Rtr
d600: 65 65 4e 6f 64 65 20 2a 70 4c 65 66 74 2c 0a 20  eeNode *pLeft,. 
d610: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 52 69 67   RtreeNode *pRig
d620: 68 74 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  ht,.  RtreeCell 
d630: 2a 70 42 62 6f 78 4c 65 66 74 2c 0a 20 20 52 74  *pBboxLeft,.  Rt
d640: 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f 78 52 69  reeCell *pBboxRi
d650: 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 2a 2a 61  ght.){.  int **a
d660: 61 53 6f 72 74 65 64 3b 0a 20 20 69 6e 74 20 2a  aSorted;.  int *
d670: 61 53 70 61 72 65 3b 0a 20 20 69 6e 74 20 69 69  aSpare;.  int ii
d680: 3b 0a 0a 20 20 69 6e 74 20 69 42 65 73 74 44 69  ;..  int iBestDi
d690: 6d 3b 0a 20 20 69 6e 74 20 69 42 65 73 74 53 70  m;.  int iBestSp
d6a0: 6c 69 74 3b 0a 20 20 66 6c 6f 61 74 20 66 42 65  lit;.  float fBe
d6b0: 73 74 4d 61 72 67 69 6e 3b 0a 0a 20 20 69 6e 74  stMargin;..  int
d6c0: 20 6e 42 79 74 65 20 3d 20 28 70 52 74 72 65 65   nByte = (pRtree
d6d0: 2d 3e 6e 44 69 6d 2b 31 29 2a 28 73 69 7a 65 6f  ->nDim+1)*(sizeo
d6e0: 66 28 69 6e 74 2a 29 2b 6e 43 65 6c 6c 2a 73 69  f(int*)+nCell*si
d6f0: 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 0a 20 20 61  zeof(int));..  a
d700: 61 53 6f 72 74 65 64 20 3d 20 28 69 6e 74 20 2a  aSorted = (int *
d710: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
d720: 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21  (nByte);.  if( !
d730: 61 61 53 6f 72 74 65 64 20 29 7b 0a 20 20 20 20  aaSorted ){.    
d740: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d750: 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 61 53 70 61  MEM;.  }..  aSpa
d760: 72 65 20 3d 20 26 28 28 69 6e 74 20 2a 29 26 61  re = &((int *)&a
d770: 61 53 6f 72 74 65 64 5b 70 52 74 72 65 65 2d 3e  aSorted[pRtree->
d780: 6e 44 69 6d 5d 29 5b 70 52 74 72 65 65 2d 3e 6e  nDim])[pRtree->n
d790: 44 69 6d 2a 6e 43 65 6c 6c 5d 3b 0a 20 20 6d 65  Dim*nCell];.  me
d7a0: 6d 73 65 74 28 61 61 53 6f 72 74 65 64 2c 20 30  mset(aaSorted, 0
d7b0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 66 6f 72 28  , nByte);.  for(
d7c0: 69 69 3d 30 3b 20 69 69 3c 70 52 74 72 65 65 2d  ii=0; ii<pRtree-
d7d0: 3e 6e 44 69 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nDim; ii++){.  
d7e0: 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 61 61    int jj;.    aa
d7f0: 53 6f 72 74 65 64 5b 69 69 5d 20 3d 20 26 28 28  Sorted[ii] = &((
d800: 69 6e 74 20 2a 29 26 61 61 53 6f 72 74 65 64 5b  int *)&aaSorted[
d810: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 5d 29 5b 69  pRtree->nDim])[i
d820: 69 2a 6e 43 65 6c 6c 5d 3b 0a 20 20 20 20 66 6f  i*nCell];.    fo
d830: 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 6e 43 65 6c 6c  r(jj=0; jj<nCell
d840: 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; jj++){.      a
d850: 61 53 6f 72 74 65 64 5b 69 69 5d 5b 6a 6a 5d 20  aSorted[ii][jj] 
d860: 3d 20 6a 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = jj;.    }.    
d870: 53 6f 72 74 42 79 44 69 6d 65 6e 73 69 6f 6e 28  SortByDimension(
d880: 70 52 74 72 65 65 2c 20 61 61 53 6f 72 74 65 64  pRtree, aaSorted
d890: 5b 69 69 5d 2c 20 6e 43 65 6c 6c 2c 20 69 69 2c  [ii], nCell, ii,
d8a0: 20 61 43 65 6c 6c 2c 20 61 53 70 61 72 65 29 3b   aCell, aSpare);
d8b0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 69 3d 30  .  }..  for(ii=0
d8c0: 3b 20 69 69 3c 70 52 74 72 65 65 2d 3e 6e 44 69  ; ii<pRtree->nDi
d8d0: 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 66 6c  m; ii++){.    fl
d8e0: 6f 61 74 20 6d 61 72 67 69 6e 20 3d 20 30 2e 30  oat margin = 0.0
d8f0: 3b 0a 20 20 20 20 66 6c 6f 61 74 20 66 42 65 73  ;.    float fBes
d900: 74 4f 76 65 72 6c 61 70 3b 0a 20 20 20 20 66 6c  tOverlap;.    fl
d910: 6f 61 74 20 66 42 65 73 74 41 72 65 61 3b 0a 20  oat fBestArea;. 
d920: 20 20 20 69 6e 74 20 69 42 65 73 74 4c 65 66 74     int iBestLeft
d930: 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 66 74 3b  ;.    int nLeft;
d940: 0a 0a 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20  ..    for(.     
d950: 20 6e 4c 65 66 74 3d 52 54 52 45 45 5f 4d 49 4e   nLeft=RTREE_MIN
d960: 43 45 4c 4c 53 28 70 52 74 72 65 65 29 3b 20 0a  CELLS(pRtree); .
d970: 20 20 20 20 20 20 6e 4c 65 66 74 3c 3d 28 6e 43        nLeft<=(nC
d980: 65 6c 6c 2d 52 54 52 45 45 5f 4d 49 4e 43 45 4c  ell-RTREE_MINCEL
d990: 4c 53 28 70 52 74 72 65 65 29 29 3b 20 0a 20 20  LS(pRtree)); .  
d9a0: 20 20 20 20 6e 4c 65 66 74 2b 2b 0a 20 20 20 20      nLeft++.    
d9b0: 29 7b 0a 20 20 20 20 20 20 52 74 72 65 65 43 65  ){.      RtreeCe
d9c0: 6c 6c 20 6c 65 66 74 3b 0a 20 20 20 20 20 20 52  ll left;.      R
d9d0: 74 72 65 65 43 65 6c 6c 20 72 69 67 68 74 3b 0a  treeCell right;.
d9e0: 20 20 20 20 20 20 69 6e 74 20 6b 6b 3b 0a 20 20        int kk;.  
d9f0: 20 20 20 20 66 6c 6f 61 74 20 6f 76 65 72 6c 61      float overla
da00: 70 3b 0a 20 20 20 20 20 20 66 6c 6f 61 74 20 61  p;.      float a
da10: 72 65 61 3b 0a 0a 20 20 20 20 20 20 6d 65 6d 63  rea;..      memc
da20: 70 79 28 26 6c 65 66 74 2c 20 26 61 43 65 6c 6c  py(&left, &aCell
da30: 5b 61 61 53 6f 72 74 65 64 5b 69 69 5d 5b 30 5d  [aaSorted[ii][0]
da40: 5d 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43  ], sizeof(RtreeC
da50: 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ell));.      mem
da60: 63 70 79 28 26 72 69 67 68 74 2c 20 26 61 43 65  cpy(&right, &aCe
da70: 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69 69 5d 5b  ll[aaSorted[ii][
da80: 6e 43 65 6c 6c 2d 31 5d 5d 2c 20 73 69 7a 65 6f  nCell-1]], sizeo
da90: 66 28 52 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20  f(RtreeCell));. 
daa0: 20 20 20 20 20 66 6f 72 28 6b 6b 3d 31 3b 20 6b       for(kk=1; k
dab0: 6b 3c 28 6e 43 65 6c 6c 2d 31 29 3b 20 6b 6b 2b  k<(nCell-1); kk+
dac0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
dad0: 6b 6b 3c 6e 4c 65 66 74 20 29 7b 0a 20 20 20 20  kk<nLeft ){.    
dae0: 20 20 20 20 20 20 63 65 6c 6c 55 6e 69 6f 6e 28        cellUnion(
daf0: 70 52 74 72 65 65 2c 20 26 6c 65 66 74 2c 20 26  pRtree, &left, &
db00: 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69  aCell[aaSorted[i
db10: 69 5d 5b 6b 6b 5d 5d 29 3b 0a 20 20 20 20 20 20  i][kk]]);.      
db20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
db30: 20 20 20 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74     cellUnion(pRt
db40: 72 65 65 2c 20 26 72 69 67 68 74 2c 20 26 61 43  ree, &right, &aC
db50: 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69 69 5d  ell[aaSorted[ii]
db60: 5b 6b 6b 5d 5d 29 3b 0a 20 20 20 20 20 20 20 20  [kk]]);.        
db70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
db80: 6d 61 72 67 69 6e 20 2b 3d 20 63 65 6c 6c 4d 61  margin += cellMa
db90: 72 67 69 6e 28 70 52 74 72 65 65 2c 20 26 6c 65  rgin(pRtree, &le
dba0: 66 74 29 3b 0a 20 20 20 20 20 20 6d 61 72 67 69  ft);.      margi
dbb0: 6e 20 2b 3d 20 63 65 6c 6c 4d 61 72 67 69 6e 28  n += cellMargin(
dbc0: 70 52 74 72 65 65 2c 20 26 72 69 67 68 74 29 3b  pRtree, &right);
dbd0: 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 20 3d  .      overlap =
dbe0: 20 63 65 6c 6c 4f 76 65 72 6c 61 70 28 70 52 74   cellOverlap(pRt
dbf0: 72 65 65 2c 20 26 6c 65 66 74 2c 20 26 72 69 67  ree, &left, &rig
dc00: 68 74 2c 20 31 2c 20 2d 31 29 3b 0a 20 20 20 20  ht, 1, -1);.    
dc10: 20 20 61 72 65 61 20 3d 20 63 65 6c 6c 41 72 65    area = cellAre
dc20: 61 28 70 52 74 72 65 65 2c 20 26 6c 65 66 74 29  a(pRtree, &left)
dc30: 20 2b 20 63 65 6c 6c 41 72 65 61 28 70 52 74 72   + cellArea(pRtr
dc40: 65 65 2c 20 26 72 69 67 68 74 29 3b 0a 20 20 20  ee, &right);.   
dc50: 20 20 20 69 66 28 20 28 6e 4c 65 66 74 3d 3d 52     if( (nLeft==R
dc60: 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52  TREE_MINCELLS(pR
dc70: 74 72 65 65 29 29 0a 20 20 20 20 20 20 20 7c 7c  tree)).       ||
dc80: 20 28 6f 76 65 72 6c 61 70 3c 66 42 65 73 74 4f   (overlap<fBestO
dc90: 76 65 72 6c 61 70 29 0a 20 20 20 20 20 20 20 7c  verlap).       |
dca0: 7c 20 28 6f 76 65 72 6c 61 70 3d 3d 66 42 65 73  | (overlap==fBes
dcb0: 74 4f 76 65 72 6c 61 70 20 26 26 20 61 72 65 61  tOverlap && area
dcc0: 3c 66 42 65 73 74 41 72 65 61 29 0a 20 20 20 20  <fBestArea).    
dcd0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 42 65    ){.        iBe
dce0: 73 74 4c 65 66 74 20 3d 20 6e 4c 65 66 74 3b 0a  stLeft = nLeft;.
dcf0: 20 20 20 20 20 20 20 20 66 42 65 73 74 4f 76 65          fBestOve
dd00: 72 6c 61 70 20 3d 20 6f 76 65 72 6c 61 70 3b 0a  rlap = overlap;.
dd10: 20 20 20 20 20 20 20 20 66 42 65 73 74 41 72 65          fBestAre
dd20: 61 20 3d 20 61 72 65 61 3b 0a 20 20 20 20 20 20  a = area;.      
dd30: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
dd40: 20 69 69 3d 3d 30 20 7c 7c 20 6d 61 72 67 69 6e   ii==0 || margin
dd50: 3c 66 42 65 73 74 4d 61 72 67 69 6e 20 29 7b 0a  <fBestMargin ){.
dd60: 20 20 20 20 20 20 69 42 65 73 74 44 69 6d 20 3d        iBestDim =
dd70: 20 69 69 3b 0a 20 20 20 20 20 20 66 42 65 73 74   ii;.      fBest
dd80: 4d 61 72 67 69 6e 20 3d 20 6d 61 72 67 69 6e 3b  Margin = margin;
dd90: 0a 20 20 20 20 20 20 69 42 65 73 74 53 70 6c 69  .      iBestSpli
dda0: 74 20 3d 20 69 42 65 73 74 4c 65 66 74 3b 0a 20  t = iBestLeft;. 
ddb0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d 63     }.  }..  memc
ddc0: 70 79 28 70 42 62 6f 78 4c 65 66 74 2c 20 26 61  py(pBboxLeft, &a
ddd0: 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69 42  Cell[aaSorted[iB
dde0: 65 73 74 44 69 6d 5d 5b 30 5d 5d 2c 20 73 69 7a  estDim][0]], siz
ddf0: 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29 29 3b  eof(RtreeCell));
de00: 0a 20 20 6d 65 6d 63 70 79 28 70 42 62 6f 78 52  .  memcpy(pBboxR
de10: 69 67 68 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53  ight, &aCell[aaS
de20: 6f 72 74 65 64 5b 69 42 65 73 74 44 69 6d 5d 5b  orted[iBestDim][
de30: 69 42 65 73 74 53 70 6c 69 74 5d 5d 2c 20 73 69  iBestSplit]], si
de40: 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29 29  zeof(RtreeCell))
de50: 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
de60: 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20  <nCell; ii++){. 
de70: 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 54     RtreeNode *pT
de80: 61 72 67 65 74 20 3d 20 28 69 69 3c 69 42 65 73  arget = (ii<iBes
de90: 74 53 70 6c 69 74 29 3f 70 4c 65 66 74 3a 70 52  tSplit)?pLeft:pR
dea0: 69 67 68 74 3b 0a 20 20 20 20 52 74 72 65 65 43  ight;.    RtreeC
deb0: 65 6c 6c 20 2a 70 42 62 6f 78 20 3d 20 28 69 69  ell *pBbox = (ii
dec0: 3c 69 42 65 73 74 53 70 6c 69 74 29 3f 70 42 62  <iBestSplit)?pBb
ded0: 6f 78 4c 65 66 74 3a 70 42 62 6f 78 52 69 67 68  oxLeft:pBboxRigh
dee0: 74 3b 0a 20 20 20 20 52 74 72 65 65 43 65 6c 6c  t;.    RtreeCell
def0: 20 2a 70 43 65 6c 6c 20 3d 20 26 61 43 65 6c 6c   *pCell = &aCell
df00: 5b 61 61 53 6f 72 74 65 64 5b 69 42 65 73 74 44  [aaSorted[iBestD
df10: 69 6d 5d 5b 69 69 5d 5d 3b 0a 20 20 20 20 6e 6f  im][ii]];.    no
df20: 64 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74  deInsertCell(pRt
df30: 72 65 65 2c 20 70 54 61 72 67 65 74 2c 20 70 43  ree, pTarget, pC
df40: 65 6c 6c 29 3b 0a 20 20 20 20 63 65 6c 6c 55 6e  ell);.    cellUn
df50: 69 6f 6e 28 70 52 74 72 65 65 2c 20 70 42 62 6f  ion(pRtree, pBbo
df60: 78 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 0a  x, pCell);.  }..
df70: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
df80: 61 53 6f 72 74 65 64 29 3b 0a 20 20 72 65 74 75  aSorted);.  retu
df90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
dfa0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 56 41 52 49  #endif..#if VARI
dfb0: 41 4e 54 5f 47 55 54 54 4d 41 4e 5f 53 50 4c 49  ANT_GUTTMAN_SPLI
dfc0: 54 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  T./*.** Implemen
dfd0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65  tation of the re
dfe0: 67 75 6c 61 72 20 52 2d 74 72 65 65 20 53 70 6c  gular R-tree Spl
dff0: 69 74 4e 6f 64 65 20 66 72 6f 6d 20 47 75 74 74  itNode from Gutt
e000: 6d 61 6e 5b 31 39 38 34 5d 2e 0a 2a 2f 0a 73 74  man[1984]..*/.st
e010: 61 74 69 63 20 69 6e 74 20 73 70 6c 69 74 4e 6f  atic int splitNo
e020: 64 65 47 75 74 74 6d 61 6e 28 0a 20 20 52 74 72  deGuttman(.  Rtr
e030: 65 65 20 2a 70 52 74 72 65 65 2c 0a 20 20 52 74  ee *pRtree,.  Rt
e040: 72 65 65 43 65 6c 6c 20 2a 61 43 65 6c 6c 2c 0a  reeCell *aCell,.
e050: 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 0a 20 20 52    int nCell,.  R
e060: 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65 66 74 2c  treeNode *pLeft,
e070: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 52  .  RtreeNode *pR
e080: 69 67 68 74 2c 0a 20 20 52 74 72 65 65 43 65 6c  ight,.  RtreeCel
e090: 6c 20 2a 70 42 62 6f 78 4c 65 66 74 2c 0a 20 20  l *pBboxLeft,.  
e0a0: 52 74 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f 78  RtreeCell *pBbox
e0b0: 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 69  Right.){.  int i
e0c0: 4c 65 66 74 53 65 65 64 20 3d 20 30 3b 0a 20 20  LeftSeed = 0;.  
e0d0: 69 6e 74 20 69 52 69 67 68 74 53 65 65 64 20 3d  int iRightSeed =
e0e0: 20 31 3b 0a 20 20 69 6e 74 20 2a 61 69 55 73 65   1;.  int *aiUse
e0f0: 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  d;.  int i;..  a
e100: 69 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  iUsed = sqlite3_
e110: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 69 6e  malloc(sizeof(in
e120: 74 29 2a 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28  t)*nCell);.  if(
e130: 20 21 61 69 55 73 65 64 20 29 7b 0a 20 20 20 20   !aiUsed ){.    
e140: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e150: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
e160: 74 28 61 69 55 73 65 64 2c 20 30 2c 20 73 69 7a  t(aiUsed, 0, siz
e170: 65 6f 66 28 69 6e 74 29 2a 6e 43 65 6c 6c 29 3b  eof(int)*nCell);
e180: 0a 0a 20 20 50 69 63 6b 53 65 65 64 73 28 70 52  ..  PickSeeds(pR
e190: 74 72 65 65 2c 20 61 43 65 6c 6c 2c 20 6e 43 65  tree, aCell, nCe
e1a0: 6c 6c 2c 20 26 69 4c 65 66 74 53 65 65 64 2c 20  ll, &iLeftSeed, 
e1b0: 26 69 52 69 67 68 74 53 65 65 64 29 3b 0a 0a 20  &iRightSeed);.. 
e1c0: 20 6d 65 6d 63 70 79 28 70 42 62 6f 78 4c 65 66   memcpy(pBboxLef
e1d0: 74 2c 20 26 61 43 65 6c 6c 5b 69 4c 65 66 74 53  t, &aCell[iLeftS
e1e0: 65 65 64 5d 2c 20 73 69 7a 65 6f 66 28 52 74 72  eed], sizeof(Rtr
e1f0: 65 65 43 65 6c 6c 29 29 3b 0a 20 20 6d 65 6d 63  eeCell));.  memc
e200: 70 79 28 70 42 62 6f 78 52 69 67 68 74 2c 20 26  py(pBboxRight, &
e210: 61 43 65 6c 6c 5b 69 52 69 67 68 74 53 65 65 64  aCell[iRightSeed
e220: 5d 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43  ], sizeof(RtreeC
e230: 65 6c 6c 29 29 3b 0a 20 20 6e 6f 64 65 49 6e 73  ell));.  nodeIns
e240: 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  ertCell(pRtree, 
e250: 70 4c 65 66 74 2c 20 26 61 43 65 6c 6c 5b 69 4c  pLeft, &aCell[iL
e260: 65 66 74 53 65 65 64 5d 29 3b 0a 20 20 6e 6f 64  eftSeed]);.  nod
e270: 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72  eInsertCell(pRtr
e280: 65 65 2c 20 70 52 69 67 68 74 2c 20 26 61 43 65  ee, pRight, &aCe
e290: 6c 6c 5b 69 52 69 67 68 74 53 65 65 64 5d 29 3b  ll[iRightSeed]);
e2a0: 0a 20 20 61 69 55 73 65 64 5b 69 4c 65 66 74 53  .  aiUsed[iLeftS
e2b0: 65 65 64 5d 20 3d 20 31 3b 0a 20 20 61 69 55 73  eed] = 1;.  aiUs
e2c0: 65 64 5b 69 52 69 67 68 74 53 65 65 64 5d 20 3d  ed[iRightSeed] =
e2d0: 20 31 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 43 65   1;..  for(i=nCe
e2e0: 6c 6c 2d 32 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  ll-2; i>0; i--){
e2f0: 0a 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20 2a  .    RtreeCell *
e300: 70 4e 65 78 74 3b 0a 20 20 20 20 70 4e 65 78 74  pNext;.    pNext
e310: 20 3d 20 50 69 63 6b 4e 65 78 74 28 70 52 74 72   = PickNext(pRtr
e320: 65 65 2c 20 61 43 65 6c 6c 2c 20 6e 43 65 6c 6c  ee, aCell, nCell
e330: 2c 20 70 42 62 6f 78 4c 65 66 74 2c 20 70 42 62  , pBboxLeft, pBb
e340: 6f 78 52 69 67 68 74 2c 20 61 69 55 73 65 64 29  oxRight, aiUsed)
e350: 3b 0a 20 20 20 20 66 6c 6f 61 74 20 64 69 66 66  ;.    float diff
e360: 20 3d 20 20 0a 20 20 20 20 20 20 63 65 6c 6c 47   =  .      cellG
e370: 72 6f 77 74 68 28 70 52 74 72 65 65 2c 20 70 42  rowth(pRtree, pB
e380: 62 6f 78 4c 65 66 74 2c 20 70 4e 65 78 74 29 20  boxLeft, pNext) 
e390: 2d 20 0a 20 20 20 20 20 20 63 65 6c 6c 47 72 6f  - .      cellGro
e3a0: 77 74 68 28 70 52 74 72 65 65 2c 20 70 42 62 6f  wth(pRtree, pBbo
e3b0: 78 52 69 67 68 74 2c 20 70 4e 65 78 74 29 0a 20  xRight, pNext). 
e3c0: 20 20 20 3b 0a 20 20 20 20 69 66 28 20 28 52 54     ;.    if( (RT
e3d0: 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52 74  REE_MINCELLS(pRt
e3e0: 72 65 65 29 2d 4e 43 45 4c 4c 28 70 52 69 67 68  ree)-NCELL(pRigh
e3f0: 74 29 3d 3d 69 29 0a 20 20 20 20 20 7c 7c 20 28  t)==i).     || (
e400: 64 69 66 66 3e 30 2e 30 20 26 26 20 28 52 54 52  diff>0.0 && (RTR
e410: 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52 74 72  EE_MINCELLS(pRtr
e420: 65 65 29 2d 4e 43 45 4c 4c 28 70 4c 65 66 74 29  ee)-NCELL(pLeft)
e430: 21 3d 69 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  !=i)).    ){.   
e440: 20 20 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c     nodeInsertCel
e450: 6c 28 70 52 74 72 65 65 2c 20 70 52 69 67 68 74  l(pRtree, pRight
e460: 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  , pNext);.      
e470: 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65  cellUnion(pRtree
e480: 2c 20 70 42 62 6f 78 52 69 67 68 74 2c 20 70 4e  , pBboxRight, pN
e490: 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ext);.    }else{
e4a0: 0a 20 20 20 20 20 20 6e 6f 64 65 49 6e 73 65 72  .      nodeInser
e4b0: 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4c  tCell(pRtree, pL
e4c0: 65 66 74 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20  eft, pNext);.   
e4d0: 20 20 20 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74     cellUnion(pRt
e4e0: 72 65 65 2c 20 70 42 62 6f 78 4c 65 66 74 2c 20  ree, pBboxLeft, 
e4f0: 70 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pNext);.    }.  
e500: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
e510: 65 28 61 69 55 73 65 64 29 3b 0a 20 20 72 65 74  e(aiUsed);.  ret
e520: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e530: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20  .#endif..static 
e540: 69 6e 74 20 75 70 64 61 74 65 4d 61 70 70 69 6e  int updateMappin
e550: 67 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  g(.  Rtree *pRtr
e560: 65 65 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  ee, .  i64 iRowi
e570: 64 2c 20 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  d, .  RtreeNode 
e580: 2a 70 4e 6f 64 65 2c 20 0a 20 20 69 6e 74 20 69  *pNode, .  int i
e590: 48 65 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20  Height.){.  int 
e5a0: 28 2a 78 53 65 74 4d 61 70 70 69 6e 67 29 28 52  (*xSetMapping)(R
e5b0: 74 72 65 65 20 2a 2c 20 73 71 6c 69 74 65 33 5f  tree *, sqlite3_
e5c0: 69 6e 74 36 34 2c 20 73 71 6c 69 74 65 33 5f 69  int64, sqlite3_i
e5d0: 6e 74 36 34 29 3b 0a 20 20 78 53 65 74 4d 61 70  nt64);.  xSetMap
e5e0: 70 69 6e 67 20 3d 20 28 28 69 48 65 69 67 68 74  ping = ((iHeight
e5f0: 3d 3d 30 29 3f 72 6f 77 69 64 57 72 69 74 65 3a  ==0)?rowidWrite:
e600: 70 61 72 65 6e 74 57 72 69 74 65 29 3b 0a 20 20  parentWrite);.  
e610: 69 66 28 20 69 48 65 69 67 68 74 3e 30 20 29 7b  if( iHeight>0 ){
e620: 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  .    RtreeNode *
e630: 70 43 68 69 6c 64 20 3d 20 6e 6f 64 65 48 61 73  pChild = nodeHas
e640: 68 4c 6f 6f 6b 75 70 28 70 52 74 72 65 65 2c 20  hLookup(pRtree, 
e650: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  iRowid);.    if(
e660: 20 70 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   pChild ){.     
e670: 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
e680: 72 65 65 2c 20 70 43 68 69 6c 64 2d 3e 70 50 61  ree, pChild->pPa
e690: 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 6e 6f 64  rent);.      nod
e6a0: 65 52 65 66 65 72 65 6e 63 65 28 70 4e 6f 64 65  eReference(pNode
e6b0: 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d  );.      pChild-
e6c0: 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65  >pParent = pNode
e6d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
e6e0: 74 75 72 6e 20 78 53 65 74 4d 61 70 70 69 6e 67  turn xSetMapping
e6f0: 28 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64 2c  (pRtree, iRowid,
e700: 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a   pNode->iNode);.
e710: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 70  }..static int Sp
e720: 6c 69 74 4e 6f 64 65 28 0a 20 20 52 74 72 65 65  litNode(.  Rtree
e730: 20 2a 70 52 74 72 65 65 2c 0a 20 20 52 74 72 65   *pRtree,.  Rtre
e740: 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20  eNode *pNode,.  
e750: 52 74 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c  RtreeCell *pCell
e760: 2c 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74 0a  ,.  int iHeight.
e770: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
e780: 74 20 6e 65 77 43 65 6c 6c 49 73 52 69 67 68 74  t newCellIsRight
e790: 20 3d 20 30 3b 0a 0a 20 20 69 6e 74 20 72 63 20   = 0;..  int rc 
e7a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
e7b0: 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c  nt nCell = NCELL
e7c0: 28 70 4e 6f 64 65 29 3b 0a 20 20 52 74 72 65 65  (pNode);.  Rtree
e7d0: 43 65 6c 6c 20 2a 61 43 65 6c 6c 3b 0a 20 20 69  Cell *aCell;.  i
e7e0: 6e 74 20 2a 61 69 55 73 65 64 3b 0a 0a 20 20 52  nt *aiUsed;..  R
e7f0: 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65 66 74 20  treeNode *pLeft 
e800: 3d 20 30 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65  = 0;.  RtreeNode
e810: 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 0a 20   *pRight = 0;.. 
e820: 20 52 74 72 65 65 43 65 6c 6c 20 6c 65 66 74 62   RtreeCell leftb
e830: 62 6f 78 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c  box;.  RtreeCell
e840: 20 72 69 67 68 74 62 62 6f 78 3b 0a 0a 20 20 2f   rightbbox;..  /
e850: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 61 72  * Allocate an ar
e860: 72 61 79 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ray and populate
e870: 20 69 74 20 77 69 74 68 20 61 20 63 6f 70 79 20   it with a copy 
e880: 6f 66 20 70 43 65 6c 6c 20 61 6e 64 20 0a 20 20  of pCell and .  
e890: 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 66 72 6f  ** all cells fro
e8a0: 6d 20 6e 6f 64 65 20 70 4c 65 66 74 2e 20 54 68  m node pLeft. Th
e8b0: 65 6e 20 7a 65 72 6f 20 74 68 65 20 6f 72 69 67  en zero the orig
e8c0: 69 6e 61 6c 20 6e 6f 64 65 2e 0a 20 20 2a 2f 0a  inal node..  */.
e8d0: 20 20 61 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65    aCell = sqlite
e8e0: 33 5f 6d 61 6c 6c 6f 63 28 28 73 69 7a 65 6f 66  3_malloc((sizeof
e8f0: 28 52 74 72 65 65 43 65 6c 6c 29 2b 73 69 7a 65  (RtreeCell)+size
e900: 6f 66 28 69 6e 74 29 29 2a 28 6e 43 65 6c 6c 2b  of(int))*(nCell+
e910: 31 29 29 3b 0a 20 20 69 66 28 20 21 61 43 65 6c  1));.  if( !aCel
e920: 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
e930: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
e940: 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f 6f  goto splitnode_o
e950: 75 74 3b 0a 20 20 7d 0a 20 20 61 69 55 73 65 64  ut;.  }.  aiUsed
e960: 20 3d 20 28 69 6e 74 20 2a 29 26 61 43 65 6c 6c   = (int *)&aCell
e970: 5b 6e 43 65 6c 6c 2b 31 5d 3b 0a 20 20 6d 65 6d  [nCell+1];.  mem
e980: 73 65 74 28 61 69 55 73 65 64 2c 20 30 2c 20 73  set(aiUsed, 0, s
e990: 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43 65 6c  izeof(int)*(nCel
e9a0: 6c 2b 31 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l+1));.  for(i=0
e9b0: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
e9c0: 0a 20 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c  .    nodeGetCell
e9d0: 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
e9e0: 69 2c 20 26 61 43 65 6c 6c 5b 69 5d 29 3b 0a 20  i, &aCell[i]);. 
e9f0: 20 7d 0a 20 20 6e 6f 64 65 5a 65 72 6f 28 70 52   }.  nodeZero(pR
ea00: 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20  tree, pNode);.  
ea10: 6d 65 6d 63 70 79 28 26 61 43 65 6c 6c 5b 6e 43  memcpy(&aCell[nC
ea20: 65 6c 6c 5d 2c 20 70 43 65 6c 6c 2c 20 73 69 7a  ell], pCell, siz
ea30: 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29 29 3b  eof(RtreeCell));
ea40: 0a 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 0a 20 20 69  .  nCell++;..  i
ea50: 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d  f( pNode->iNode=
ea60: 3d 31 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74  =1 ){.    pRight
ea70: 20 3d 20 6e 6f 64 65 4e 65 77 28 70 52 74 72 65   = nodeNew(pRtre
ea80: 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 70  e, pNode);.    p
ea90: 4c 65 66 74 20 3d 20 6e 6f 64 65 4e 65 77 28 70  Left = nodeNew(p
eaa0: 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20  Rtree, pNode);. 
eab0: 20 20 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74     pRtree->iDept
eac0: 68 2b 2b 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  h++;.    pNode->
ead0: 69 73 44 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  isDirty = 1;.   
eae0: 20 77 72 69 74 65 49 6e 74 31 36 28 70 4e 6f 64   writeInt16(pNod
eaf0: 65 2d 3e 7a 44 61 74 61 2c 20 70 52 74 72 65 65  e->zData, pRtree
eb00: 2d 3e 69 44 65 70 74 68 29 3b 0a 20 20 7d 65 6c  ->iDepth);.  }el
eb10: 73 65 7b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  se{.    pLeft = 
eb20: 70 4e 6f 64 65 3b 0a 20 20 20 20 70 52 69 67 68  pNode;.    pRigh
eb30: 74 20 3d 20 6e 6f 64 65 4e 65 77 28 70 52 74 72  t = nodeNew(pRtr
eb40: 65 65 2c 20 70 4c 65 66 74 2d 3e 70 50 61 72 65  ee, pLeft->pPare
eb50: 6e 74 29 3b 0a 20 20 20 20 6e 6f 64 65 52 65 66  nt);.    nodeRef
eb60: 65 72 65 6e 63 65 28 70 4c 65 66 74 29 3b 0a 20  erence(pLeft);. 
eb70: 20 7d 0a 0a 20 20 69 66 28 20 21 70 4c 65 66 74   }..  if( !pLeft
eb80: 20 7c 7c 20 21 70 52 69 67 68 74 20 29 7b 0a 20   || !pRight ){. 
eb90: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
eba0: 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 73  OMEM;.    goto s
ebb0: 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20  plitnode_out;.  
ebc0: 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 4c 65 66  }..  memset(pLef
ebd0: 74 2d 3e 7a 44 61 74 61 2c 20 30 2c 20 70 52 74  t->zData, 0, pRt
ebe0: 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 29 3b  ree->iNodeSize);
ebf0: 0a 20 20 6d 65 6d 73 65 74 28 70 52 69 67 68 74  .  memset(pRight
ec00: 2d 3e 7a 44 61 74 61 2c 20 30 2c 20 70 52 74 72  ->zData, 0, pRtr
ec10: 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 29 3b 0a  ee->iNodeSize);.
ec20: 0a 20 20 72 63 20 3d 20 41 73 73 69 67 6e 43 65  .  rc = AssignCe
ec30: 6c 6c 73 28 70 52 74 72 65 65 2c 20 61 43 65 6c  lls(pRtree, aCel
ec40: 6c 2c 20 6e 43 65 6c 6c 2c 20 70 4c 65 66 74 2c  l, nCell, pLeft,
ec50: 20 70 52 69 67 68 74 2c 20 26 6c 65 66 74 62 62   pRight, &leftbb
ec60: 6f 78 2c 20 26 72 69 67 68 74 62 62 6f 78 29 3b  ox, &rightbbox);
ec70: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ec80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
ec90: 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a   splitnode_out;.
eca0: 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65    }..  /* Ensure
ecb0: 20 62 6f 74 68 20 63 68 69 6c 64 20 6e 6f 64 65   both child node
ecc0: 73 20 68 61 76 65 20 6e 6f 64 65 20 6e 75 6d 62  s have node numb
ecd0: 65 72 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ers assigned to 
ece0: 74 68 65 6d 20 62 79 20 63 61 6c 6c 69 6e 67 0a  them by calling.
ecf0: 20 20 2a 2a 20 6e 6f 64 65 57 72 69 74 65 28 29    ** nodeWrite()
ed00: 2e 20 4e 6f 64 65 20 70 52 69 67 68 74 20 61 6c  . Node pRight al
ed10: 77 61 79 73 20 6e 65 65 64 73 20 61 20 6e 6f 64  ways needs a nod
ed20: 65 20 6e 75 6d 62 65 72 2c 20 61 73 20 69 74 20  e number, as it 
ed30: 77 61 73 20 63 72 65 61 74 65 64 0a 20 20 2a 2a  was created.  **
ed40: 20 62 79 20 6e 6f 64 65 4e 65 77 28 29 20 61 62   by nodeNew() ab
ed50: 6f 76 65 2e 20 42 75 74 20 6e 6f 64 65 20 70 4c  ove. But node pL
ed60: 65 66 74 20 73 6f 6d 65 74 69 6d 65 73 20 61 6c  eft sometimes al
ed70: 72 65 61 64 79 20 68 61 73 20 61 20 6e 6f 64 65  ready has a node
ed80: 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a 20 49 6e   number..  ** In
ed90: 20 74 68 69 73 20 63 61 73 65 20 61 76 6f 69 64   this case avoid
eda0: 20 74 68 65 20 61 6c 6c 20 74 6f 20 6e 6f 64 65   the all to node
edb0: 57 72 69 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  Write()..  */.  
edc0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
edd0: 72 63 20 3d 20 6e 6f 64 65 57 72 69 74 65 28 70  rc = nodeWrite(p
ede0: 52 74 72 65 65 2c 20 70 52 69 67 68 74 29 29 0a  Rtree, pRight)).
edf0: 20 20 20 7c 7c 20 28 30 3d 3d 70 4c 65 66 74 2d     || (0==pLeft-
ee00: 3e 69 4e 6f 64 65 20 26 26 20 53 51 4c 49 54 45  >iNode && SQLITE
ee10: 5f 4f 4b 21 3d 28 72 63 20 3d 20 6e 6f 64 65 57  _OK!=(rc = nodeW
ee20: 72 69 74 65 28 70 52 74 72 65 65 2c 20 70 4c 65  rite(pRtree, pLe
ee30: 66 74 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 67  ft))).  ){.    g
ee40: 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75  oto splitnode_ou
ee50: 74 3b 0a 20 20 7d 0a 0a 20 20 72 69 67 68 74 62  t;.  }..  rightb
ee60: 62 6f 78 2e 69 52 6f 77 69 64 20 3d 20 70 52 69  box.iRowid = pRi
ee70: 67 68 74 2d 3e 69 4e 6f 64 65 3b 0a 20 20 6c 65  ght->iNode;.  le
ee80: 66 74 62 62 6f 78 2e 69 52 6f 77 69 64 20 3d 20  ftbbox.iRowid = 
ee90: 70 4c 65 66 74 2d 3e 69 4e 6f 64 65 3b 0a 0a 20  pLeft->iNode;.. 
eea0: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64   if( pNode->iNod
eeb0: 65 3d 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  e==1 ){.    rc =
eec0: 20 72 74 72 65 65 49 6e 73 65 72 74 43 65 6c 6c   rtreeInsertCell
eed0: 28 70 52 74 72 65 65 2c 20 70 4c 65 66 74 2d 3e  (pRtree, pLeft->
eee0: 70 50 61 72 65 6e 74 2c 20 26 6c 65 66 74 62 62  pParent, &leftbb
eef0: 6f 78 2c 20 69 48 65 69 67 68 74 2b 31 29 3b 0a  ox, iHeight+1);.
ef00: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ef10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
ef20: 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75  oto splitnode_ou
ef30: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
ef40: 7b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20  {.    RtreeNode 
ef50: 2a 70 50 61 72 65 6e 74 20 3d 20 70 4c 65 66 74  *pParent = pLeft
ef60: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 69  ->pParent;.    i
ef70: 6e 74 20 69 43 65 6c 6c 3b 0a 20 20 20 20 72 63  nt iCell;.    rc
ef80: 20 3d 20 6e 6f 64 65 50 61 72 65 6e 74 49 6e 64   = nodeParentInd
ef90: 65 78 28 70 52 74 72 65 65 2c 20 70 4c 65 66 74  ex(pRtree, pLeft
efa0: 2c 20 26 69 43 65 6c 6c 29 3b 0a 20 20 20 20 69  , &iCell);.    i
efb0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
efc0: 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65 4f 76   ){.      nodeOv
efd0: 65 72 77 72 69 74 65 43 65 6c 6c 28 70 52 74 72  erwriteCell(pRtr
efe0: 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 26 6c 65  ee, pParent, &le
eff0: 66 74 62 62 6f 78 2c 20 69 43 65 6c 6c 29 3b 0a  ftbbox, iCell);.
f000: 20 20 20 20 20 20 72 63 20 3d 20 41 64 6a 75 73        rc = Adjus
f010: 74 54 72 65 65 28 70 52 74 72 65 65 2c 20 70 50  tTree(pRtree, pP
f020: 61 72 65 6e 74 2c 20 26 6c 65 66 74 62 62 6f 78  arent, &leftbbox
f030: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
f040: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f050: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 70 6c  {.      goto spl
f060: 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20  itnode_out;.    
f070: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63 20  }.  }.  if( (rc 
f080: 3d 20 72 74 72 65 65 49 6e 73 65 72 74 43 65 6c  = rtreeInsertCel
f090: 6c 28 70 52 74 72 65 65 2c 20 70 52 69 67 68 74  l(pRtree, pRight
f0a0: 2d 3e 70 50 61 72 65 6e 74 2c 20 26 72 69 67 68  ->pParent, &righ
f0b0: 74 62 62 6f 78 2c 20 69 48 65 69 67 68 74 2b 31  tbbox, iHeight+1
f0c0: 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  )) ){.    goto s
f0d0: 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20  plitnode_out;.  
f0e0: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
f0f0: 4e 43 45 4c 4c 28 70 52 69 67 68 74 29 3b 20 69  NCELL(pRight); i
f100: 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  ++){.    i64 iRo
f110: 77 69 64 20 3d 20 6e 6f 64 65 47 65 74 52 6f 77  wid = nodeGetRow
f120: 69 64 28 70 52 74 72 65 65 2c 20 70 52 69 67 68  id(pRtree, pRigh
f130: 74 2c 20 69 29 3b 0a 20 20 20 20 72 63 20 3d 20  t, i);.    rc = 
f140: 75 70 64 61 74 65 4d 61 70 70 69 6e 67 28 70 52  updateMapping(pR
f150: 74 72 65 65 2c 20 69 52 6f 77 69 64 2c 20 70 52  tree, iRowid, pR
f160: 69 67 68 74 2c 20 69 48 65 69 67 68 74 29 3b 0a  ight, iHeight);.
f170: 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d 3d      if( iRowid==
f180: 70 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 20 29 7b  pCell->iRowid ){
f190: 0a 20 20 20 20 20 20 6e 65 77 43 65 6c 6c 49 73  .      newCellIs
f1a0: 52 69 67 68 74 20 3d 20 31 3b 0a 20 20 20 20 7d  Right = 1;.    }
f1b0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f1c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f1d0: 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f 6f  goto splitnode_o
f1e0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ut;.    }.  }.  
f1f0: 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65  if( pNode->iNode
f200: 3d 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ==1 ){.    for(i
f210: 3d 30 3b 20 69 3c 4e 43 45 4c 4c 28 70 4c 65 66  =0; i<NCELL(pLef
f220: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  t); i++){.      
f230: 69 36 34 20 69 52 6f 77 69 64 20 3d 20 6e 6f 64  i64 iRowid = nod
f240: 65 47 65 74 52 6f 77 69 64 28 70 52 74 72 65 65  eGetRowid(pRtree
f250: 2c 20 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  , pLeft, i);.   
f260: 20 20 20 72 63 20 3d 20 75 70 64 61 74 65 4d 61     rc = updateMa
f270: 70 70 69 6e 67 28 70 52 74 72 65 65 2c 20 69 52  pping(pRtree, iR
f280: 6f 77 69 64 2c 20 70 4c 65 66 74 2c 20 69 48 65  owid, pLeft, iHe
f290: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ight);.      if(
f2a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f2b0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
f2c0: 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20  plitnode_out;.  
f2d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
f2e0: 6c 73 65 20 69 66 28 20 6e 65 77 43 65 6c 6c 49  lse if( newCellI
f2f0: 73 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20  sRight==0 ){.   
f300: 20 72 63 20 3d 20 75 70 64 61 74 65 4d 61 70 70   rc = updateMapp
f310: 69 6e 67 28 70 52 74 72 65 65 2c 20 70 43 65 6c  ing(pRtree, pCel
f320: 6c 2d 3e 69 52 6f 77 69 64 2c 20 70 4c 65 66 74  l->iRowid, pLeft
f330: 2c 20 69 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a  , iHeight);.  }.
f340: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f350: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
f360: 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
f370: 72 65 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  ree, pRight);.  
f380: 20 20 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20    pRight = 0;.  
f390: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
f3a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
f3b0: 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52  = nodeRelease(pR
f3c0: 74 72 65 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  tree, pLeft);.  
f3d0: 20 20 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 7d    pLeft = 0;.  }
f3e0: 0a 0a 73 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3a  ..splitnode_out:
f3f0: 0a 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70  .  nodeRelease(p
f400: 52 74 72 65 65 2c 20 70 52 69 67 68 74 29 3b 0a  Rtree, pRight);.
f410: 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52    nodeRelease(pR
f420: 74 72 65 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  tree, pLeft);.  
f430: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 43 65  sqlite3_free(aCe
f440: 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ll);.  return rc
f450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 6e 6f  ;.}../*.** If no
f460: 64 65 20 70 4c 65 61 66 20 69 73 20 6e 6f 74 20  de pLeaf is not 
f470: 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
f480: 72 2d 74 72 65 65 20 61 6e 64 20 69 74 73 20 70  r-tree and its p
f490: 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 69  Parent pointer i
f4a0: 73 20 0a 2a 2a 20 73 74 69 6c 6c 20 4e 55 4c 4c  s .** still NULL
f4b0: 2c 20 6c 6f 61 64 20 61 6c 6c 20 61 6e 63 65 73  , load all ances
f4c0: 74 6f 72 20 6e 6f 64 65 73 20 6f 66 20 70 4c 65  tor nodes of pLe
f4d0: 61 66 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 61  af into memory a
f4e0: 6e 64 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74  nd populate.** t
f4f0: 68 65 20 70 4c 65 61 66 2d 3e 70 50 61 72 65 6e  he pLeaf->pParen
f500: 74 20 63 68 61 69 6e 20 61 6c 6c 20 74 68 65 20  t chain all the 
f510: 77 61 79 20 75 70 20 74 6f 20 74 68 65 20 72 6f  way up to the ro
f520: 6f 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  ot node..**.** T
f530: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  his operation is
f540: 20 72 65 71 75 69 72 65 64 20 77 68 65 6e 20 61   required when a
f550: 20 72 6f 77 20 69 73 20 64 65 6c 65 74 65 64 20   row is deleted 
f560: 28 6f 72 20 75 70 64 61 74 65 64 20 2d 20 61 6e  (or updated - an
f570: 20 75 70 64 61 74 65 0a 2a 2a 20 69 73 20 69 6d   update.** is im
f580: 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 64  plemented as a d
f590: 65 6c 65 74 65 20 66 6f 6c 6c 6f 77 65 64 20 62  elete followed b
f5a0: 79 20 61 6e 20 69 6e 73 65 72 74 29 2e 20 53 51  y an insert). SQ
f5b0: 4c 69 74 65 20 70 72 6f 76 69 64 65 73 20 74 68  Lite provides th
f5c0: 65 0a 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68  e.** rowid of th
f5d0: 65 20 72 6f 77 20 74 6f 20 64 65 6c 65 74 65 2c  e row to delete,
f5e0: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 75 73   which can be us
f5f0: 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  ed to find the l
f600: 65 61 66 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20  eaf on which.** 
f610: 74 68 65 20 65 6e 74 72 79 20 72 65 73 69 64 65  the entry reside
f620: 73 20 28 61 72 67 75 6d 65 6e 74 20 70 4c 65 61  s (argument pLea
f630: 66 29 2e 20 4f 6e 63 65 20 74 68 65 20 6c 65 61  f). Once the lea
f640: 66 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 74 68  f is located, th
f650: 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
f660: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 65 74  is called to det
f670: 65 72 6d 69 6e 65 20 69 74 73 20 61 6e 63 65 73  ermine its ances
f680: 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  try..*/.static i
f690: 6e 74 20 66 69 78 4c 65 61 66 50 61 72 65 6e 74  nt fixLeafParent
f6a0: 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20  (Rtree *pRtree, 
f6b0: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65 61 66  RtreeNode *pLeaf
f6c0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
f6d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65  LITE_OK;.  Rtree
f6e0: 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20 3d 20 70  Node *pChild = p
f6f0: 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65 28 20 72  Leaf;.  while( r
f700: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f710: 70 43 68 69 6c 64 2d 3e 69 4e 6f 64 65 21 3d 31  pChild->iNode!=1
f720: 20 26 26 20 70 43 68 69 6c 64 2d 3e 70 50 61 72   && pChild->pPar
f730: 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ent==0 ){.    in
f740: 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
f750: 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  K;          /* s
f760: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 72  qlite3_reset() r
f770: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
f780: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
f790: 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70 52 65  nt64(pRtree->pRe
f7a0: 61 64 50 61 72 65 6e 74 2c 20 31 2c 20 70 43 68  adParent, 1, pCh
f7b0: 69 6c 64 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20  ild->iNode);.   
f7c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
f7d0: 65 70 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64  ep(pRtree->pRead
f7e0: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
f7f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc==SQLITE_ROW 
f800: 29 7b 0a 20 20 20 20 20 20 52 74 72 65 65 4e 6f  ){.      RtreeNo
f810: 64 65 20 2a 70 54 65 73 74 3b 20 20 20 20 20 20  de *pTest;      
f820: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
f830: 74 65 73 74 20 66 6f 72 20 72 65 66 65 72 65 6e  test for referen
f840: 63 65 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  ce loops */.    
f850: 20 20 69 36 34 20 69 4e 6f 64 65 3b 20 20 20 20    i64 iNode;    
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f870: 20 4e 6f 64 65 20 6e 75 6d 62 65 72 20 6f 66 20   Node number of 
f880: 70 61 72 65 6e 74 20 6e 6f 64 65 20 2a 2f 0a 0a  parent node */..
f890: 20 20 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20        /* Before 
f8a0: 73 65 74 74 69 6e 67 20 70 43 68 69 6c 64 2d 3e  setting pChild->
f8b0: 70 50 61 72 65 6e 74 2c 20 74 65 73 74 20 74 68  pParent, test th
f8c0: 61 74 20 77 65 20 61 72 65 20 6e 6f 74 20 63 72  at we are not cr
f8d0: 65 61 74 69 6e 67 20 61 0a 20 20 20 20 20 20 2a  eating a.      *
f8e0: 2a 20 6c 6f 6f 70 20 6f 66 20 72 65 66 65 72 65  * loop of refere
f8f0: 6e 63 65 73 20 28 61 73 20 77 65 20 77 6f 75 6c  nces (as we woul
f900: 64 20 69 66 2c 20 73 61 79 2c 20 70 43 68 69 6c  d if, say, pChil
f910: 64 3d 3d 70 50 61 72 65 6e 74 29 2e 20 57 65 20  d==pParent). We 
f920: 64 6f 6e 27 74 0a 20 20 20 20 20 20 2a 2a 20 77  don't.      ** w
f930: 61 6e 74 20 74 6f 20 64 6f 20 74 68 69 73 20 61  ant to do this a
f940: 73 20 69 74 20 6c 65 61 64 73 20 74 6f 20 61 20  s it leads to a 
f950: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
f960: 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74   trying to delet
f970: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72  e.      ** the r
f980: 65 66 65 72 65 6e 63 65 64 20 63 6f 75 6e 74 65  eferenced counte
f990: 64 20 6e 6f 64 65 20 73 74 72 75 63 74 75 72 65  d node structure
f9a0: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
f9b0: 20 20 69 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65    iNode = sqlite
f9c0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
f9d0: 52 74 72 65 65 2d 3e 70 52 65 61 64 50 61 72 65  Rtree->pReadPare
f9e0: 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  nt, 0);.      fo
f9f0: 72 28 70 54 65 73 74 3d 70 4c 65 61 66 3b 20 70  r(pTest=pLeaf; p
fa00: 54 65 73 74 20 26 26 20 70 54 65 73 74 2d 3e 69  Test && pTest->i
fa10: 4e 6f 64 65 21 3d 69 4e 6f 64 65 3b 20 70 54 65  Node!=iNode; pTe
fa20: 73 74 3d 70 54 65 73 74 2d 3e 70 50 61 72 65 6e  st=pTest->pParen
fa30: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  t);.      if( !p
fa40: 54 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Test ){.        
fa50: 72 63 32 20 3d 20 6e 6f 64 65 41 63 71 75 69 72  rc2 = nodeAcquir
fa60: 65 28 70 52 74 72 65 65 2c 20 69 4e 6f 64 65 2c  e(pRtree, iNode,
fa70: 20 30 2c 20 26 70 43 68 69 6c 64 2d 3e 70 50 61   0, &pChild->pPa
fa80: 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rent);.      }. 
fa90: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
faa0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 74 72  lite3_reset(pRtr
fab0: 65 65 2d 3e 70 52 65 61 64 50 61 72 65 6e 74 29  ee->pReadParent)
fac0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
fad0: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
fae0: 63 32 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  c2;.    if( rc==
faf0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43  SQLITE_OK && !pC
fb00: 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 20 29 20  hild->pParent ) 
fb10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
fb20: 55 50 54 3b 0a 20 20 20 20 70 43 68 69 6c 64 20  UPT;.    pChild 
fb30: 3d 20 70 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e  = pChild->pParen
fb40: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
fb50: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
fb60: 74 20 64 65 6c 65 74 65 43 65 6c 6c 28 52 74 72  t deleteCell(Rtr
fb70: 65 65 20 2a 2c 20 52 74 72 65 65 4e 6f 64 65 20  ee *, RtreeNode 
fb80: 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 0a 73  *, int, int);..s
fb90: 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
fba0: 4e 6f 64 65 28 52 74 72 65 65 20 2a 70 52 74 72  Node(Rtree *pRtr
fbb0: 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70  ee, RtreeNode *p
fbc0: 4e 6f 64 65 2c 20 69 6e 74 20 69 48 65 69 67 68  Node, int iHeigh
fbd0: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
fbe0: 69 6e 74 20 72 63 32 3b 0a 20 20 52 74 72 65 65  int rc2;.  Rtree
fbf0: 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20  Node *pParent;. 
fc00: 20 69 6e 74 20 69 43 65 6c 6c 3b 0a 0a 20 20 61   int iCell;..  a
fc10: 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 52  ssert( pNode->nR
fc20: 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 52  ef==1 );..  /* R
fc30: 65 6d 6f 76 65 20 74 68 65 20 65 6e 74 72 79 20  emove the entry 
fc40: 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 63 65  in the parent ce
fc50: 6c 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6e 6f  ll. */.  rc = no
fc60: 64 65 50 61 72 65 6e 74 49 6e 64 65 78 28 70 52  deParentIndex(pR
fc70: 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 26 69 43  tree, pNode, &iC
fc80: 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ell);.  if( rc==
fc90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
fca0: 20 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65   pParent = pNode
fcb0: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70  ->pParent;.    p
fcc0: 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Node->pParent = 
fcd0: 30 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 6c 65  0;.    rc = dele
fce0: 74 65 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70  teCell(pRtree, p
fcf0: 50 61 72 65 6e 74 2c 20 69 43 65 6c 6c 2c 20 69  Parent, iCell, i
fd00: 48 65 69 67 68 74 2b 31 29 3b 0a 20 20 7d 0a 20  Height+1);.  }. 
fd10: 20 72 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61   rc2 = nodeRelea
fd20: 73 65 28 70 52 74 72 65 65 2c 20 70 50 61 72 65  se(pRtree, pPare
fd30: 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nt);.  if( rc==S
fd40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fd50: 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20  rc = rc2;.  }.  
fd60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fd70: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
fd80: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  rc;.  }..  /* Re
fd90: 6d 6f 76 65 20 74 68 65 20 78 78 78 5f 6e 6f 64  move the xxx_nod
fda0: 65 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 73 71  e entry. */.  sq
fdb0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
fdc0: 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65  (pRtree->pDelete
fdd0: 4e 6f 64 65 2c 20 31 2c 20 70 4e 6f 64 65 2d 3e  Node, 1, pNode->
fde0: 69 4e 6f 64 65 29 3b 0a 20 20 73 71 6c 69 74 65  iNode);.  sqlite
fdf0: 33 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70  3_step(pRtree->p
fe00: 44 65 6c 65 74 65 4e 6f 64 65 29 3b 0a 20 20 69  DeleteNode);.  i
fe10: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
fe20: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
fe30: 74 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74  t(pRtree->pDelet
fe40: 65 4e 6f 64 65 29 29 20 29 7b 0a 20 20 20 20 72  eNode)) ){.    r
fe50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
fe60: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 78   /* Remove the x
fe70: 78 78 5f 70 61 72 65 6e 74 20 65 6e 74 72 79 2e  xx_parent entry.
fe80: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 69   */.  sqlite3_bi
fe90: 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d  nd_int64(pRtree-
fea0: 3e 70 44 65 6c 65 74 65 50 61 72 65 6e 74 2c 20  >pDeleteParent, 
feb0: 31 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29  1, pNode->iNode)
fec0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
fed0: 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65  (pRtree->pDelete
fee0: 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 53  Parent);.  if( S
fef0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
ff00: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52  sqlite3_reset(pR
ff10: 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 50 61 72  tree->pDeletePar
ff20: 65 6e 74 29 29 20 29 7b 0a 20 20 20 20 72 65 74  ent)) ){.    ret
ff30: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 0a 20  urn rc;.  }.  . 
ff40: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6e   /* Remove the n
ff50: 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d  ode from the in-
ff60: 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
ff70: 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e  e and link it in
ff80: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 52 74 72 65  to.  ** the Rtre
ff90: 65 2e 70 44 65 6c 65 74 65 64 20 6c 69 73 74 2e  e.pDeleted list.
ffa0: 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 69   Its contents wi
ffb0: 6c 6c 20 62 65 20 72 65 2d 69 6e 73 65 72 74 65  ll be re-inserte
ffc0: 64 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 2a 2f  d later on..  */
ffd0: 0a 20 20 6e 6f 64 65 48 61 73 68 44 65 6c 65 74  .  nodeHashDelet
ffe0: 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29  e(pRtree, pNode)
fff0: 3b 0a 20 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65  ;.  pNode->iNode
10000 20 3d 20 69 48 65 69 67 68 74 3b 0a 20 20 70 4e   = iHeight;.  pN
10010 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 70 52 74  ode->pNext = pRt
10020 72 65 65 2d 3e 70 44 65 6c 65 74 65 64 3b 0a 20  ree->pDeleted;. 
10030 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a   pNode->nRef++;.
10040 20 20 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74    pRtree->pDelet
10050 65 64 20 3d 20 70 4e 6f 64 65 3b 0a 0a 20 20 72  ed = pNode;..  r
10060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10070 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
10080 69 78 42 6f 75 6e 64 69 6e 67 42 6f 78 28 52 74  ixBoundingBox(Rt
10090 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72  ree *pRtree, Rtr
100a0 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a  eeNode *pNode){.
100b0 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61    RtreeNode *pPa
100c0 72 65 6e 74 20 3d 20 70 4e 6f 64 65 2d 3e 70 50  rent = pNode->pP
100d0 61 72 65 6e 74 3b 0a 20 20 69 6e 74 20 72 63 20  arent;.  int rc 
100e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 20 20  = SQLITE_OK; .  
100f0 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20  if( pParent ){. 
10100 20 20 20 69 6e 74 20 69 69 3b 20 0a 20 20 20 20     int ii; .    
10110 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c  int nCell = NCEL
10120 4c 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 52 74  L(pNode);.    Rt
10130 72 65 65 43 65 6c 6c 20 62 6f 78 3b 20 20 20 20  reeCell box;    
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 75 6e 64          /* Bound
10160 69 6e 67 20 62 6f 78 20 66 6f 72 20 70 4e 6f 64  ing box for pNod
10170 65 20 2a 2f 0a 20 20 20 20 6e 6f 64 65 47 65 74  e */.    nodeGet
10180 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f  Cell(pRtree, pNo
10190 64 65 2c 20 30 2c 20 26 62 6f 78 29 3b 0a 20 20  de, 0, &box);.  
101a0 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
101b0 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Cell; ii++){.   
101c0 20 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65 6c     RtreeCell cel
101d0 6c 3b 0a 20 20 20 20 20 20 6e 6f 64 65 47 65 74  l;.      nodeGet
101e0 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f  Cell(pRtree, pNo
101f0 64 65 2c 20 69 69 2c 20 26 63 65 6c 6c 29 3b 0a  de, ii, &cell);.
10200 20 20 20 20 20 20 63 65 6c 6c 55 6e 69 6f 6e 28        cellUnion(
10210 70 52 74 72 65 65 2c 20 26 62 6f 78 2c 20 26 63  pRtree, &box, &c
10220 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ell);.    }.    
10230 62 6f 78 2e 69 52 6f 77 69 64 20 3d 20 70 4e 6f  box.iRowid = pNo
10240 64 65 2d 3e 69 4e 6f 64 65 3b 0a 20 20 20 20 72  de->iNode;.    r
10250 63 20 3d 20 6e 6f 64 65 50 61 72 65 6e 74 49 6e  c = nodeParentIn
10260 64 65 78 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  dex(pRtree, pNod
10270 65 2c 20 26 69 69 29 3b 0a 20 20 20 20 69 66 28  e, &ii);.    if(
10280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10290 7b 0a 20 20 20 20 20 20 6e 6f 64 65 4f 76 65 72  {.      nodeOver
102a0 77 72 69 74 65 43 65 6c 6c 28 70 52 74 72 65 65  writeCell(pRtree
102b0 2c 20 70 50 61 72 65 6e 74 2c 20 26 62 6f 78 2c  , pParent, &box,
102c0 20 69 69 29 3b 0a 20 20 20 20 20 20 72 63 20 3d   ii);.      rc =
102d0 20 66 69 78 42 6f 75 6e 64 69 6e 67 42 6f 78 28   fixBoundingBox(
102e0 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74 29  pRtree, pParent)
102f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10300 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10310 2a 20 44 65 6c 65 74 65 20 74 68 65 20 63 65 6c  * Delete the cel
10320 6c 20 61 74 20 69 6e 64 65 78 20 69 43 65 6c 6c  l at index iCell
10330 20 6f 66 20 6e 6f 64 65 20 70 4e 6f 64 65 2e 20   of node pNode. 
10340 41 66 74 65 72 20 72 65 6d 6f 76 69 6e 67 20 74  After removing t
10350 68 65 0a 2a 2a 20 63 65 6c 6c 2c 20 61 64 6a 75  he.** cell, adju
10360 73 74 20 74 68 65 20 72 2d 74 72 65 65 20 64 61  st the r-tree da
10370 74 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20  ta structure if 
10380 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
10390 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65 43 65  tic int deleteCe
103a0 6c 6c 28 52 74 72 65 65 20 2a 70 52 74 72 65 65  ll(Rtree *pRtree
103b0 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f  , RtreeNode *pNo
103c0 64 65 2c 20 69 6e 74 20 69 43 65 6c 6c 2c 20 69  de, int iCell, i
103d0 6e 74 20 69 48 65 69 67 68 74 29 7b 0a 20 20 52  nt iHeight){.  R
103e0 74 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e  treeNode *pParen
103f0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
10400 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
10410 72 63 20 3d 20 66 69 78 4c 65 61 66 50 61 72 65  rc = fixLeafPare
10420 6e 74 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  nt(pRtree, pNode
10430 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
10440 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   rc;.  }..  /* R
10450 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20 66  emove the cell f
10460 72 6f 6d 20 74 68 65 20 6e 6f 64 65 2e 20 54 68  rom the node. Th
10470 69 73 20 63 61 6c 6c 20 6a 75 73 74 20 6d 6f 76  is call just mov
10480 65 73 20 62 79 74 65 73 20 61 72 6f 75 6e 64 0a  es bytes around.
10490 20 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f    ** the in-memo
104a0 72 79 20 6e 6f 64 65 20 69 6d 61 67 65 2c 20 73  ry node image, s
104b0 6f 20 69 74 20 63 61 6e 6e 6f 74 20 66 61 69 6c  o it cannot fail
104c0 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 64 65 44 65 6c  ..  */.  nodeDel
104d0 65 74 65 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  eteCell(pRtree, 
104e0 70 4e 6f 64 65 2c 20 69 43 65 6c 6c 29 3b 0a 0a  pNode, iCell);..
104f0 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 6f 64 65    /* If the node
10500 20 69 73 20 6e 6f 74 20 74 68 65 20 74 72 65 65   is not the tree
10510 20 72 6f 6f 74 20 61 6e 64 20 6e 6f 77 20 68 61   root and now ha
10520 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
10530 6d 69 6e 69 6d 75 6d 0a 20 20 2a 2a 20 6e 75 6d  minimum.  ** num
10540 62 65 72 20 6f 66 20 63 65 6c 6c 73 2c 20 72 65  ber of cells, re
10550 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
10560 20 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65   tree. Otherwise
10570 2c 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a  , update the.  *
10580 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  * cell in the pa
10590 72 65 6e 74 20 6e 6f 64 65 20 73 6f 20 74 68 61  rent node so tha
105a0 74 20 69 74 20 74 69 67 68 74 6c 79 20 63 6f 6e  t it tightly con
105b0 74 61 69 6e 73 20 74 68 65 20 75 70 64 61 74 65  tains the update
105c0 64 0a 20 20 2a 2a 20 6e 6f 64 65 2e 0a 20 20 2a  d.  ** node..  *
105d0 2f 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 4e  /.  pParent = pN
105e0 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  ode->pParent;.  
105f0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20  assert( pParent 
10600 7c 7c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d  || pNode->iNode=
10610 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  =1 );.  if( pPar
10620 65 6e 74 20 29 7b 0a 20 20 20 20 69 66 28 20 4e  ent ){.    if( N
10630 43 45 4c 4c 28 70 4e 6f 64 65 29 3c 52 54 52 45  CELL(pNode)<RTRE
10640 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52 74 72 65  E_MINCELLS(pRtre
10650 65 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e) ){.      rc =
10660 20 72 65 6d 6f 76 65 4e 6f 64 65 28 70 52 74 72   removeNode(pRtr
10670 65 65 2c 20 70 4e 6f 64 65 2c 20 69 48 65 69 67  ee, pNode, iHeig
10680 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ht);.    }else{.
10690 20 20 20 20 20 20 72 63 20 3d 20 66 69 78 42 6f        rc = fixBo
106a0 75 6e 64 69 6e 67 42 6f 78 28 70 52 74 72 65 65  undingBox(pRtree
106b0 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  , pNode);.    }.
106c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
106d0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
106e0 52 65 69 6e 73 65 72 74 28 0a 20 20 52 74 72 65  Reinsert(.  Rtre
106f0 65 20 2a 70 52 74 72 65 65 2c 20 0a 20 20 52 74  e *pRtree, .  Rt
10700 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20  reeNode *pNode, 
10710 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43  .  RtreeCell *pC
10720 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 69 48 65 69  ell, .  int iHei
10730 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 2a 61 4f  ght.){.  int *aO
10740 72 64 65 72 3b 0a 20 20 69 6e 74 20 2a 61 53 70  rder;.  int *aSp
10750 61 72 65 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c  are;.  RtreeCell
10760 20 2a 61 43 65 6c 6c 3b 0a 20 20 66 6c 6f 61 74   *aCell;.  float
10770 20 2a 61 44 69 73 74 61 6e 63 65 3b 0a 20 20 69   *aDistance;.  i
10780 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 66 6c 6f 61  nt nCell;.  floa
10790 74 20 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 52  t aCenterCoord[R
107a0 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49  TREE_MAX_DIMENSI
107b0 4f 4e 53 5d 3b 0a 20 20 69 6e 74 20 69 44 69 6d  ONS];.  int iDim
107c0 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  ;.  int ii;.  in
107d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
107e0 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 61 43 65 6e  ;..  memset(aCen
107f0 74 65 72 43 6f 6f 72 64 2c 20 30 2c 20 73 69 7a  terCoord, 0, siz
10800 65 6f 66 28 66 6c 6f 61 74 29 2a 52 54 52 45 45  eof(float)*RTREE
10810 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 29  _MAX_DIMENSIONS)
10820 3b 0a 0a 20 20 6e 43 65 6c 6c 20 3d 20 4e 43 45  ;..  nCell = NCE
10830 4c 4c 28 70 4e 6f 64 65 29 2b 31 3b 0a 0a 20 20  LL(pNode)+1;..  
10840 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
10850 62 75 66 66 65 72 73 20 75 73 65 64 20 62 79 20  buffers used by 
10860 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
10870 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
10880 73 0a 20 20 2a 2a 20 72 65 6c 69 6e 71 75 69 73  s.  ** relinquis
10890 68 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  hed before this 
108a0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
108b0 2e 0a 20 20 2a 2f 0a 20 20 61 43 65 6c 6c 20 3d  ..  */.  aCell =
108c0 20 28 52 74 72 65 65 43 65 6c 6c 20 2a 29 73 71   (RtreeCell *)sq
108d0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 43 65  lite3_malloc(nCe
108e0 6c 6c 20 2a 20 28 0a 20 20 20 20 73 69 7a 65 6f  ll * (.    sizeo
108f0 66 28 52 74 72 65 65 43 65 6c 6c 29 20 2b 20 20  f(RtreeCell) +  
10900 20 20 20 20 20 20 20 2f 2a 20 61 43 65 6c 6c 20         /* aCell 
10910 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 73 69 7a  array */.    siz
10920 65 6f 66 28 69 6e 74 29 20 20 20 20 20 20 20 2b  eof(int)       +
10930 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4f 72 64           /* aOrd
10940 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
10950 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20 20 20  sizeof(int)     
10960 20 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 61    +         /* a
10970 53 70 61 72 65 20 61 72 72 61 79 20 2a 2f 0a 20  Spare array */. 
10980 20 20 20 73 69 7a 65 6f 66 28 66 6c 6f 61 74 29     sizeof(float)
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
109a0 2a 20 61 44 69 73 74 61 6e 63 65 20 61 72 72 61  * aDistance arra
109b0 79 20 2a 2f 0a 20 20 29 29 3b 0a 20 20 69 66 28  y */.  ));.  if(
109c0 20 21 61 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72   !aCell ){.    r
109d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
109e0 45 4d 3b 0a 20 20 7d 0a 20 20 61 4f 72 64 65 72  EM;.  }.  aOrder
109f0 20 20 20 20 3d 20 28 69 6e 74 20 2a 29 26 61 43      = (int *)&aC
10a00 65 6c 6c 5b 6e 43 65 6c 6c 5d 3b 0a 20 20 61 53  ell[nCell];.  aS
10a10 70 61 72 65 20 20 20 20 3d 20 28 69 6e 74 20 2a  pare    = (int *
10a20 29 26 61 4f 72 64 65 72 5b 6e 43 65 6c 6c 5d 3b  )&aOrder[nCell];
10a30 0a 20 20 61 44 69 73 74 61 6e 63 65 20 3d 20 28  .  aDistance = (
10a40 66 6c 6f 61 74 20 2a 29 26 61 53 70 61 72 65 5b  float *)&aSpare[
10a50 6e 43 65 6c 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69  nCell];..  for(i
10a60 69 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69  i=0; ii<nCell; i
10a70 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 69  i++){.    if( ii
10a80 3d 3d 28 6e 43 65 6c 6c 2d 31 29 20 29 7b 0a 20  ==(nCell-1) ){. 
10a90 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 43 65       memcpy(&aCe
10aa0 6c 6c 5b 69 69 5d 2c 20 70 43 65 6c 6c 2c 20 73  ll[ii], pCell, s
10ab0 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29  izeof(RtreeCell)
10ac0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10ad0 20 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28      nodeGetCell(
10ae0 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69  pRtree, pNode, i
10af0 69 2c 20 26 61 43 65 6c 6c 5b 69 69 5d 29 3b 0a  i, &aCell[ii]);.
10b00 20 20 20 20 7d 0a 20 20 20 20 61 4f 72 64 65 72      }.    aOrder
10b10 5b 69 69 5d 20 3d 20 69 69 3b 0a 20 20 20 20 66  [ii] = ii;.    f
10b20 6f 72 28 69 44 69 6d 3d 30 3b 20 69 44 69 6d 3c  or(iDim=0; iDim<
10b30 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3b 20 69 44  pRtree->nDim; iD
10b40 69 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 43 65  im++){.      aCe
10b50 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d 20  nterCoord[iDim] 
10b60 2b 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b  += DCOORD(aCell[
10b70 69 69 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a  ii].aCoord[iDim*
10b80 32 5d 29 3b 0a 20 20 20 20 20 20 61 43 65 6e 74  2]);.      aCent
10b90 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d 20 2b 3d  erCoord[iDim] +=
10ba0 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 69 69   DCOORD(aCell[ii
10bb0 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 2b  ].aCoord[iDim*2+
10bc0 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  1]);.    }.  }. 
10bd0 20 66 6f 72 28 69 44 69 6d 3d 30 3b 20 69 44 69   for(iDim=0; iDi
10be0 6d 3c 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3b 20  m<pRtree->nDim; 
10bf0 69 44 69 6d 2b 2b 29 7b 0a 20 20 20 20 61 43 65  iDim++){.    aCe
10c00 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d 20  nterCoord[iDim] 
10c10 3d 20 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 69  = aCenterCoord[i
10c20 44 69 6d 5d 2f 28 28 66 6c 6f 61 74 29 6e 43 65  Dim]/((float)nCe
10c30 6c 6c 2a 32 2e 30 29 3b 0a 20 20 7d 0a 0a 20 20  ll*2.0);.  }..  
10c40 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43 65  for(ii=0; ii<nCe
10c50 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 61  ll; ii++){.    a
10c60 44 69 73 74 61 6e 63 65 5b 69 69 5d 20 3d 20 30  Distance[ii] = 0
10c70 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69 44 69 6d  .0;.    for(iDim
10c80 3d 30 3b 20 69 44 69 6d 3c 70 52 74 72 65 65 2d  =0; iDim<pRtree-
10c90 3e 6e 44 69 6d 3b 20 69 44 69 6d 2b 2b 29 7b 0a  >nDim; iDim++){.
10ca0 20 20 20 20 20 20 66 6c 6f 61 74 20 63 6f 6f 72        float coor
10cb0 64 20 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c  d = DCOORD(aCell
10cc0 5b 69 69 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d  [ii].aCoord[iDim
10cd0 2a 32 2b 31 5d 29 20 2d 20 0a 20 20 20 20 20 20  *2+1]) - .      
10ce0 20 20 20 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c      DCOORD(aCell
10cf0 5b 69 69 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d  [ii].aCoord[iDim
10d00 2a 32 5d 29 3b 0a 20 20 20 20 20 20 61 44 69 73  *2]);.      aDis
10d10 74 61 6e 63 65 5b 69 69 5d 20 2b 3d 20 28 63 6f  tance[ii] += (co
10d20 6f 72 64 2d 61 43 65 6e 74 65 72 43 6f 6f 72 64  ord-aCenterCoord
10d30 5b 69 44 69 6d 5d 29 2a 28 63 6f 6f 72 64 2d 61  [iDim])*(coord-a
10d40 43 65 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d  CenterCoord[iDim
10d50 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ]);.    }.  }.. 
10d60 20 53 6f 72 74 42 79 44 69 73 74 61 6e 63 65 28   SortByDistance(
10d70 61 4f 72 64 65 72 2c 20 6e 43 65 6c 6c 2c 20 61  aOrder, nCell, a
10d80 44 69 73 74 61 6e 63 65 2c 20 61 53 70 61 72 65  Distance, aSpare
10d90 29 3b 0a 20 20 6e 6f 64 65 5a 65 72 6f 28 70 52  );.  nodeZero(pR
10da0 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 0a 20  tree, pNode);.. 
10db0 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
10dc0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 28  QLITE_OK && ii<(
10dd0 6e 43 65 6c 6c 2d 28 52 54 52 45 45 5f 4d 49 4e  nCell-(RTREE_MIN
10de0 43 45 4c 4c 53 28 70 52 74 72 65 65 29 2b 31 29  CELLS(pRtree)+1)
10df0 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74  ); ii++){.    Rt
10e00 72 65 65 43 65 6c 6c 20 2a 70 20 3d 20 26 61 43  reeCell *p = &aC
10e10 65 6c 6c 5b 61 4f 72 64 65 72 5b 69 69 5d 5d 3b  ell[aOrder[ii]];
10e20 0a 20 20 20 20 6e 6f 64 65 49 6e 73 65 72 74 43  .    nodeInsertC
10e30 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ell(pRtree, pNod
10e40 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
10e50 2d 3e 69 52 6f 77 69 64 3d 3d 70 43 65 6c 6c 2d  ->iRowid==pCell-
10e60 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
10e70 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d 30 20   if( iHeight==0 
10e80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10e90 72 6f 77 69 64 57 72 69 74 65 28 70 52 74 72 65  rowidWrite(pRtre
10ea0 65 2c 20 70 2d 3e 69 52 6f 77 69 64 2c 20 70 4e  e, p->iRowid, pN
10eb0 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20  ode->iNode);.   
10ec0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10ed0 20 20 72 63 20 3d 20 70 61 72 65 6e 74 57 72 69    rc = parentWri
10ee0 74 65 28 70 52 74 72 65 65 2c 20 70 2d 3e 69 52  te(pRtree, p->iR
10ef0 6f 77 69 64 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f  owid, pNode->iNo
10f00 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
10f10 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
10f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10f30 20 20 72 63 20 3d 20 66 69 78 42 6f 75 6e 64 69    rc = fixBoundi
10f40 6e 67 42 6f 78 28 70 52 74 72 65 65 2c 20 70 4e  ngBox(pRtree, pN
10f50 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ode);.  }.  for(
10f60 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
10f70 26 26 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b  && ii<nCell; ii+
10f80 2b 29 7b 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  +){.    /* Find 
10f90 61 20 6e 6f 64 65 20 74 6f 20 73 74 6f 72 65 20  a node to store 
10fa0 74 68 69 73 20 63 65 6c 6c 20 69 6e 2e 20 70 4e  this cell in. pN
10fb0 6f 64 65 2d 3e 69 4e 6f 64 65 20 63 75 72 72 65  ode->iNode curre
10fc0 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ntly contains.  
10fd0 20 20 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20    ** the height 
10fe0 6f 66 20 74 68 65 20 73 75 62 2d 74 72 65 65 20  of the sub-tree 
10ff0 68 65 61 64 65 64 20 62 79 20 74 68 65 20 63 65  headed by the ce
11000 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 52  ll..    */.    R
11010 74 72 65 65 4e 6f 64 65 20 2a 70 49 6e 73 65 72  treeNode *pInser
11020 74 3b 0a 20 20 20 20 52 74 72 65 65 43 65 6c 6c  t;.    RtreeCell
11030 20 2a 70 20 3d 20 26 61 43 65 6c 6c 5b 61 4f 72   *p = &aCell[aOr
11040 64 65 72 5b 69 69 5d 5d 3b 0a 20 20 20 20 72 63  der[ii]];.    rc
11050 20 3d 20 43 68 6f 6f 73 65 4c 65 61 66 28 70 52   = ChooseLeaf(pR
11060 74 72 65 65 2c 20 70 2c 20 69 48 65 69 67 68 74  tree, p, iHeight
11070 2c 20 26 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  , &pInsert);.   
11080 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11090 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
110a0 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc2;.      rc = 
110b0 72 74 72 65 65 49 6e 73 65 72 74 43 65 6c 6c 28  rtreeInsertCell(
110c0 70 52 74 72 65 65 2c 20 70 49 6e 73 65 72 74 2c  pRtree, pInsert,
110d0 20 70 2c 20 69 48 65 69 67 68 74 29 3b 0a 20 20   p, iHeight);.  
110e0 20 20 20 20 72 63 32 20 3d 20 6e 6f 64 65 52 65      rc2 = nodeRe
110f0 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 49  lease(pRtree, pI
11100 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 69 66  nsert);.      if
11110 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11120 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
11130 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
11140 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
11150 33 5f 66 72 65 65 28 61 43 65 6c 6c 29 3b 0a 20  3_free(aCell);. 
11160 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11170 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 65 6c 6c  *.** Insert cell
11180 20 70 43 65 6c 6c 20 69 6e 74 6f 20 6e 6f 64 65   pCell into node
11190 20 70 4e 6f 64 65 2e 20 4e 6f 64 65 20 70 4e 6f   pNode. Node pNo
111a0 64 65 20 69 73 20 74 68 65 20 68 65 61 64 20 6f  de is the head o
111b0 66 20 61 20 0a 2a 2a 20 73 75 62 74 72 65 65 20  f a .** subtree 
111c0 69 48 65 69 67 68 74 20 68 69 67 68 20 28 6c 65  iHeight high (le
111d0 61 66 20 6e 6f 64 65 73 20 68 61 76 65 20 69 48  af nodes have iH
111e0 65 69 67 68 74 3d 3d 30 29 2e 0a 2a 2f 0a 73 74  eight==0)..*/.st
111f0 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 49 6e  atic int rtreeIn
11200 73 65 72 74 43 65 6c 6c 28 0a 20 20 52 74 72 65  sertCell(.  Rtre
11210 65 20 2a 70 52 74 72 65 65 2c 0a 20 20 52 74 72  e *pRtree,.  Rtr
11220 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20  eeNode *pNode,. 
11230 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c   RtreeCell *pCel
11240 6c 2c 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74  l,.  int iHeight
11250 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
11260 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
11270 69 48 65 69 67 68 74 3e 30 20 29 7b 0a 20 20 20  iHeight>0 ){.   
11280 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 43 68 69   RtreeNode *pChi
11290 6c 64 20 3d 20 6e 6f 64 65 48 61 73 68 4c 6f 6f  ld = nodeHashLoo
112a0 6b 75 70 28 70 52 74 72 65 65 2c 20 70 43 65 6c  kup(pRtree, pCel
112b0 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  l->iRowid);.    
112c0 69 66 28 20 70 43 68 69 6c 64 20 29 7b 0a 20 20  if( pChild ){.  
112d0 20 20 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28      nodeRelease(
112e0 70 52 74 72 65 65 2c 20 70 43 68 69 6c 64 2d 3e  pRtree, pChild->
112f0 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  pParent);.      
11300 6e 6f 64 65 52 65 66 65 72 65 6e 63 65 28 70 4e  nodeReference(pN
11310 6f 64 65 29 3b 0a 20 20 20 20 20 20 70 43 68 69  ode);.      pChi
11320 6c 64 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e  ld->pParent = pN
11330 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ode;.    }.  }. 
11340 20 69 66 28 20 6e 6f 64 65 49 6e 73 65 72 74 43   if( nodeInsertC
11350 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ell(pRtree, pNod
11360 65 2c 20 70 43 65 6c 6c 29 20 29 7b 0a 23 69 66  e, pCell) ){.#if
11370 20 56 41 52 49 41 4e 54 5f 52 53 54 41 52 54 52   VARIANT_RSTARTR
11380 45 45 5f 52 45 49 4e 53 45 52 54 0a 20 20 20 20  EE_REINSERT.    
11390 69 66 28 20 69 48 65 69 67 68 74 3c 3d 70 52 74  if( iHeight<=pRt
113a0 72 65 65 2d 3e 69 52 65 69 6e 73 65 72 74 48 65  ree->iReinsertHe
113b0 69 67 68 74 20 7c 7c 20 70 4e 6f 64 65 2d 3e 69  ight || pNode->i
113c0 4e 6f 64 65 3d 3d 31 29 7b 0a 20 20 20 20 20 20  Node==1){.      
113d0 72 63 20 3d 20 53 70 6c 69 74 4e 6f 64 65 28 70  rc = SplitNode(p
113e0 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 70 43  Rtree, pNode, pC
113f0 65 6c 6c 2c 20 69 48 65 69 67 68 74 29 3b 0a 20  ell, iHeight);. 
11400 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11410 70 52 74 72 65 65 2d 3e 69 52 65 69 6e 73 65 72  pRtree->iReinser
11420 74 48 65 69 67 68 74 20 3d 20 69 48 65 69 67 68  tHeight = iHeigh
11430 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 52 65  t;.      rc = Re
11440 69 6e 73 65 72 74 28 70 52 74 72 65 65 2c 20 70  insert(pRtree, p
11450 4e 6f 64 65 2c 20 70 43 65 6c 6c 2c 20 69 48 65  Node, pCell, iHe
11460 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6c  ight);.    }.#el
11470 73 65 0a 20 20 20 20 72 63 20 3d 20 53 70 6c 69  se.    rc = Spli
11480 74 4e 6f 64 65 28 70 52 74 72 65 65 2c 20 70 4e  tNode(pRtree, pN
11490 6f 64 65 2c 20 70 43 65 6c 6c 2c 20 69 48 65 69  ode, pCell, iHei
114a0 67 68 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ght);.#endif.  }
114b0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 41  else{.    rc = A
114c0 64 6a 75 73 74 54 72 65 65 28 70 52 74 72 65 65  djustTree(pRtree
114d0 2c 20 70 4e 6f 64 65 2c 20 70 43 65 6c 6c 29 3b  , pNode, pCell);
114e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
114f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11500 69 66 28 20 69 48 65 69 67 68 74 3d 3d 30 20 29  if( iHeight==0 )
11510 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
11520 6f 77 69 64 57 72 69 74 65 28 70 52 74 72 65 65  owidWrite(pRtree
11530 2c 20 70 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 2c  , pCell->iRowid,
11540 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a   pNode->iNode);.
11550 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11560 20 20 20 20 20 72 63 20 3d 20 70 61 72 65 6e 74       rc = parent
11570 57 72 69 74 65 28 70 52 74 72 65 65 2c 20 70 43  Write(pRtree, pC
11580 65 6c 6c 2d 3e 69 52 6f 77 69 64 2c 20 70 4e 6f  ell->iRowid, pNo
11590 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20  de->iNode);.    
115a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
115b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
115c0 61 74 69 63 20 69 6e 74 20 72 65 69 6e 73 65 72  atic int reinser
115d0 74 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 52 74 72  tNodeContent(Rtr
115e0 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65  ee *pRtree, Rtre
115f0 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20  eNode *pNode){. 
11600 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 72   int ii;.  int r
11610 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11620 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45   int nCell = NCE
11630 4c 4c 28 70 4e 6f 64 65 29 3b 0a 0a 20 20 66 6f  LL(pNode);..  fo
11640 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
11650 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 43 65 6c  TE_OK && ii<nCel
11660 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74  l; ii++){.    Rt
11670 72 65 65 4e 6f 64 65 20 2a 70 49 6e 73 65 72 74  reeNode *pInsert
11680 3b 0a 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20  ;.    RtreeCell 
11690 63 65 6c 6c 3b 0a 20 20 20 20 6e 6f 64 65 47 65  cell;.    nodeGe
116a0 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e  tCell(pRtree, pN
116b0 6f 64 65 2c 20 69 69 2c 20 26 63 65 6c 6c 29 3b  ode, ii, &cell);
116c0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20  ..    /* Find a 
116d0 6e 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  node to store th
116e0 69 73 20 63 65 6c 6c 20 69 6e 2e 20 70 4e 6f 64  is cell in. pNod
116f0 65 2d 3e 69 4e 6f 64 65 20 63 75 72 72 65 6e 74  e->iNode current
11700 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  ly contains.    
11710 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  ** the height of
11720 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65   the sub-tree he
11730 61 64 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  aded by the cell
11740 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
11750 3d 20 43 68 6f 6f 73 65 4c 65 61 66 28 70 52 74  = ChooseLeaf(pRt
11760 72 65 65 2c 20 26 63 65 6c 6c 2c 20 70 4e 6f 64  ree, &cell, pNod
11770 65 2d 3e 69 4e 6f 64 65 2c 20 26 70 49 6e 73 65  e->iNode, &pInse
11780 72 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  rt);.    if( rc=
11790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
117a0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
117b0 20 20 20 72 63 20 3d 20 72 74 72 65 65 49 6e 73     rc = rtreeIns
117c0 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  ertCell(pRtree, 
117d0 70 49 6e 73 65 72 74 2c 20 26 63 65 6c 6c 2c 20  pInsert, &cell, 
117e0 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20  pNode->iNode);. 
117f0 20 20 20 20 20 72 63 32 20 3d 20 6e 6f 64 65 52       rc2 = nodeR
11800 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
11810 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 69  Insert);.      i
11820 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11830 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11840 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
11850 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11860 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
11870 6c 65 63 74 20 61 20 63 75 72 72 65 6e 74 6c 79  lect a currently
11880 20 75 6e 75 73 65 64 20 72 6f 77 69 64 20 66 6f   unused rowid fo
11890 72 20 61 20 6e 65 77 20 72 2d 74 72 65 65 20 72  r a new r-tree r
118a0 65 63 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ecord..*/.static
118b0 20 69 6e 74 20 6e 65 77 52 6f 77 69 64 28 52 74   int newRowid(Rt
118c0 72 65 65 20 2a 70 52 74 72 65 65 2c 20 69 36 34  ree *pRtree, i64
118d0 20 2a 70 69 52 6f 77 69 64 29 7b 0a 20 20 69 6e   *piRowid){.  in
118e0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
118f0 62 69 6e 64 5f 6e 75 6c 6c 28 70 52 74 72 65 65  bind_null(pRtree
11900 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 2c 20 31  ->pWriteRowid, 1
11910 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
11920 64 5f 6e 75 6c 6c 28 70 52 74 72 65 65 2d 3e 70  d_null(pRtree->p
11930 57 72 69 74 65 52 6f 77 69 64 2c 20 32 29 3b 0a  WriteRowid, 2);.
11940 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
11950 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77  Rtree->pWriteRow
11960 69 64 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  id);.  rc = sqli
11970 74 65 33 5f 72 65 73 65 74 28 70 52 74 72 65 65  te3_reset(pRtree
11980 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 29 3b 0a  ->pWriteRowid);.
11990 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 73 71 6c    *piRowid = sql
119a0 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
119b0 5f 72 6f 77 69 64 28 70 52 74 72 65 65 2d 3e 64  _rowid(pRtree->d
119c0 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  b);.  return rc;
119d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 55  .}../*.** The xU
119e0 70 64 61 74 65 20 6d 65 74 68 6f 64 20 66 6f 72  pdate method for
119f0 20 72 74 72 65 65 20 6d 6f 64 75 6c 65 20 76 69   rtree module vi
11a00 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
11a10 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65  .static int rtre
11a20 65 55 70 64 61 74 65 28 0a 20 20 73 71 6c 69 74  eUpdate(.  sqlit
11a30 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20  e3_vtab *pVtab, 
11a40 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 0a 20  .  int nData, . 
11a50 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
11a60 2a 61 7a 44 61 74 61 2c 20 0a 20 20 73 71 6c 69  *azData, .  sqli
11a70 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64  te_int64 *pRowid
11a80 0a 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74  .){.  Rtree *pRt
11a90 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70  ree = (Rtree *)p
11aa0 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Vtab;.  int rc =
11ab0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 72   SQLITE_OK;..  r
11ac0 74 72 65 65 52 65 66 65 72 65 6e 63 65 28 70 52  treeReference(pR
11ad0 74 72 65 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  tree);..  assert
11ae0 28 6e 44 61 74 61 3e 3d 31 29 3b 0a 0a 20 20 2f  (nData>=1);..  /
11af0 2a 20 49 66 20 61 7a 44 61 74 61 5b 30 5d 20 69  * If azData[0] i
11b00 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 4e 55 4c  s not an SQL NUL
11b10 4c 20 76 61 6c 75 65 2c 20 69 74 20 69 73 20 74  L value, it is t
11b20 68 65 20 72 6f 77 69 64 20 6f 66 20 61 0a 20 20  he rowid of a.  
11b30 2a 2a 20 72 65 63 6f 72 64 20 74 6f 20 64 65 6c  ** record to del
11b40 65 74 65 20 66 72 6f 6d 20 74 68 65 20 72 2d 74  ete from the r-t
11b50 72 65 65 20 74 61 62 6c 65 2e 20 54 68 65 20 66  ree table. The f
11b60 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64  ollowing block d
11b70 6f 65 73 0a 20 20 2a 2a 20 6a 75 73 74 20 74 68  oes.  ** just th
11b80 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  at..  */.  if( s
11b90 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
11ba0 65 28 61 7a 44 61 74 61 5b 30 5d 29 21 3d 53 51  e(azData[0])!=SQ
11bb0 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
11bc0 20 69 36 34 20 69 44 65 6c 65 74 65 3b 20 20 20   i64 iDelete;   
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11be0 54 68 65 20 72 6f 77 69 64 20 74 6f 20 64 65 6c  The rowid to del
11bf0 65 74 65 20 2a 2f 0a 20 20 20 20 52 74 72 65 65  ete */.    Rtree
11c00 4e 6f 64 65 20 2a 70 4c 65 61 66 3b 20 20 20 20  Node *pLeaf;    
11c10 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 6e         /* Leaf n
11c20 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72  ode containing r
11c30 65 63 6f 72 64 20 69 44 65 6c 65 74 65 20 2a 2f  ecord iDelete */
11c40 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 3b 20  .    int iCell; 
11c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c60 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 69 44 65   /* Index of iDe
11c70 6c 65 74 65 20 63 65 6c 6c 20 69 6e 20 70 4c 65  lete cell in pLe
11c80 61 66 20 2a 2f 0a 20 20 20 20 52 74 72 65 65 4e  af */.    RtreeN
11c90 6f 64 65 20 2a 70 52 6f 6f 74 3b 0a 0a 20 20 20  ode *pRoot;..   
11ca0 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66   /* Obtain a ref
11cb0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 6f  erence to the ro
11cc0 6f 74 20 6e 6f 64 65 20 74 6f 20 69 6e 69 74 69  ot node to initi
11cd0 61 6c 69 73 65 20 52 74 72 65 65 2e 69 44 65 70  alise Rtree.iDep
11ce0 74 68 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6e  th */.    rc = n
11cf0 6f 64 65 41 63 71 75 69 72 65 28 70 52 74 72 65  odeAcquire(pRtre
11d00 65 2c 20 31 2c 20 30 2c 20 26 70 52 6f 6f 74 29  e, 1, 0, &pRoot)
11d10 3b 0a 0a 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  ;..    /* Obtain
11d20 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
11d30 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 74 68  the leaf node th
11d40 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
11d50 65 6e 74 72 79 20 0a 20 20 20 20 2a 2a 20 61 62  entry .    ** ab
11d60 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65  out to be delete
11d70 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
11d80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11d90 20 29 7b 0a 20 20 20 20 20 20 69 44 65 6c 65 74   ){.      iDelet
11da0 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
11db0 65 5f 69 6e 74 36 34 28 61 7a 44 61 74 61 5b 30  e_int64(azData[0
11dc0 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ]);.      rc = f
11dd0 69 6e 64 4c 65 61 66 4e 6f 64 65 28 70 52 74 72  indLeafNode(pRtr
11de0 65 65 2c 20 69 44 65 6c 65 74 65 2c 20 26 70 4c  ee, iDelete, &pL
11df0 65 61 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  eaf);.    }..   
11e00 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 63   /* Delete the c
11e10 65 6c 6c 20 69 6e 20 71 75 65 73 74 69 6f 6e 20  ell in question 
11e20 66 72 6f 6d 20 74 68 65 20 6c 65 61 66 20 6e 6f  from the leaf no
11e30 64 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  de. */.    if( r
11e40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11e50 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20        int rc2;. 
11e60 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 6f       rc = nodeRo
11e70 77 69 64 49 6e 64 65 78 28 70 52 74 72 65 65 2c  widIndex(pRtree,
11e80 20 70 4c 65 61 66 2c 20 69 44 65 6c 65 74 65 2c   pLeaf, iDelete,
11e90 20 26 69 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20   &iCell);.      
11ea0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11eb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
11ec0 3d 20 64 65 6c 65 74 65 43 65 6c 6c 28 70 52 74  = deleteCell(pRt
11ed0 72 65 65 2c 20 70 4c 65 61 66 2c 20 69 43 65 6c  ree, pLeaf, iCel
11ee0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
11ef0 20 20 20 20 20 72 63 32 20 3d 20 6e 6f 64 65 52       rc2 = nodeR
11f00 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
11f10 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28  Leaf);.      if(
11f20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11f30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
11f40 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
11f50 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
11f60 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
11f70 6e 67 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ng entry in the 
11f80 3c 72 74 72 65 65 3e 5f 72 6f 77 69 64 20 74 61  <rtree>_rowid ta
11f90 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ble. */.    if( 
11fa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11fb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
11fc0 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65 65  ind_int64(pRtree
11fd0 2d 3e 70 44 65 6c 65 74 65 52 6f 77 69 64 2c 20  ->pDeleteRowid, 
11fe0 31 2c 20 69 44 65 6c 65 74 65 29 3b 0a 20 20 20  1, iDelete);.   
11ff0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
12000 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 52  pRtree->pDeleteR
12010 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 72 63 20  owid);.      rc 
12020 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
12030 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 52  pRtree->pDeleteR
12040 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  owid);.    }..  
12050 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
12060 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6e 6f 77 20  e root node now 
12070 68 61 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  has exactly one 
12080 63 68 69 6c 64 2e 20 49 66 20 73 6f 2c 20 72 65  child. If so, re
12090 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74 2c 20  move.    ** it, 
120a0 73 63 68 65 64 75 6c 65 20 74 68 65 20 63 6f 6e  schedule the con
120b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 68 69  tents of the chi
120c0 6c 64 20 66 6f 72 20 72 65 69 6e 73 65 72 74 69  ld for reinserti
120d0 6f 6e 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 72  on and .    ** r
120e0 65 64 75 63 65 20 74 68 65 20 74 72 65 65 20 68  educe the tree h
120f0 65 69 67 68 74 20 62 79 20 6f 6e 65 2e 0a 20 20  eight by one..  
12100 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
12110 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
12120 6f 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  o copying the co
12130 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 68  ntents of the ch
12140 69 6c 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  ild into.    ** 
12150 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 28 74  the root node (t
12160 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  he operation tha
12170 74 20 47 75 74 6d 61 6e 27 73 20 70 61 70 65 72  t Gutman's paper
12180 20 73 61 79 73 20 74 6f 20 70 65 72 66 6f 72 6d   says to perform
12190 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73   .    ** in this
121a0 20 73 63 65 6e 61 72 69 6f 29 2e 0a 20 20 20 20   scenario)..    
121b0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
121c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 74 72  QLITE_OK && pRtr
121d0 65 65 2d 3e 69 44 65 70 74 68 3e 30 20 26 26 20  ee->iDepth>0 && 
121e0 4e 43 45 4c 4c 28 70 52 6f 6f 74 29 3d 3d 31 20  NCELL(pRoot)==1 
121f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
12200 3b 0a 20 20 20 20 20 20 52 74 72 65 65 4e 6f 64  ;.      RtreeNod
12210 65 20 2a 70 43 68 69 6c 64 3b 0a 20 20 20 20 20  e *pChild;.     
12220 20 69 36 34 20 69 43 68 69 6c 64 20 3d 20 6e 6f   i64 iChild = no
12230 64 65 47 65 74 52 6f 77 69 64 28 70 52 74 72 65  deGetRowid(pRtre
12240 65 2c 20 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  e, pRoot, 0);.  
12250 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71      rc = nodeAcq
12260 75 69 72 65 28 70 52 74 72 65 65 2c 20 69 43 68  uire(pRtree, iCh
12270 69 6c 64 2c 20 70 52 6f 6f 74 2c 20 26 70 43 68  ild, pRoot, &pCh
12280 69 6c 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ild);.      if( 
12290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
122a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
122b0 6d 6f 76 65 4e 6f 64 65 28 70 52 74 72 65 65 2c  moveNode(pRtree,
122c0 20 70 43 68 69 6c 64 2c 20 70 52 74 72 65 65 2d   pChild, pRtree-
122d0 3e 69 44 65 70 74 68 2d 31 29 3b 0a 20 20 20 20  >iDepth-1);.    
122e0 20 20 7d 0a 20 20 20 20 20 20 72 63 32 20 3d 20    }.      rc2 = 
122f0 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74 72  nodeRelease(pRtr
12300 65 65 2c 20 70 43 68 69 6c 64 29 3b 0a 20 20 20  ee, pChild);.   
12310 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12320 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
12330 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
12340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12350 20 20 20 20 70 52 74 72 65 65 2d 3e 69 44 65 70      pRtree->iDep
12360 74 68 2d 2d 3b 0a 20 20 20 20 20 20 20 20 77 72  th--;.        wr
12370 69 74 65 49 6e 74 31 36 28 70 52 6f 6f 74 2d 3e  iteInt16(pRoot->
12380 7a 44 61 74 61 2c 20 70 52 74 72 65 65 2d 3e 69  zData, pRtree->i
12390 44 65 70 74 68 29 3b 0a 20 20 20 20 20 20 20 20  Depth);.        
123a0 70 52 6f 6f 74 2d 3e 69 73 44 69 72 74 79 20 3d  pRoot->isDirty =
123b0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
123c0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 2d 69 6e 73  }..    /* Re-ins
123d0 65 72 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ert the contents
123e0 20 6f 66 20 61 6e 79 20 75 6e 64 65 72 66 75 6c   of any underful
123f0 6c 20 6e 6f 64 65 73 20 72 65 6d 6f 76 65 64 20  l nodes removed 
12400 66 72 6f 6d 20 74 68 65 20 74 72 65 65 2e 20 2a  from the tree. *
12410 2f 0a 20 20 20 20 66 6f 72 28 70 4c 65 61 66 3d  /.    for(pLeaf=
12420 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 64  pRtree->pDeleted
12430 3b 20 70 4c 65 61 66 3b 20 70 4c 65 61 66 3d 70  ; pLeaf; pLeaf=p
12440 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 64 29  Rtree->pDeleted)
12450 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
12460 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12470 20 20 20 20 20 72 63 20 3d 20 72 65 69 6e 73 65       rc = reinse
12480 72 74 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52  rtNodeContent(pR
12490 74 72 65 65 2c 20 70 4c 65 61 66 29 3b 0a 20 20  tree, pLeaf);.  
124a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52 74 72      }.      pRtr
124b0 65 65 2d 3e 70 44 65 6c 65 74 65 64 20 3d 20 70  ee->pDeleted = p
124c0 4c 65 61 66 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Leaf->pNext;.   
124d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
124e0 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 0a 20  pLeaf);.    }.. 
124f0 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
12500 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
12510 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 2a 2f  he root node. */
12520 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
12530 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12540 72 63 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65  rc = nodeRelease
12550 28 70 52 74 72 65 65 2c 20 70 52 6f 6f 74 29 3b  (pRtree, pRoot);
12560 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12570 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52    nodeRelease(pR
12580 74 72 65 65 2c 20 70 52 6f 6f 74 29 3b 0a 20 20  tree, pRoot);.  
12590 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
125a0 20 74 68 65 20 61 7a 44 61 74 61 5b 5d 20 61 72   the azData[] ar
125b0 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ray contains mor
125c0 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65  e than one eleme
125d0 6e 74 2c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a  nt, elements.  *
125e0 2a 20 28 61 7a 44 61 74 61 5b 32 5d 2e 2e 61 7a  * (azData[2]..az
125f0 44 61 74 61 5b 61 72 67 63 2d 31 5d 29 20 63 6f  Data[argc-1]) co
12600 6e 74 61 69 6e 20 61 20 6e 65 77 20 72 65 63 6f  ntain a new reco
12610 72 64 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  rd to insert int
12620 6f 0a 20 20 2a 2a 20 74 68 65 20 72 2d 74 72 65  o.  ** the r-tre
12630 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
12640 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
12650 54 45 5f 4f 4b 20 26 26 20 6e 44 61 74 61 3e 31  TE_OK && nData>1
12660 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72   ){.    /* Inser
12670 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
12680 6e 74 6f 20 74 68 65 20 72 2d 74 72 65 65 20 2a  nto the r-tree *
12690 2f 0a 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20  /.    RtreeCell 
126a0 63 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 69 69  cell;.    int ii
126b0 3b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20  ;.    RtreeNode 
126c0 2a 70 4c 65 61 66 3b 0a 0a 20 20 20 20 2f 2a 20  *pLeaf;..    /* 
126d0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 63 65 6c  Populate the cel
126e0 6c 2e 61 43 6f 6f 72 64 5b 5d 20 61 72 72 61 79  l.aCoord[] array
126f0 2e 20 54 68 65 20 66 69 72 73 74 20 63 6f 6f 72  . The first coor
12700 64 69 6e 61 74 65 20 69 73 20 61 7a 44 61 74 61  dinate is azData
12710 5b 33 5d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  [3]. */.    asse
12720 72 74 28 20 6e 44 61 74 61 3d 3d 28 70 52 74 72  rt( nData==(pRtr
12730 65 65 2d 3e 6e 44 69 6d 2a 32 20 2b 20 33 29 20  ee->nDim*2 + 3) 
12740 29 3b 0a 20 20 20 20 69 66 28 20 70 52 74 72 65  );.    if( pRtre
12750 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52  e->eCoordType==R
12760 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33  TREE_COORD_REAL3
12770 32 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  2 ){.      for(i
12780 69 3d 30 3b 20 69 69 3c 28 70 52 74 72 65 65 2d  i=0; ii<(pRtree-
12790 3e 6e 44 69 6d 2a 32 29 3b 20 69 69 2b 3d 32 29  >nDim*2); ii+=2)
127a0 7b 0a 20 20 20 20 20 20 20 20 63 65 6c 6c 2e 61  {.        cell.a
127b0 43 6f 6f 72 64 5b 69 69 5d 2e 66 20 3d 20 28 66  Coord[ii].f = (f
127c0 6c 6f 61 74 29 73 71 6c 69 74 65 33 5f 76 61 6c  loat)sqlite3_val
127d0 75 65 5f 64 6f 75 62 6c 65 28 61 7a 44 61 74 61  ue_double(azData
127e0 5b 69 69 2b 33 5d 29 3b 0a 20 20 20 20 20 20 20  [ii+3]);.       
127f0 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b   cell.aCoord[ii+
12800 31 5d 2e 66 20 3d 20 28 66 6c 6f 61 74 29 73 71  1].f = (float)sq
12810 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
12820 6c 65 28 61 7a 44 61 74 61 5b 69 69 2b 34 5d 29  le(azData[ii+4])
12830 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 65  ;.        if( ce
12840 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 5d 2e 66 3e  ll.aCoord[ii].f>
12850 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b 31  cell.aCoord[ii+1
12860 5d 2e 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ].f ){.         
12870 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
12880 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
12890 20 20 20 67 6f 74 6f 20 63 6f 6e 73 74 72 61 69     goto constrai
128a0 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
128b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
128c0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
128d0 20 69 69 3c 28 70 52 74 72 65 65 2d 3e 6e 44 69   ii<(pRtree->nDi
128e0 6d 2a 32 29 3b 20 69 69 2b 3d 32 29 7b 0a 20 20  m*2); ii+=2){.  
128f0 20 20 20 20 20 20 63 65 6c 6c 2e 61 43 6f 6f 72        cell.aCoor
12900 64 5b 69 69 5d 2e 69 20 3d 20 73 71 6c 69 74 65  d[ii].i = sqlite
12910 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 7a 44 61  3_value_int(azDa
12920 74 61 5b 69 69 2b 33 5d 29 3b 0a 20 20 20 20 20  ta[ii+3]);.     
12930 20 20 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69     cell.aCoord[i
12940 69 2b 31 5d 2e 69 20 3d 20 73 71 6c 69 74 65 33  i+1].i = sqlite3
12950 5f 76 61 6c 75 65 5f 69 6e 74 28 61 7a 44 61 74  _value_int(azDat
12960 61 5b 69 69 2b 34 5d 29 3b 0a 20 20 20 20 20 20  a[ii+4]);.      
12970 20 20 69 66 28 20 63 65 6c 6c 2e 61 43 6f 6f 72    if( cell.aCoor
12980 64 5b 69 69 5d 2e 69 3e 63 65 6c 6c 2e 61 43 6f  d[ii].i>cell.aCo
12990 6f 72 64 5b 69 69 2b 31 5d 2e 69 20 29 7b 0a 20  ord[ii+1].i ){. 
129a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
129b0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
129c0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
129d0 63 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  constraint;.    
129e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
129f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75    }..    /* Figu
12a00 72 65 20 6f 75 74 20 74 68 65 20 72 6f 77 69 64  re out the rowid
12a10 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f 77 2e   of the new row.
12a20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
12a30 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
12a40 7a 44 61 74 61 5b 32 5d 29 3d 3d 53 51 4c 49 54  zData[2])==SQLIT
12a50 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  E_NULL ){.      
12a60 72 63 20 3d 20 6e 65 77 52 6f 77 69 64 28 70 52  rc = newRowid(pR
12a70 74 72 65 65 2c 20 26 63 65 6c 6c 2e 69 52 6f 77  tree, &cell.iRow
12a80 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  id);.    }else{.
12a90 20 20 20 20 20 20 63 65 6c 6c 2e 69 52 6f 77 69        cell.iRowi
12aa0 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
12ab0 65 5f 69 6e 74 36 34 28 61 7a 44 61 74 61 5b 32  e_int64(azData[2
12ac0 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ]);.      sqlite
12ad0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74  3_bind_int64(pRt
12ae0 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 2c  ree->pReadRowid,
12af0 20 31 2c 20 63 65 6c 6c 2e 69 52 6f 77 69 64 29   1, cell.iRowid)
12b00 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
12b10 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
12b20 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70 52 65  step(pRtree->pRe
12b30 61 64 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  adRowid) ){.    
12b40 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
12b50 74 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52  t(pRtree->pReadR
12b60 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 72  owid);.        r
12b70 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
12b80 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 67  RAINT;.        g
12b90 6f 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 3b 0a  oto constraint;.
12ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
12bb0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
12bc0 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f  (pRtree->pReadRo
12bd0 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wid);.    }.    
12be0 2a 70 52 6f 77 69 64 20 3d 20 63 65 6c 6c 2e 69  *pRowid = cell.i
12bf0 52 6f 77 69 64 3b 0a 0a 20 20 20 20 69 66 28 20  Rowid;..    if( 
12c00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12c10 0a 20 20 20 20 20 20 72 63 20 3d 20 43 68 6f 6f  .      rc = Choo
12c20 73 65 4c 65 61 66 28 70 52 74 72 65 65 2c 20 26  seLeaf(pRtree, &
12c30 63 65 6c 6c 2c 20 30 2c 20 26 70 4c 65 61 66 29  cell, 0, &pLeaf)
12c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12c50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12c60 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  .      int rc2;.
12c70 20 20 20 20 20 20 70 52 74 72 65 65 2d 3e 69 52        pRtree->iR
12c80 65 69 6e 73 65 72 74 48 65 69 67 68 74 20 3d 20  einsertHeight = 
12c90 2d 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  -1;.      rc = r
12ca0 74 72 65 65 49 6e 73 65 72 74 43 65 6c 6c 28 70  treeInsertCell(p
12cb0 52 74 72 65 65 2c 20 70 4c 65 61 66 2c 20 26 63  Rtree, pLeaf, &c
12cc0 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ell, 0);.      r
12cd0 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65  c2 = nodeRelease
12ce0 28 70 52 74 72 65 65 2c 20 70 4c 65 61 66 29 3b  (pRtree, pLeaf);
12cf0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
12d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12d10 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
12d20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12d30 0a 63 6f 6e 73 74 72 61 69 6e 74 3a 0a 20 20 72  .constraint:.  r
12d40 74 72 65 65 52 65 6c 65 61 73 65 28 70 52 74 72  treeRelease(pRtr
12d50 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ee);.  return rc
12d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  ;.}../*.** The x
12d70 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64 20 66 6f  Rename method fo
12d80 72 20 72 74 72 65 65 20 6d 6f 64 75 6c 65 20 76  r rtree module v
12d90 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a  irtual tables..*
12da0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
12db0 65 65 52 65 6e 61 6d 65 28 73 71 6c 69 74 65 33  eeRename(sqlite3
12dc0 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 63 6f  _vtab *pVtab, co
12dd0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61  nst char *zNewNa
12de0 6d 65 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52  me){.  Rtree *pR
12df0 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29  tree = (Rtree *)
12e00 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVtab;.  int rc 
12e10 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
12e20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
12e30 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
12e40 20 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45      "ALTER TABLE
12e50 20 25 51 2e 27 25 71 5f 6e 6f 64 65 27 20 20 20   %Q.'%q_node'   
12e60 52 45 4e 41 4d 45 20 54 4f 20 5c 22 25 77 5f 6e  RENAME TO \"%w_n
12e70 6f 64 65 5c 22 3b 22 0a 20 20 20 20 22 41 4c 54  ode\";".    "ALT
12e80 45 52 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f  ER TABLE %Q.'%q_
12e90 70 61 72 65 6e 74 27 20 52 45 4e 41 4d 45 20 54  parent' RENAME T
12ea0 4f 20 5c 22 25 77 5f 70 61 72 65 6e 74 5c 22 3b  O \"%w_parent\";
12eb0 22 0a 20 20 20 20 22 41 4c 54 45 52 20 54 41 42  ".    "ALTER TAB
12ec0 4c 45 20 25 51 2e 27 25 71 5f 72 6f 77 69 64 27  LE %Q.'%q_rowid'
12ed0 20 20 52 45 4e 41 4d 45 20 54 4f 20 5c 22 25 77    RENAME TO \"%w
12ee0 5f 72 6f 77 69 64 5c 22 3b 22 0a 20 20 20 20 2c  _rowid\";".    ,
12ef0 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52   pRtree->zDb, pR
12f00 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 65  tree->zName, zNe
12f10 77 4e 61 6d 65 20 0a 20 20 20 20 2c 20 70 52 74  wName .    , pRt
12f20 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65  ree->zDb, pRtree
12f30 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 65 77 4e 61 6d  ->zName, zNewNam
12f40 65 20 0a 20 20 20 20 2c 20 70 52 74 72 65 65 2d  e .    , pRtree-
12f50 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d 3e 7a 4e  >zDb, pRtree->zN
12f60 61 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65 0a 20 20  ame, zNewName.  
12f70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  );.  if( zSql ){
12f80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12f90 33 5f 65 78 65 63 28 70 52 74 72 65 65 2d 3e 64  3_exec(pRtree->d
12fa0 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
12fb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
12fc0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20  ree(zSql);.  }. 
12fd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
12fe0 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f  tatic sqlite3_mo
12ff0 64 75 6c 65 20 72 74 72 65 65 4d 6f 64 75 6c 65  dule rtreeModule
13000 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20   = {.  0,       
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13020 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
13030 0a 20 20 72 74 72 65 65 43 72 65 61 74 65 2c 20  .  rtreeCreate, 
13040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13050 2a 20 78 43 72 65 61 74 65 20 2d 20 63 72 65 61  * xCreate - crea
13060 74 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  te a table */.  
13070 72 74 72 65 65 43 6f 6e 6e 65 63 74 2c 20 20 20  rtreeConnect,   
13080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
13090 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e 65 63  Connect - connec
130a0 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67  t to an existing
130b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65   table */.  rtre
130c0 65 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20  eBestIndex,     
130d0 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74          /* xBest
130e0 49 6e 64 65 78 20 2d 20 44 65 74 65 72 6d 69 6e  Index - Determin
130f0 65 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  e search strateg
13100 79 20 2a 2f 0a 20 20 72 74 72 65 65 44 69 73 63  y */.  rtreeDisc
13110 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20  onnect,         
13120 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63     /* xDisconnec
13130 74 20 2d 20 44 69 73 63 6f 6e 6e 65 63 74 20 66  t - Disconnect f
13140 72 6f 6d 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20  rom a table */. 
13150 20 72 74 72 65 65 44 65 73 74 72 6f 79 2c 20 20   rtreeDestroy,  
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13170 78 44 65 73 74 72 6f 79 20 2d 20 44 72 6f 70 20  xDestroy - Drop 
13180 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72  a table */.  rtr
13190 65 65 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  eeOpen,         
131a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
131b0 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f  n - open a curso
131c0 72 20 2a 2f 0a 20 20 72 74 72 65 65 43 6c 6f 73  r */.  rtreeClos
131d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
131e0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63     /* xClose - c
131f0 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  lose a cursor */
13200 0a 20 20 72 74 72 65 65 46 69 6c 74 65 72 2c 20  .  rtreeFilter, 
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13220 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66  * xFilter - conf
13230 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74  igure scan const
13240 72 61 69 6e 74 73 20 2a 2f 0a 20 20 72 74 72 65  raints */.  rtre
13250 65 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  eNext,          
13260 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74          /* xNext
13270 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72   - advance a cur
13280 73 6f 72 20 2a 2f 0a 20 20 72 74 72 65 65 45 6f  sor */.  rtreeEo
13290 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
132a0 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a       /* xEof */.
132b0 20 20 72 74 72 65 65 43 6f 6c 75 6d 6e 2c 20 20    rtreeColumn,  
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
132d0 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20   xColumn - read 
132e0 64 61 74 61 20 2a 2f 0a 20 20 72 74 72 65 65 52  data */.  rtreeR
132f0 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
13300 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20        /* xRowid 
13310 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
13320 20 72 74 72 65 65 55 70 64 61 74 65 2c 20 20 20   rtreeUpdate,   
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13340 78 55 70 64 61 74 65 20 2d 20 77 72 69 74 65 20  xUpdate - write 
13350 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20  data */.  0,    
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13370 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20        /* xBegin 
13380 2d 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74  - begin transact
13390 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ion */.  0,     
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133b0 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20       /* xSync - 
133c0 73 79 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e  sync transaction
133d0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133f0 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63    /* xCommit - c
13400 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f  ommit transactio
13410 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20     /* xRollback 
13440 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73  - rollback trans
13450 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  action */.  0,  
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13470 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64          /* xFind
13480 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e 63 74  Function - funct
13490 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 20  ion overloading 
134a0 2a 2f 0a 20 20 72 74 72 65 65 52 65 6e 61 6d 65  */.  rtreeRename
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134c0 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d 20 72 65   /* xRename - re
134d0 6e 61 6d 65 20 74 68 65 20 74 61 62 6c 65 20 2a  name the table *
134e0 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  /.};..static int
134f0 20 72 74 72 65 65 53 71 6c 49 6e 69 74 28 0a 20   rtreeSqlInit(. 
13500 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20   Rtree *pRtree, 
13510 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
13520 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13530 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  Db, .  const cha
13540 72 20 2a 7a 50 72 65 66 69 78 2c 20 0a 20 20 69  r *zPrefix, .  i
13550 6e 74 20 69 73 43 72 65 61 74 65 0a 29 7b 0a 20  nt isCreate.){. 
13560 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13570 5f 4f 4b 3b 0a 0a 20 20 23 64 65 66 69 6e 65 20  _OK;..  #define 
13580 4e 5f 53 54 41 54 45 4d 45 4e 54 20 39 0a 20 20  N_STATEMENT 9.  
13590 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
135a0 72 20 2a 61 7a 53 71 6c 5b 4e 5f 53 54 41 54 45  r *azSql[N_STATE
135b0 4d 45 4e 54 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  MENT] = {.    /*
135c0 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
135d0 74 68 65 20 78 78 78 5f 6e 6f 64 65 20 74 61 62  the xxx_node tab
135e0 6c 65 20 2a 2f 0a 20 20 20 20 22 53 45 4c 45 43  le */.    "SELEC
135f0 54 20 64 61 74 61 20 46 52 4f 4d 20 27 25 71 27  T data FROM '%q'
13600 2e 27 25 71 5f 6e 6f 64 65 27 20 57 48 45 52 45  .'%q_node' WHERE
13610 20 6e 6f 64 65 6e 6f 20 3d 20 3a 31 22 2c 0a 20   nodeno = :1",. 
13620 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45     "INSERT OR RE
13630 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e  PLACE INTO '%q'.
13640 27 25 71 5f 6e 6f 64 65 27 20 56 41 4c 55 45 53  '%q_node' VALUES
13650 28 3a 31 2c 20 3a 32 29 22 2c 0a 20 20 20 20 22  (:1, :2)",.    "
13660 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27  DELETE FROM '%q'
13670 2e 27 25 71 5f 6e 6f 64 65 27 20 57 48 45 52 45  .'%q_node' WHERE
13680 20 6e 6f 64 65 6e 6f 20 3d 20 3a 31 22 2c 0a 0a   nodeno = :1",..
13690 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20      /* Read and 
136a0 77 72 69 74 65 20 74 68 65 20 78 78 78 5f 72 6f  write the xxx_ro
136b0 77 69 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  wid table */.   
136c0 20 22 53 45 4c 45 43 54 20 6e 6f 64 65 6e 6f 20   "SELECT nodeno 
136d0 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 72 6f  FROM '%q'.'%q_ro
136e0 77 69 64 27 20 57 48 45 52 45 20 72 6f 77 69 64  wid' WHERE rowid
136f0 20 3d 20 3a 31 22 2c 0a 20 20 20 20 22 49 4e 53   = :1",.    "INS
13700 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
13710 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 72 6f 77  NTO '%q'.'%q_row
13720 69 64 27 20 56 41 4c 55 45 53 28 3a 31 2c 20 3a  id' VALUES(:1, :
13730 32 29 22 2c 0a 20 20 20 20 22 44 45 4c 45 54 45  2)",.    "DELETE
13740 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 72   FROM '%q'.'%q_r
13750 6f 77 69 64 27 20 57 48 45 52 45 20 72 6f 77 69  owid' WHERE rowi
13760 64 20 3d 20 3a 31 22 2c 0a 0a 20 20 20 20 2f 2a  d = :1",..    /*
13770 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
13780 74 68 65 20 78 78 78 5f 70 61 72 65 6e 74 20 74  the xxx_parent t
13790 61 62 6c 65 20 2a 2f 0a 20 20 20 20 22 53 45 4c  able */.    "SEL
137a0 45 43 54 20 70 61 72 65 6e 74 6e 6f 64 65 20 46  ECT parentnode F
137b0 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 70 61 72  ROM '%q'.'%q_par
137c0 65 6e 74 27 20 57 48 45 52 45 20 6e 6f 64 65 6e  ent' WHERE noden
137d0 6f 20 3d 20 3a 31 22 2c 0a 20 20 20 20 22 49 4e  o = :1",.    "IN
137e0 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
137f0 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 70 61  INTO '%q'.'%q_pa
13800 72 65 6e 74 27 20 56 41 4c 55 45 53 28 3a 31 2c  rent' VALUES(:1,
13810 20 3a 32 29 22 2c 0a 20 20 20 20 22 44 45 4c 45   :2)",.    "DELE
13820 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71  TE FROM '%q'.'%q
13830 5f 70 61 72 65 6e 74 27 20 57 48 45 52 45 20 6e  _parent' WHERE n
13840 6f 64 65 6e 6f 20 3d 20 3a 31 22 0a 20 20 7d 3b  odeno = :1".  };
13850 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
13860 2a 2a 61 70 70 53 74 6d 74 5b 4e 5f 53 54 41 54  **appStmt[N_STAT
13870 45 4d 45 4e 54 5d 3b 0a 20 20 69 6e 74 20 69 3b  EMENT];.  int i;
13880 0a 0a 20 20 70 52 74 72 65 65 2d 3e 64 62 20 3d  ..  pRtree->db =
13890 20 64 62 3b 0a 0a 20 20 69 66 28 20 69 73 43 72   db;..  if( isCr
138a0 65 61 74 65 20 29 7b 0a 20 20 20 20 63 68 61 72  eate ){.    char
138b0 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69   *zCreate = sqli
138c0 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 22 43 52  te3_mprintf(."CR
138d0 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c  EATE TABLE \"%w\
138e0 22 2e 5c 22 25 77 5f 6e 6f 64 65 5c 22 28 6e 6f  ".\"%w_node\"(no
138f0 64 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  deno INTEGER PRI
13900 4d 41 52 59 20 4b 45 59 2c 20 64 61 74 61 20 42  MARY KEY, data B
13910 4c 4f 42 29 3b 22 0a 22 43 52 45 41 54 45 20 54  LOB);"."CREATE T
13920 41 42 4c 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77  ABLE \"%w\".\"%w
13930 5f 72 6f 77 69 64 5c 22 28 72 6f 77 69 64 20 49  _rowid\"(rowid I
13940 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
13950 45 59 2c 20 6e 6f 64 65 6e 6f 20 49 4e 54 45 47  EY, nodeno INTEG
13960 45 52 29 3b 22 0a 22 43 52 45 41 54 45 20 54 41  ER);"."CREATE TA
13970 42 4c 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f  BLE \"%w\".\"%w_
13980 70 61 72 65 6e 74 5c 22 28 6e 6f 64 65 6e 6f 20  parent\"(nodeno 
13990 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
139a0 4b 45 59 2c 20 70 61 72 65 6e 74 6e 6f 64 65 20  KEY, parentnode 
139b0 49 4e 54 45 47 45 52 29 3b 22 0a 22 49 4e 53 45  INTEGER);"."INSE
139c0 52 54 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71  RT INTO '%q'.'%q
139d0 5f 6e 6f 64 65 27 20 56 41 4c 55 45 53 28 31 2c  _node' VALUES(1,
139e0 20 7a 65 72 6f 62 6c 6f 62 28 25 64 29 29 22 2c   zeroblob(%d))",
139f0 0a 20 20 20 20 20 20 7a 44 62 2c 20 7a 50 72 65  .      zDb, zPre
13a00 66 69 78 2c 20 7a 44 62 2c 20 7a 50 72 65 66 69  fix, zDb, zPrefi
13a10 78 2c 20 7a 44 62 2c 20 7a 50 72 65 66 69 78 2c  x, zDb, zPrefix,
13a20 20 7a 44 62 2c 20 7a 50 72 65 66 69 78 2c 20 70   zDb, zPrefix, p
13a30 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65  Rtree->iNodeSize
13a40 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
13a50 21 7a 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20  !zCreate ){.    
13a60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13a70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
13a80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
13a90 65 63 28 64 62 2c 20 7a 43 72 65 61 74 65 2c 20  ec(db, zCreate, 
13aa0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
13ab0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61  lite3_free(zCrea
13ac0 74 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  te);.    if( rc!
13ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13ae0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13af0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 70 70 53     }.  }..  appS
13b00 74 6d 74 5b 30 5d 20 3d 20 26 70 52 74 72 65 65  tmt[0] = &pRtree
13b10 2d 3e 70 52 65 61 64 4e 6f 64 65 3b 0a 20 20 61  ->pReadNode;.  a
13b20 70 70 53 74 6d 74 5b 31 5d 20 3d 20 26 70 52 74  ppStmt[1] = &pRt
13b30 72 65 65 2d 3e 70 57 72 69 74 65 4e 6f 64 65 3b  ree->pWriteNode;
13b40 0a 20 20 61 70 70 53 74 6d 74 5b 32 5d 20 3d 20  .  appStmt[2] = 
13b50 26 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65  &pRtree->pDelete
13b60 4e 6f 64 65 3b 0a 20 20 61 70 70 53 74 6d 74 5b  Node;.  appStmt[
13b70 33 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 52  3] = &pRtree->pR
13b80 65 61 64 52 6f 77 69 64 3b 0a 20 20 61 70 70 53  eadRowid;.  appS
13b90 74 6d 74 5b 34 5d 20 3d 20 26 70 52 74 72 65 65  tmt[4] = &pRtree
13ba0 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 3b 0a 20  ->pWriteRowid;. 
13bb0 20 61 70 70 53 74 6d 74 5b 35 5d 20 3d 20 26 70   appStmt[5] = &p
13bc0 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 52 6f  Rtree->pDeleteRo
13bd0 77 69 64 3b 0a 20 20 61 70 70 53 74 6d 74 5b 36  wid;.  appStmt[6
13be0 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 52 65  ] = &pRtree->pRe
13bf0 61 64 50 61 72 65 6e 74 3b 0a 20 20 61 70 70 53  adParent;.  appS
13c00 74 6d 74 5b 37 5d 20 3d 20 26 70 52 74 72 65 65  tmt[7] = &pRtree
13c10 2d 3e 70 57 72 69 74 65 50 61 72 65 6e 74 3b 0a  ->pWriteParent;.
13c20 20 20 61 70 70 53 74 6d 74 5b 38 5d 20 3d 20 26    appStmt[8] = &
13c30 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 50  pRtree->pDeleteP
13c40 61 72 65 6e 74 3b 0a 0a 20 20 66 6f 72 28 69 3d  arent;..  for(i=
13c50 30 3b 20 69 3c 4e 5f 53 54 41 54 45 4d 45 4e 54  0; i<N_STATEMENT
13c60 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
13c70 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  K; i++){.    cha
13c80 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  r *zSql = sqlite
13c90 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b  3_mprintf(azSql[
13ca0 69 5d 2c 20 7a 44 62 2c 20 7a 50 72 65 66 69 78  i], zDb, zPrefix
13cb0 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20  );.    if( zSql 
13cc0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
13cd0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
13ce0 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 61  (db, zSql, -1, a
13cf0 70 70 53 74 6d 74 5b 69 5d 2c 20 30 29 3b 20 0a  ppStmt[i], 0); .
13d00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13d10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
13d20 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  EM;.    }.    sq
13d30 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
13d40 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
13d50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
13d60 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13d70 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
13d80 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  n contains the t
13d90 65 78 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74  ext of an SQL st
13da0 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20  atement.** that 
13db0 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65  returns a single
13dc0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20   integer value. 
13dd0 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  The statement is
13de0 20 63 6f 6d 70 69 6c 65 64 20 61 6e 64 20 65 78   compiled and ex
13df0 65 63 75 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  ecuted.** using 
13e00 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13e10 69 6f 6e 20 64 62 2e 20 49 66 20 73 75 63 63 65  ion db. If succe
13e20 73 73 66 75 6c 2c 20 74 68 65 20 69 6e 74 65 67  ssful, the integ
13e30 65 72 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  er value returne
13e40 64 0a 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20  d.** is written 
13e50 74 6f 20 2a 70 69 56 61 6c 20 61 6e 64 20 53 51  to *piVal and SQ
13e60 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
13e70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
13e80 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
13e90 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13ea0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
13eb0 66 20 2a 70 69 56 61 6c 20 61 66 74 65 72 20 72  f *piVal after r
13ec0 65 74 75 72 6e 69 6e 67 20 69 73 20 6e 6f 74 20  eturning is not 
13ed0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
13ee0 69 63 20 69 6e 74 20 67 65 74 49 6e 74 46 72 6f  ic int getIntFro
13ef0 6d 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64  mStmt(sqlite3 *d
13f00 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
13f10 53 71 6c 2c 20 69 6e 74 20 2a 70 69 56 61 6c 29  Sql, int *piVal)
13f20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13f30 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28  ITE_NOMEM;.  if(
13f40 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 73 71 6c   zSql ){.    sql
13f50 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
13f60 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
13f70 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
13f80 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
13f90 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
13fa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13fb0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  K ){.      if( S
13fc0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
13fd0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
13fe0 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 56 61 6c  {.        *piVal
13ff0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
14000 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
14010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
14020 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
14030 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
14040 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14050 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
14060 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
14070 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
14080 20 74 68 65 20 78 43 6f 6e 6e 65 63 74 28 29 20   the xConnect() 
14090 6f 72 20 78 43 72 65 61 74 65 28 29 20 6d 65 74  or xCreate() met
140a0 68 6f 64 20 74 6f 0a 2a 2a 20 64 65 74 65 72 6d  hod to.** determ
140b0 69 6e 65 20 74 68 65 20 6e 6f 64 65 2d 73 69 7a  ine the node-siz
140c0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 72 74  e used by the rt
140d0 72 65 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ree table being 
140e0 63 72 65 61 74 65 64 20 6f 72 20 63 6f 6e 6e 65  created or conne
140f0 63 74 65 64 0a 2a 2a 20 74 6f 2e 20 49 66 20 73  cted.** to. If s
14100 75 63 63 65 73 73 66 75 6c 2c 20 70 52 74 72 65  uccessful, pRtre
14110 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 20 69 73 20  e->iNodeSize is 
14120 70 6f 70 75 6c 61 74 65 64 20 61 6e 64 20 53 51  populated and SQ
14130 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
14140 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
14150 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
14160 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
14170 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
14180 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
14190 67 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  g called as part
141a0 20 6f 66 20 61 6e 20 78 43 6f 6e 6e 65 63 74 28   of an xConnect(
141b0 29 2c 20 74 68 65 6e 20 74 68 65 20 72 74 72 65  ), then the rtre
141c0 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6c 72 65 61  e.** table alrea
141d0 64 79 20 65 78 69 73 74 73 2e 20 49 6e 20 74 68  dy exists. In th
141e0 69 73 20 63 61 73 65 20 74 68 65 20 6e 6f 64 65  is case the node
141f0 2d 73 69 7a 65 20 69 73 20 64 65 74 65 72 6d 69  -size is determi
14200 6e 65 64 20 62 79 20 69 6e 73 70 65 63 74 69 6e  ned by inspectin
14210 67 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 6e 6f  g.** the root no
14220 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a  de of the tree..
14230 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
14240 20 66 6f 72 20 61 6e 20 78 43 72 65 61 74 65 28   for an xCreate(
14250 29 2c 20 75 73 65 20 36 34 20 62 79 74 65 73 20  ), use 64 bytes 
14260 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 64 61  less than the da
14270 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65  tabase page-size
14280 2e 20 0a 2a 2a 20 54 68 69 73 20 65 6e 73 75 72  . .** This ensur
14290 65 73 20 74 68 61 74 20 65 61 63 68 20 6e 6f 64  es that each nod
142a0 65 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  e is stored on a
142b0 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
142c0 20 70 61 67 65 2e 20 49 66 20 74 68 65 20 0a 2a   page. If the .*
142d0 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  * database page-
142e0 73 69 7a 65 20 69 73 20 73 6f 20 6c 61 72 67 65  size is so large
142f0 20 74 68 61 74 20 6d 6f 72 65 20 74 68 61 6e 20   that more than 
14300 52 54 52 45 45 5f 4d 41 58 43 45 4c 4c 53 20 65  RTREE_MAXCELLS e
14310 6e 74 72 69 65 73 20 0a 2a 2a 20 77 6f 75 6c 64  ntries .** would
14320 20 66 69 74 20 69 6e 20 61 20 73 69 6e 67 6c 65   fit in a single
14330 20 6e 6f 64 65 2c 20 75 73 65 20 61 20 73 6d 61   node, use a sma
14340 6c 6c 65 72 20 6e 6f 64 65 2d 73 69 7a 65 2e 0a  ller node-size..
14350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
14360 74 4e 6f 64 65 53 69 7a 65 28 0a 20 20 73 71 6c  tNodeSize(.  sql
14370 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14390 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
143a0 2a 2f 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  */.  Rtree *pRtr
143b0 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
143c0 20 20 20 20 20 2f 2a 20 52 74 72 65 65 20 68 61       /* Rtree ha
143d0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ndle */.  int is
143e0 43 72 65 61 74 65 20 20 20 20 20 20 20 20 20 20  Create          
143f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
14400 65 20 66 6f 72 20 78 43 72 65 61 74 65 2c 20 66  e for xCreate, f
14410 61 6c 73 65 20 66 6f 72 20 78 43 6f 6e 6e 65 63  alse for xConnec
14420 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
14430 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
14440 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
14450 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 53  {.    int iPageS
14460 69 7a 65 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  ize;.    zSql = 
14470 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
14480 22 50 52 41 47 4d 41 20 25 51 2e 70 61 67 65 5f  "PRAGMA %Q.page_
14490 73 69 7a 65 22 2c 20 70 52 74 72 65 65 2d 3e 7a  size", pRtree->z
144a0 44 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  Db);.    rc = ge
144b0 74 49 6e 74 46 72 6f 6d 53 74 6d 74 28 64 62 2c  tIntFromStmt(db,
144c0 20 7a 53 71 6c 2c 20 26 69 50 61 67 65 53 69 7a   zSql, &iPageSiz
144d0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
144e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
144f0 20 20 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65     pRtree->iNode
14500 53 69 7a 65 20 3d 20 69 50 61 67 65 53 69 7a 65  Size = iPageSize
14510 2d 36 34 3b 0a 20 20 20 20 20 20 69 66 28 20 28  -64;.      if( (
14520 34 2b 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73  4+pRtree->nBytes
14530 50 65 72 43 65 6c 6c 2a 52 54 52 45 45 5f 4d 41  PerCell*RTREE_MA
14540 58 43 45 4c 4c 53 29 3c 70 52 74 72 65 65 2d 3e  XCELLS)<pRtree->
14550 69 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20  iNodeSize ){.   
14560 20 20 20 20 20 70 52 74 72 65 65 2d 3e 69 4e 6f       pRtree->iNo
14570 64 65 53 69 7a 65 20 3d 20 34 2b 70 52 74 72 65  deSize = 4+pRtre
14580 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c  e->nBytesPerCell
14590 2a 52 54 52 45 45 5f 4d 41 58 43 45 4c 4c 53 3b  *RTREE_MAXCELLS;
145a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
145b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 71 6c   }else{.    zSql
145c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
145d0 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c  tf(.        "SEL
145e0 45 43 54 20 6c 65 6e 67 74 68 28 64 61 74 61 29  ECT length(data)
145f0 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 6e   FROM '%q'.'%q_n
14600 6f 64 65 27 20 57 48 45 52 45 20 6e 6f 64 65 6e  ode' WHERE noden
14610 6f 20 3d 20 31 22 2c 0a 20 20 20 20 20 20 20 20  o = 1",.        
14620 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74  pRtree->zDb, pRt
14630 72 65 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  ree->zName.    )
14640 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 49 6e  ;.    rc = getIn
14650 74 46 72 6f 6d 53 74 6d 74 28 64 62 2c 20 7a 53  tFromStmt(db, zS
14660 71 6c 2c 20 26 70 52 74 72 65 65 2d 3e 69 4e 6f  ql, &pRtree->iNo
14670 64 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  deSize);.  }..  
14680 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
14690 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
146a0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
146b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
146c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
146d0 66 20 62 6f 74 68 20 74 68 65 20 78 43 6f 6e 6e  f both the xConn
146e0 65 63 74 20 61 6e 64 20 78 43 72 65 61 74 65 0a  ect and xCreate.
146f0 2a 2a 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  ** methods of th
14700 65 20 72 2d 74 72 65 65 20 76 69 72 74 75 61 6c  e r-tree virtual
14710 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   table..**.**   
14720 61 72 67 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64  argv[0]   -> mod
14730 75 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72  ule name.**   ar
14740 67 76 5b 31 5d 20 20 20 2d 3e 20 64 61 74 61 62  gv[1]   -> datab
14750 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72  ase name.**   ar
14760 67 76 5b 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65  gv[2]   -> table
14770 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b   name.**   argv[
14780 2e 2e 2e 5d 20 2d 3e 20 63 6f 6c 75 6d 6e 20 6e  ...] -> column n
14790 61 6d 65 73 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69  ames....*/.stati
147a0 63 20 69 6e 74 20 72 74 72 65 65 49 6e 69 74 28  c int rtreeInit(
147b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
147e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
147f0 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 20 20  .  void *pAux,  
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14810 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
14820 20 74 68 65 20 52 54 52 45 45 5f 43 4f 4f 52 44   the RTREE_COORD
14830 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  _* constants */.
14840 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73    int argc, cons
14850 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72  t char *const*ar
14860 67 76 2c 20 20 20 2f 2a 20 50 61 72 61 6d 65 74  gv,   /* Paramet
14870 65 72 73 20 74 6f 20 43 52 45 41 54 45 20 54 41  ers to CREATE TA
14880 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  BLE statement */
14890 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
148a0 2a 2a 70 70 56 74 61 62 2c 20 20 20 20 20 20 20  **ppVtab,       
148b0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
148c0 65 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ew virtual table
148d0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
148e0 72 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rr,             
148f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
14900 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 2c  : Error message,
14910 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
14920 20 69 73 43 72 65 61 74 65 20 20 20 20 20 20 20   isCreate       
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 78 43 72   /* True for xCr
14950 65 61 74 65 2c 20 66 61 6c 73 65 20 66 6f 72 20  eate, false for 
14960 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 29 7b 0a 20  xConnect */.){. 
14970 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14980 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 20 2a 70 52  _OK;.  Rtree *pR
14990 74 72 65 65 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  tree;.  int nDb;
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
149b0 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
149c0 67 20 61 72 67 76 5b 31 5d 20 2a 2f 0a 20 20 69  g argv[1] */.  i
149d0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
149e0 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
149f0 66 20 73 74 72 69 6e 67 20 61 72 67 76 5b 32 5d  f string argv[2]
14a00 20 2a 2f 0a 20 20 69 6e 74 20 65 43 6f 6f 72 64   */.  int eCoord
14a10 54 79 70 65 20 3d 20 28 70 41 75 78 20 3f 20 52  Type = (pAux ? R
14a20 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32  TREE_COORD_INT32
14a30 20 3a 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f 52   : RTREE_COORD_R
14a40 45 41 4c 33 32 29 3b 0a 0a 20 20 63 6f 6e 73 74  EAL32);..  const
14a50 20 63 68 61 72 20 2a 61 45 72 72 4d 73 67 5b 5d   char *aErrMsg[]
14a60 20 3d 20 7b 0a 20 20 20 20 30 2c 20 20 20 20 20   = {.    0,     
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14aa0 2a 20 30 20 2a 2f 0a 20 20 20 20 22 57 72 6f 6e  * 0 */.    "Wron
14ab0 67 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  g number of colu
14ac0 6d 6e 73 20 66 6f 72 20 61 6e 20 72 74 72 65 65  mns for an rtree
14ad0 20 74 61 62 6c 65 22 2c 20 20 20 20 20 20 20 20   table",        
14ae0 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 22 54 6f   /* 1 */.    "To
14af0 6f 20 66 65 77 20 63 6f 6c 75 6d 6e 73 20 66 6f  o few columns fo
14b00 72 20 61 6e 20 72 74 72 65 65 20 74 61 62 6c 65  r an rtree table
14b10 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
14b20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 22     /* 2 */.    "
14b30 54 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  Too many columns
14b40 20 66 6f 72 20 61 6e 20 72 74 72 65 65 20 74 61   for an rtree ta
14b50 62 6c 65 22 20 20 20 20 20 20 20 20 20 20 20 20  ble"            
14b60 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 7d       /* 3 */.  }
14b70 3b 0a 0a 20 20 69 6e 74 20 69 45 72 72 20 3d 20  ;..  int iErr = 
14b80 28 61 72 67 63 3c 36 29 20 3f 20 32 20 3a 20 61  (argc<6) ? 2 : a
14b90 72 67 63 3e 28 52 54 52 45 45 5f 4d 41 58 5f 44  rgc>(RTREE_MAX_D
14ba0 49 4d 45 4e 53 49 4f 4e 53 2a 32 2b 34 29 20 3f  IMENSIONS*2+4) ?
14bb0 20 33 20 3a 20 61 72 67 63 25 32 3b 0a 20 20 69   3 : argc%2;.  i
14bc0 66 28 20 61 45 72 72 4d 73 67 5b 69 45 72 72 5d  f( aErrMsg[iErr]
14bd0 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d   ){.    *pzErr =
14be0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
14bf0 28 22 25 73 22 2c 20 61 45 72 72 4d 73 67 5b 69  ("%s", aErrMsg[i
14c00 45 72 72 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  Err]);.    retur
14c10 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
14c20 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
14c30 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  te the sqlite3_v
14c40 74 61 62 20 73 74 72 75 63 74 75 72 65 20 2a 2f  tab structure */
14c50 0a 20 20 6e 44 62 20 3d 20 73 74 72 6c 65 6e 28  .  nDb = strlen(
14c60 61 72 67 76 5b 31 5d 29 3b 0a 20 20 6e 4e 61 6d  argv[1]);.  nNam
14c70 65 20 3d 20 73 74 72 6c 65 6e 28 61 72 67 76 5b  e = strlen(argv[
14c80 32 5d 29 3b 0a 20 20 70 52 74 72 65 65 20 3d 20  2]);.  pRtree = 
14c90 28 52 74 72 65 65 20 2a 29 73 71 6c 69 74 65 33  (Rtree *)sqlite3
14ca0 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 52  _malloc(sizeof(R
14cb0 74 72 65 65 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b  tree)+nDb+nName+
14cc0 32 29 3b 0a 20 20 69 66 28 20 21 70 52 74 72 65  2);.  if( !pRtre
14cd0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
14ce0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14cf0 7d 0a 20 20 6d 65 6d 73 65 74 28 70 52 74 72 65  }.  memset(pRtre
14d00 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72  e, 0, sizeof(Rtr
14d10 65 65 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b 32 29  ee)+nDb+nName+2)
14d20 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e 42 75 73  ;.  pRtree->nBus
14d30 79 20 3d 20 31 3b 0a 20 20 70 52 74 72 65 65 2d  y = 1;.  pRtree-
14d40 3e 62 61 73 65 2e 70 4d 6f 64 75 6c 65 20 3d 20  >base.pModule = 
14d50 26 72 74 72 65 65 4d 6f 64 75 6c 65 3b 0a 20 20  &rtreeModule;.  
14d60 70 52 74 72 65 65 2d 3e 7a 44 62 20 3d 20 28 63  pRtree->zDb = (c
14d70 68 61 72 20 2a 29 26 70 52 74 72 65 65 5b 31 5d  har *)&pRtree[1]
14d80 3b 0a 20 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d  ;.  pRtree->zNam
14d90 65 20 3d 20 26 70 52 74 72 65 65 2d 3e 7a 44 62  e = &pRtree->zDb
14da0 5b 6e 44 62 2b 31 5d 3b 0a 20 20 70 52 74 72 65  [nDb+1];.  pRtre
14db0 65 2d 3e 6e 44 69 6d 20 3d 20 28 61 72 67 63 2d  e->nDim = (argc-
14dc0 34 29 2f 32 3b 0a 20 20 70 52 74 72 65 65 2d 3e  4)/2;.  pRtree->
14dd0 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 20 3d 20  nBytesPerCell = 
14de0 38 20 2b 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d  8 + pRtree->nDim
14df0 2a 34 2a 32 3b 0a 20 20 70 52 74 72 65 65 2d 3e  *4*2;.  pRtree->
14e00 65 43 6f 6f 72 64 54 79 70 65 20 3d 20 65 43 6f  eCoordType = eCo
14e10 6f 72 64 54 79 70 65 3b 0a 20 20 6d 65 6d 63 70  ordType;.  memcp
14e20 79 28 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 61  y(pRtree->zDb, a
14e30 72 67 76 5b 31 5d 2c 20 6e 44 62 29 3b 0a 20 20  rgv[1], nDb);.  
14e40 6d 65 6d 63 70 79 28 70 52 74 72 65 65 2d 3e 7a  memcpy(pRtree->z
14e50 4e 61 6d 65 2c 20 61 72 67 76 5b 32 5d 2c 20 6e  Name, argv[2], n
14e60 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  Name);..  /* Fig
14e70 75 72 65 20 6f 75 74 20 74 68 65 20 6e 6f 64 65  ure out the node
14e80 20 73 69 7a 65 20 74 6f 20 75 73 65 2e 20 2a 2f   size to use. */
14e90 0a 20 20 72 63 20 3d 20 67 65 74 4e 6f 64 65 53  .  rc = getNodeS
14ea0 69 7a 65 28 64 62 2c 20 70 52 74 72 65 65 2c 20  ize(db, pRtree, 
14eb0 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
14ec0 20 43 72 65 61 74 65 2f 43 6f 6e 6e 65 63 74 20   Create/Connect 
14ed0 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  to the underlyin
14ee0 67 20 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61 74  g relational dat
14ef0 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
14f00 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 73 75  .  ** that is su
14f10 63 63 65 73 73 66 75 6c 2c 20 63 61 6c 6c 20 73  ccessful, call s
14f20 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
14f30 74 61 62 28 29 20 74 6f 20 63 6f 6e 66 69 67 75  tab() to configu
14f40 72 65 0a 20 20 2a 2a 20 74 68 65 20 72 2d 74 72  re.  ** the r-tr
14f50 65 65 20 74 61 62 6c 65 20 73 63 68 65 6d 61 2e  ee table schema.
14f60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
14f70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14f80 20 69 66 28 20 28 72 63 20 3d 20 72 74 72 65 65   if( (rc = rtree
14f90 53 71 6c 49 6e 69 74 28 70 52 74 72 65 65 2c 20  SqlInit(pRtree, 
14fa0 64 62 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72 67  db, argv[1], arg
14fb0 76 5b 32 5d 2c 20 69 73 43 72 65 61 74 65 29 29  v[2], isCreate))
14fc0 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72   ){.      *pzErr
14fd0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
14fe0 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
14ff0 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
15000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
15010 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
15020 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43 52 45  te3_mprintf("CRE
15030 41 54 45 20 54 41 42 4c 45 20 78 28 25 73 22 2c  ATE TABLE x(%s",
15040 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 20   argv[3]);.     
15050 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 20   char *zTmp;.   
15060 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
15070 20 66 6f 72 28 69 69 3d 34 3b 20 7a 53 71 6c 20   for(ii=4; zSql 
15080 26 26 20 69 69 3c 61 72 67 63 3b 20 69 69 2b 2b  && ii<argc; ii++
15090 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 6d 70 20  ){.        zTmp 
150a0 3d 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  = zSql;.        
150b0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
150c0 70 72 69 6e 74 66 28 22 25 73 2c 20 25 73 22 2c  printf("%s, %s",
150d0 20 7a 54 6d 70 2c 20 61 72 67 76 5b 69 69 5d 29   zTmp, argv[ii])
150e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
150f0 33 5f 66 72 65 65 28 7a 54 6d 70 29 3b 0a 20 20  3_free(zTmp);.  
15100 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
15110 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  zSql ){.        
15120 7a 54 6d 70 20 3d 20 7a 53 71 6c 3b 0a 20 20 20  zTmp = zSql;.   
15130 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
15140 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 29  te3_mprintf("%s)
15150 3b 22 2c 20 7a 54 6d 70 29 3b 0a 20 20 20 20 20  ;", zTmp);.     
15160 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15170 7a 54 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zTmp);.      }. 
15180 20 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29       if( !zSql )
15190 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
151a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
151b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c     }else if( SQL
151c0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
151d0 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
151e0 61 62 28 64 62 2c 20 7a 53 71 6c 29 29 20 29 7b  ab(db, zSql)) ){
151f0 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20  .        *pzErr 
15200 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
15210 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
15220 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
15230 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
15240 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
15250 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
15260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15270 0a 20 20 20 20 2a 70 70 56 74 61 62 20 3d 20 28  .    *ppVtab = (
15280 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 70  sqlite3_vtab *)p
15290 52 74 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rtree;.  }else{.
152a0 20 20 20 20 72 74 72 65 65 52 65 6c 65 61 73 65      rtreeRelease
152b0 28 70 52 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pRtree);.  }.  
152c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
152d0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
152e0 69 6f 6e 20 6f 66 20 61 20 73 63 61 6c 61 72 20  ion of a scalar 
152f0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 64 65  function that de
15300 63 6f 64 65 73 20 72 2d 74 72 65 65 20 6e 6f 64  codes r-tree nod
15310 65 73 20 74 6f 0a 2a 2a 20 68 75 6d 61 6e 20 72  es to.** human r
15320 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67 73 2e  eadable strings.
15330 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
15340 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
15350 61 6e 64 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a  and analysis..**
15360 0a 2a 2a 20 54 68 65 20 73 63 61 6c 61 72 20 66  .** The scalar f
15370 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 74 77  unction takes tw
15380 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 61 20 62  o arguments, a b
15390 6c 6f 62 20 6f 66 20 64 61 74 61 20 63 6f 6e 74  lob of data cont
153a0 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 72 2d 74  aining.** an r-t
153b0 72 65 65 20 6e 6f 64 65 2c 20 61 6e 64 20 74 68  ree node, and th
153c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 6d 65  e number of dime
153d0 6e 73 69 6f 6e 73 20 74 68 65 20 72 2d 74 72 65  nsions the r-tre
153e0 65 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 46 6f  e indexes..** Fo
153f0 72 20 61 20 74 77 6f 2d 64 69 6d 65 6e 73 69 6f  r a two-dimensio
15400 6e 61 6c 20 72 2d 74 72 65 65 20 73 74 72 75 63  nal r-tree struc
15410 74 75 72 65 20 63 61 6c 6c 65 64 20 22 72 74 22  ture called "rt"
15420 2c 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  , to deserialize
15430 0a 2a 2a 20 61 6c 6c 20 6e 6f 64 65 73 2c 20 61  .** all nodes, a
15440 20 73 74 61 74 65 6d 65 6e 74 20 6c 69 6b 65 3a   statement like:
15450 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
15460 72 74 72 65 65 6e 6f 64 65 28 32 2c 20 64 61 74  rtreenode(2, dat
15470 61 29 20 46 52 4f 4d 20 72 74 5f 6e 6f 64 65 3b  a) FROM rt_node;
15480 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 75 6d 61 6e  .**.** The human
15490 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67   readable string
154a0 20 74 61 6b 65 73 20 74 68 65 20 66 6f 72 6d 20   takes the form 
154b0 6f 66 20 61 20 54 63 6c 20 6c 69 73 74 20 77 69  of a Tcl list wi
154c0 74 68 20 6f 6e 65 0a 2a 2a 20 65 6e 74 72 79 20  th one.** entry 
154d0 66 6f 72 20 65 61 63 68 20 63 65 6c 6c 20 69 6e  for each cell in
154e0 20 74 68 65 20 72 2d 74 72 65 65 20 6e 6f 64 65   the r-tree node
154f0 2e 20 45 61 63 68 20 65 6e 74 72 79 20 69 73 20  . Each entry is 
15500 69 74 73 65 6c 66 20 61 0a 2a 2a 20 6c 69 73 74  itself a.** list
15510 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  , containing the
15520 20 38 2d 62 79 74 65 20 72 6f 77 69 64 2f 70 61   8-byte rowid/pa
15530 67 65 6e 6f 20 66 6f 6c 6c 6f 77 65 64 20 62 79  geno followed by
15540 20 74 68 65 20 0a 2a 2a 20 3c 6e 75 6d 2d 64 69   the .** <num-di
15550 6d 65 6e 73 69 6f 6e 3e 2a 32 20 63 6f 6f 72 64  mension>*2 coord
15560 69 6e 61 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  inates..*/.stati
15570 63 20 76 6f 69 64 20 72 74 72 65 65 6e 6f 64 65  c void rtreenode
15580 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
15590 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c   *ctx, int nArg,
155a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
155b0 2a 61 70 41 72 67 29 7b 0a 20 20 63 68 61 72 20  *apArg){.  char 
155c0 2a 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 52 74  *zText = 0;.  Rt
155d0 72 65 65 4e 6f 64 65 20 6e 6f 64 65 3b 0a 20 20  reeNode node;.  
155e0 52 74 72 65 65 20 74 72 65 65 3b 0a 20 20 69 6e  Rtree tree;.  in
155f0 74 20 69 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  t ii;..  UNUSED_
15600 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b  PARAMETER(nArg);
15610 0a 20 20 6d 65 6d 73 65 74 28 26 6e 6f 64 65 2c  .  memset(&node,
15620 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65   0, sizeof(Rtree
15630 4e 6f 64 65 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Node));.  memset
15640 28 26 74 72 65 65 2c 20 30 2c 20 73 69 7a 65 6f  (&tree, 0, sizeo
15650 66 28 52 74 72 65 65 29 29 3b 0a 20 20 74 72 65  f(Rtree));.  tre
15660 65 2e 6e 44 69 6d 20 3d 20 73 71 6c 69 74 65 33  e.nDim = sqlite3
15670 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 41 72 67  _value_int(apArg
15680 5b 30 5d 29 3b 0a 20 20 74 72 65 65 2e 6e 42 79  [0]);.  tree.nBy
15690 74 65 73 50 65 72 43 65 6c 6c 20 3d 20 38 20 2b  tesPerCell = 8 +
156a0 20 38 20 2a 20 74 72 65 65 2e 6e 44 69 6d 3b 0a   8 * tree.nDim;.
156b0 20 20 6e 6f 64 65 2e 7a 44 61 74 61 20 3d 20 28    node.zData = (
156c0 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  u8 *)sqlite3_val
156d0 75 65 5f 62 6c 6f 62 28 61 70 41 72 67 5b 31 5d  ue_blob(apArg[1]
156e0 29 3b 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  );..  for(ii=0; 
156f0 69 69 3c 4e 43 45 4c 4c 28 26 6e 6f 64 65 29 3b  ii<NCELL(&node);
15700 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72   ii++){.    char
15710 20 7a 43 65 6c 6c 5b 35 31 32 5d 3b 0a 20 20 20   zCell[512];.   
15720 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a   int nCell = 0;.
15730 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65      RtreeCell ce
15740 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 6a 6a 3b 0a  ll;.    int jj;.
15750 0a 20 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c  .    nodeGetCell
15760 28 26 74 72 65 65 2c 20 26 6e 6f 64 65 2c 20 69  (&tree, &node, i
15770 69 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 20 20 73  i, &cell);.    s
15780 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
15790 35 31 32 2d 6e 43 65 6c 6c 2c 26 7a 43 65 6c 6c  512-nCell,&zCell
157a0 5b 6e 43 65 6c 6c 5d 2c 22 25 6c 6c 64 22 2c 20  [nCell],"%lld", 
157b0 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a 20 20  cell.iRowid);.  
157c0 20 20 6e 43 65 6c 6c 20 3d 20 73 74 72 6c 65 6e    nCell = strlen
157d0 28 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 66 6f 72  (zCell);.    for
157e0 28 6a 6a 3d 30 3b 20 6a 6a 3c 74 72 65 65 2e 6e  (jj=0; jj<tree.n
157f0 44 69 6d 2a 32 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  Dim*2; jj++){.  
15800 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
15810 69 6e 74 66 28 35 31 32 2d 6e 43 65 6c 6c 2c 26  intf(512-nCell,&
15820 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 22 20 25  zCell[nCell]," %
15830 66 22 2c 28 64 6f 75 62 6c 65 29 63 65 6c 6c 2e  f",(double)cell.
15840 61 43 6f 6f 72 64 5b 6a 6a 5d 2e 66 29 3b 0a 20  aCoord[jj].f);. 
15850 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 73 74 72       nCell = str
15860 6c 65 6e 28 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  len(zCell);.    
15870 7d 0a 0a 20 20 20 20 69 66 28 20 7a 54 65 78 74  }..    if( zText
15880 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
15890 7a 54 65 78 74 4e 65 77 20 3d 20 73 71 6c 69 74  zTextNew = sqlit
158a0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 7b  e3_mprintf("%s {
158b0 25 73 7d 22 2c 20 7a 54 65 78 74 2c 20 7a 43 65  %s}", zText, zCe
158c0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
158d0 65 33 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a  e3_free(zText);.
158e0 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 7a 54        zText = zT
158f0 65 78 74 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73  extNew;.    }els
15900 65 7b 0a 20 20 20 20 20 20 7a 54 65 78 74 20 3d  e{.      zText =
15910 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
15920 28 22 7b 25 73 7d 22 2c 20 7a 43 65 6c 6c 29 3b  ("{%s}", zCell);
15930 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
15940 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
15950 65 78 74 28 63 74 78 2c 20 7a 54 65 78 74 2c 20  ext(ctx, zText, 
15960 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
15970 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
15980 64 20 72 74 72 65 65 64 65 70 74 68 28 73 71 6c  d rtreedepth(sql
15990 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
159a0 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c  x, int nArg, sql
159b0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
159c0 72 67 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  rg){.  UNUSED_PA
159d0 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20  RAMETER(nArg);. 
159e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
159f0 75 65 5f 74 79 70 65 28 61 70 41 72 67 5b 30 5d  ue_type(apArg[0]
15a00 29 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 0a  )!=SQLITE_BLOB .
15a10 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61     || sqlite3_va
15a20 6c 75 65 5f 62 79 74 65 73 28 61 70 41 72 67 5b  lue_bytes(apArg[
15a30 30 5d 29 3c 32 0a 20 20 29 7b 0a 20 20 20 20 73  0])<2.  ){.    s
15a40 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
15a50 72 6f 72 28 63 74 78 2c 20 22 49 6e 76 61 6c 69  ror(ctx, "Invali
15a60 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 72 74  d argument to rt
15a70 72 65 65 64 65 70 74 68 28 29 22 2c 20 2d 31 29  reedepth()", -1)
15a80 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ; .  }else{.    
15a90 75 38 20 2a 7a 42 6c 6f 62 20 3d 20 28 75 38 20  u8 *zBlob = (u8 
15aa0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
15ab0 62 6c 6f 62 28 61 70 41 72 67 5b 30 5d 29 3b 0a  blob(apArg[0]);.
15ac0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
15ad0 6c 74 5f 69 6e 74 28 63 74 78 2c 20 72 65 61 64  lt_int(ctx, read
15ae0 49 6e 74 31 36 28 7a 42 6c 6f 62 29 29 3b 0a 20  Int16(zBlob));. 
15af0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69   }.}../*.** Regi
15b00 73 74 65 72 20 74 68 65 20 72 2d 74 72 65 65 20  ster the r-tree 
15b10 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61  module with data
15b20 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 20  base handle db. 
15b30 54 68 69 73 20 63 72 65 61 74 65 73 20 74 68 65  This creates the
15b40 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
15b50 65 20 6d 6f 64 75 6c 65 20 22 72 74 72 65 65 22  e module "rtree"
15b60 20 61 6e 64 20 74 68 65 20 64 65 62 75 67 67 69   and the debuggi
15b70 6e 67 2f 61 6e 61 6c 79 73 69 73 20 73 63 61 6c  ng/analysis scal
15b80 61 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ar .** function 
15b90 22 72 74 72 65 65 6e 6f 64 65 22 2e 0a 2a 2f 0a  "rtreenode"..*/.
15ba0 69 6e 74 20 73 71 6c 69 74 65 33 52 74 72 65 65  int sqlite3Rtree
15bb0 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  Init(sqlite3 *db
15bc0 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 75  ){.  const int u
15bd0 74 66 38 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  tf8 = SQLITE_UTF
15be0 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  8;.  int rc;..  
15bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
15c00 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
15c10 20 22 72 74 72 65 65 6e 6f 64 65 22 2c 20 32 2c   "rtreenode", 2,
15c20 20 75 74 66 38 2c 20 30 2c 20 72 74 72 65 65 6e   utf8, 0, rtreen
15c30 6f 64 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  ode, 0, 0);.  if
15c40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15c50 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15c60 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
15c70 69 6f 6e 28 64 62 2c 20 22 72 74 72 65 65 64 65  ion(db, "rtreede
15c80 70 74 68 22 2c 20 31 2c 20 75 74 66 38 2c 20 30  pth", 1, utf8, 0
15c90 2c 72 74 72 65 65 64 65 70 74 68 2c 20 30 2c 20  ,rtreedepth, 0, 
15ca0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
15cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15cc0 20 20 20 76 6f 69 64 20 2a 63 20 3d 20 28 76 6f     void *c = (vo
15cd0 69 64 20 2a 29 52 54 52 45 45 5f 43 4f 4f 52 44  id *)RTREE_COORD
15ce0 5f 52 45 41 4c 33 32 3b 0a 20 20 20 20 72 63 20  _REAL32;.    rc 
15cf0 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
15d00 5f 6d 6f 64 75 6c 65 5f 76 32 28 64 62 2c 20 22  _module_v2(db, "
15d10 72 74 72 65 65 22 2c 20 26 72 74 72 65 65 4d 6f  rtree", &rtreeMo
15d20 64 75 6c 65 2c 20 63 2c 20 30 29 3b 0a 20 20 7d  dule, c, 0);.  }
15d30 0a 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 76 6f 69 64  E_OK ){.    void
15d50 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29 52 54   *c = (void *)RT
15d60 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 3b  REE_COORD_INT32;
15d70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15d80 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f  3_create_module_
15d90 76 32 28 64 62 2c 20 22 72 74 72 65 65 5f 69 33  v2(db, "rtree_i3
15da0 32 22 2c 20 26 72 74 72 65 65 4d 6f 64 75 6c 65  2", &rtreeModule
15db0 2c 20 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , c, 0);.  }..  
15dc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15dd0 0a 2a 2a 20 41 20 76 65 72 73 69 6f 6e 20 6f 66  .** A version of
15de0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
15df0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
15e00 20 61 73 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20   as a callback. 
15e10 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20  This is used.** 
15e20 69 6e 20 74 77 6f 20 70 6c 61 63 65 73 20 2d 20  in two places - 
15e30 61 73 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  as the destructo
15e40 72 20 66 6f 72 20 74 68 65 20 62 6c 6f 62 20 76  r for the blob v
15e50 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
15e60 20 74 68 65 0a 2a 2a 20 69 6e 76 6f 63 61 74 69   the.** invocati
15e70 6f 6e 20 6f 66 20 61 20 67 65 6f 6d 65 74 72 79  on of a geometry
15e80 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 64 20 61   function, and a
15e90 73 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  s the destructor
15ea0 20 66 6f 72 20 74 68 65 20 67 65 6f 6d 65 74 72   for the geometr
15eb0 79 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 74  y.** functions t
15ec0 68 65 6d 73 65 6c 76 65 73 2e 0a 2a 2f 0a 73 74  hemselves..*/.st
15ed0 61 74 69 63 20 76 6f 69 64 20 64 6f 53 71 6c 69  atic void doSqli
15ee0 74 65 33 46 72 65 65 28 76 6f 69 64 20 2a 70 29  te3Free(void *p)
15ef0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
15f00 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61  (p);.}../*.** Ea
15f10 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ch call to sqlit
15f20 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72  e3_rtree_geometr
15f30 79 5f 63 61 6c 6c 62 61 63 6b 28 29 20 63 72 65  y_callback() cre
15f40 61 74 65 73 20 61 6e 20 6f 72 64 69 6e 61 72 79  ates an ordinary
15f50 20 53 51 4c 69 74 65 0a 2a 2a 20 73 63 61 6c 61   SQLite.** scala
15f60 72 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e  r user function.
15f70 20 54 68 69 73 20 43 20 66 75 6e 63 74 69 6f 6e   This C function
15f80 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
15f90 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 73 75   used for all su
15fa0 63 68 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  ch.** registered
15fb0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e 0a   SQL functions..
15fc0 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6c 61 72  **.** The scalar
15fd0 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 20   user functions 
15fe0 72 65 74 75 72 6e 20 61 20 62 6c 6f 62 20 74 68  return a blob th
15ff0 61 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  at is interprete
16000 64 20 62 79 20 72 2d 74 72 65 65 0a 2a 2a 20 74  d by r-tree.** t
16010 61 62 6c 65 20 4d 41 54 43 48 20 6f 70 65 72 61  able MATCH opera
16020 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tors..*/.static 
16030 76 6f 69 64 20 67 65 6f 6d 43 61 6c 6c 62 61 63  void geomCallbac
16040 6b 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  k(sqlite3_contex
16050 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67  t *ctx, int nArg
16060 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
16070 2a 2a 61 41 72 67 29 7b 0a 20 20 52 74 72 65 65  **aArg){.  Rtree
16080 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 70 47  GeomCallback *pG
16090 65 6f 6d 43 74 78 20 3d 20 28 52 74 72 65 65 47  eomCtx = (RtreeG
160a0 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 29 73 71  eomCallback *)sq
160b0 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
160c0 63 74 78 29 3b 0a 20 20 52 74 72 65 65 4d 61 74  ctx);.  RtreeMat
160d0 63 68 41 72 67 20 2a 70 42 6c 6f 62 3b 0a 20 20  chArg *pBlob;.  
160e0 69 6e 74 20 6e 42 6c 6f 62 3b 0a 0a 20 20 6e 42  int nBlob;..  nB
160f0 6c 6f 62 20 3d 20 73 69 7a 65 6f 66 28 52 74 72  lob = sizeof(Rtr
16100 65 65 4d 61 74 63 68 41 72 67 29 20 2b 20 28 6e  eeMatchArg) + (n
16110 41 72 67 2d 31 29 2a 73 69 7a 65 6f 66 28 64 6f  Arg-1)*sizeof(do
16120 75 62 6c 65 29 3b 0a 20 20 70 42 6c 6f 62 20 3d  uble);.  pBlob =
16130 20 28 52 74 72 65 65 4d 61 74 63 68 41 72 67 20   (RtreeMatchArg 
16140 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
16150 28 6e 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 21  (nBlob);.  if( !
16160 70 42 6c 6f 62 20 29 7b 0a 20 20 20 20 73 71 6c  pBlob ){.    sql
16170 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
16180 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20 20  r_nomem(ctx);.  
16190 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
161a0 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 6d 61 67  ;.    pBlob->mag
161b0 69 63 20 3d 20 52 54 52 45 45 5f 47 45 4f 4d 45  ic = RTREE_GEOME
161c0 54 52 59 5f 4d 41 47 49 43 3b 0a 20 20 20 20 70  TRY_MAGIC;.    p
161d0 42 6c 6f 62 2d 3e 78 47 65 6f 6d 20 3d 20 70 47  Blob->xGeom = pG
161e0 65 6f 6d 43 74 78 2d 3e 78 47 65 6f 6d 3b 0a 20  eomCtx->xGeom;. 
161f0 20 20 20 70 42 6c 6f 62 2d 3e 70 43 6f 6e 74 65     pBlob->pConte
16200 78 74 20 3d 20 70 47 65 6f 6d 43 74 78 2d 3e 70  xt = pGeomCtx->p
16210 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 42 6c  Context;.    pBl
16220 6f 62 2d 3e 6e 50 61 72 61 6d 20 3d 20 6e 41 72  ob->nParam = nAr
16230 67 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  g;.    for(i=0; 
16240 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
16250 20 20 20 20 70 42 6c 6f 62 2d 3e 61 50 61 72 61      pBlob->aPara
16260 6d 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76  m[i] = sqlite3_v
16270 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 41 72 67  alue_double(aArg
16280 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
16290 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
162a0 6c 6f 62 28 63 74 78 2c 20 70 42 6c 6f 62 2c 20  lob(ctx, pBlob, 
162b0 6e 42 6c 6f 62 2c 20 64 6f 53 71 6c 69 74 65 33  nBlob, doSqlite3
162c0 46 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Free);.  }.}../*
162d0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
162e0 65 77 20 67 65 6f 6d 65 74 72 79 20 66 75 6e 63  ew geometry func
162f0 74 69 6f 6e 20 66 6f 72 20 75 73 65 20 77 69 74  tion for use wit
16300 68 20 74 68 65 20 72 2d 74 72 65 65 20 4d 41 54  h the r-tree MAT
16310 43 48 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  CH operator..*/.
16320 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 74 72 65  int sqlite3_rtre
16330 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62  e_geometry_callb
16340 61 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ack(.  sqlite3 *
16350 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
16360 20 2a 7a 47 65 6f 6d 2c 0a 20 20 69 6e 74 20 28   *zGeom,.  int (
16370 2a 78 47 65 6f 6d 29 28 73 71 6c 69 74 65 33 5f  *xGeom)(sqlite3_
16380 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 20 2a  rtree_geometry *
16390 2c 20 69 6e 74 2c 20 64 6f 75 62 6c 65 20 2a 2c  , int, double *,
163a0 20 69 6e 74 20 2a 29 2c 0a 20 20 76 6f 69 64 20   int *),.  void 
163b0 2a 70 43 6f 6e 74 65 78 74 0a 29 7b 0a 20 20 52  *pContext.){.  R
163c0 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b  treeGeomCallback
163d0 20 2a 70 47 65 6f 6d 43 74 78 3b 20 20 20 20 20   *pGeomCtx;     
163e0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65   /* Context obje
163f0 63 74 20 66 6f 72 20 6e 65 77 20 75 73 65 72 2d  ct for new user-
16400 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  function */..  /
16410 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  * Allocate and p
16420 6f 70 75 6c 61 74 65 20 74 68 65 20 63 6f 6e 74  opulate the cont
16430 65 78 74 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  ext object. */. 
16440 20 70 47 65 6f 6d 43 74 78 20 3d 20 28 52 74 72   pGeomCtx = (Rtr
16450 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a  eeGeomCallback *
16460 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
16470 73 69 7a 65 6f 66 28 52 74 72 65 65 47 65 6f 6d  sizeof(RtreeGeom
16480 43 61 6c 6c 62 61 63 6b 29 29 3b 0a 20 20 69 66  Callback));.  if
16490 28 20 21 70 47 65 6f 6d 43 74 78 20 29 20 72 65  ( !pGeomCtx ) re
164a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
164b0 4d 3b 0a 20 20 70 47 65 6f 6d 43 74 78 2d 3e 78  M;.  pGeomCtx->x
164c0 47 65 6f 6d 20 3d 20 78 47 65 6f 6d 3b 0a 20 20  Geom = xGeom;.  
164d0 70 47 65 6f 6d 43 74 78 2d 3e 70 43 6f 6e 74 65  pGeomCtx->pConte
164e0 78 74 20 3d 20 70 43 6f 6e 74 65 78 74 3b 0a 0a  xt = pContext;..
164f0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
16500 6e 65 77 20 75 73 65 72 2d 66 75 6e 63 74 69 6f  new user-functio
16510 6e 2e 20 52 65 67 69 73 74 65 72 20 61 20 64 65  n. Register a de
16520 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
16530 6e 20 74 6f 20 64 65 6c 65 74 65 0a 20 20 2a 2a  n to delete.  **
16540 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 62 6a   the context obj
16550 65 63 74 20 77 68 65 6e 20 69 74 20 69 73 20 6e  ect when it is n
16560 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
16570 64 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  d.  */.  return 
16580 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
16590 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a  unction_v2(db, z
165a0 47 65 6f 6d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Geom, -1, SQLITE
165b0 5f 41 4e 59 2c 20 0a 20 20 20 20 20 20 28 76 6f  _ANY, .      (vo
165c0 69 64 20 2a 29 70 47 65 6f 6d 43 74 78 2c 20 67  id *)pGeomCtx, g
165d0 65 6f 6d 43 61 6c 6c 62 61 63 6b 2c 20 30 2c 20  eomCallback, 0, 
165e0 30 2c 20 64 6f 53 71 6c 69 74 65 33 46 72 65 65  0, doSqlite3Free
165f0 0a 20 20 29 3b 0a 7d 0a 0a 23 69 66 20 21 53 51  .  );.}..#if !SQ
16600 4c 49 54 45 5f 43 4f 52 45 0a 69 6e 74 20 73 71  LITE_CORE.int sq
16610 6c 69 74 65 33 5f 65 78 74 65 6e 73 69 6f 6e 5f  lite3_extension_
16620 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20  init(.  sqlite3 
16630 2a 64 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  *db,.  char **pz
16640 45 72 72 4d 73 67 2c 0a 20 20 63 6f 6e 73 74 20  ErrMsg,.  const 
16650 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
16660 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20  ines *pApi.){.  
16670 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
16680 5f 49 4e 49 54 32 28 70 41 70 69 29 0a 20 20 72  _INIT2(pApi).  r
16690 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 74 72  eturn sqlite3Rtr
166a0 65 65 49 6e 69 74 28 64 62 29 3b 0a 7d 0a 23 65  eeInit(db);.}.#e
166b0 6e 64 69 66 0a 0a 23 65 6e 64 69 66 0a           ndif..#endif.