/ Hex Artifact Content
Login

Artifact 692e9192d148f318b3dca9f744600346a175eedd:


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 5f 56 54 41 42 3b 0a 20 20 20 20 7d 0a 20  PT_VTAB;.    }. 
3df0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65   }..  /* If no e
3e00: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
3e10: 64 20 73 6f 20 66 61 72 2c 20 63 68 65 63 6b 20  d so far, check 
3e20: 69 66 20 74 68 65 20 22 6e 75 6d 62 65 72 20 6f  if the "number o
3e30: 66 20 65 6e 74 72 69 65 73 22 0a 20 20 2a 2a 20  f entries".  ** 
3e40: 66 69 65 6c 64 20 6f 6e 20 74 68 65 20 6e 6f 64  field on the nod
3e50: 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2e 20  e is too large. 
3e60: 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 72  If so, set the r
3e70: 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 0a 20  eturn code to . 
3e80: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   ** SQLITE_CORRU
3e90: 50 54 5f 56 54 41 42 2e 0a 20 20 2a 2f 0a 20 20  PT_VTAB..  */.  
3ea0: 69 66 28 20 70 4e 6f 64 65 20 26 26 20 72 63 3d  if( pNode && rc=
3eb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3ec0: 20 20 69 66 28 20 4e 43 45 4c 4c 28 70 4e 6f 64    if( NCELL(pNod
3ed0: 65 29 3e 28 28 70 52 74 72 65 65 2d 3e 69 4e 6f  e)>((pRtree->iNo
3ee0: 64 65 53 69 7a 65 2d 34 29 2f 70 52 74 72 65 65  deSize-4)/pRtree
3ef0: 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 29  ->nBytesPerCell)
3f00: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
3f10: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
3f20: 41 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  AB;.    }.  }.. 
3f30: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3f40: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e  OK ){.    if( pN
3f50: 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode!=0 ){.      
3f60: 6e 6f 64 65 48 61 73 68 49 6e 73 65 72 74 28 70  nodeHashInsert(p
3f70: 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20  Rtree, pNode);. 
3f80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3f90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
3fa0: 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 7d 0a  UPT_VTAB;.    }.
3fb0: 20 20 20 20 2a 70 70 4e 6f 64 65 20 3d 20 70 4e      *ppNode = pN
3fc0: 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
3fd0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3fe0: 4e 6f 64 65 29 3b 0a 20 20 20 20 2a 70 70 4e 6f  Node);.    *ppNo
3ff0: 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  de = 0;.  }..  r
4000: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4010: 2a 2a 20 4f 76 65 72 77 72 69 74 65 20 63 65 6c  ** Overwrite cel
4020: 6c 20 69 43 65 6c 6c 20 6f 66 20 6e 6f 64 65 20  l iCell of node 
4030: 70 4e 6f 64 65 20 77 69 74 68 20 74 68 65 20 63  pNode with the c
4040: 6f 6e 74 65 6e 74 73 20 6f 66 20 70 43 65 6c 6c  ontents of pCell
4050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4060: 20 6e 6f 64 65 4f 76 65 72 77 72 69 74 65 43 65   nodeOverwriteCe
4070: 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74  ll(.  Rtree *pRt
4080: 72 65 65 2c 20 0a 20 20 52 74 72 65 65 4e 6f 64  ree, .  RtreeNod
4090: 65 20 2a 70 4e 6f 64 65 2c 20 20 0a 20 20 52 74  e *pNode,  .  Rt
40a0: 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 20  reeCell *pCell, 
40b0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 0a 29 7b 0a  .  int iCell.){.
40c0: 20 20 69 6e 74 20 69 69 3b 0a 20 20 75 38 20 2a    int ii;.  u8 *
40d0: 70 20 3d 20 26 70 4e 6f 64 65 2d 3e 7a 44 61 74  p = &pNode->zDat
40e0: 61 5b 34 20 2b 20 70 52 74 72 65 65 2d 3e 6e 42  a[4 + pRtree->nB
40f0: 79 74 65 73 50 65 72 43 65 6c 6c 2a 69 43 65 6c  ytesPerCell*iCel
4100: 6c 5d 3b 0a 20 20 70 20 2b 3d 20 77 72 69 74 65  l];.  p += write
4110: 49 6e 74 36 34 28 70 2c 20 70 43 65 6c 6c 2d 3e  Int64(p, pCell->
4120: 69 52 6f 77 69 64 29 3b 0a 20 20 66 6f 72 28 69  iRowid);.  for(i
4130: 69 3d 30 3b 20 69 69 3c 28 70 52 74 72 65 65 2d  i=0; ii<(pRtree-
4140: 3e 6e 44 69 6d 2a 32 29 3b 20 69 69 2b 2b 29 7b  >nDim*2); ii++){
4150: 0a 20 20 20 20 70 20 2b 3d 20 77 72 69 74 65 43  .    p += writeC
4160: 6f 6f 72 64 28 70 2c 20 26 70 43 65 6c 6c 2d 3e  oord(p, &pCell->
4170: 61 43 6f 6f 72 64 5b 69 69 5d 29 3b 0a 20 20 7d  aCoord[ii]);.  }
4180: 0a 20 20 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74  .  pNode->isDirt
4190: 79 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y = 1;.}../*.** 
41a0: 52 65 6d 6f 76 65 20 63 65 6c 6c 20 74 68 65 20  Remove cell the 
41b0: 63 65 6c 6c 20 77 69 74 68 20 69 6e 64 65 78 20  cell with index 
41c0: 69 43 65 6c 6c 20 66 72 6f 6d 20 6e 6f 64 65 20  iCell from node 
41d0: 70 4e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pNode..*/.static
41e0: 20 76 6f 69 64 20 6e 6f 64 65 44 65 6c 65 74 65   void nodeDelete
41f0: 43 65 6c 6c 28 52 74 72 65 65 20 2a 70 52 74 72  Cell(Rtree *pRtr
4200: 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70  ee, RtreeNode *p
4210: 4e 6f 64 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Node, int iCell)
4220: 7b 0a 20 20 75 38 20 2a 70 44 73 74 20 3d 20 26  {.  u8 *pDst = &
4230: 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b 34 20 2b  pNode->zData[4 +
4240: 20 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50   pRtree->nBytesP
4250: 65 72 43 65 6c 6c 2a 69 43 65 6c 6c 5d 3b 0a 20  erCell*iCell];. 
4260: 20 75 38 20 2a 70 53 72 63 20 3d 20 26 70 44 73   u8 *pSrc = &pDs
4270: 74 5b 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73  t[pRtree->nBytes
4280: 50 65 72 43 65 6c 6c 5d 3b 0a 20 20 69 6e 74 20  PerCell];.  int 
4290: 6e 42 79 74 65 20 3d 20 28 4e 43 45 4c 4c 28 70  nByte = (NCELL(p
42a0: 4e 6f 64 65 29 20 2d 20 69 43 65 6c 6c 20 2d 20  Node) - iCell - 
42b0: 31 29 20 2a 20 70 52 74 72 65 65 2d 3e 6e 42 79  1) * pRtree->nBy
42c0: 74 65 73 50 65 72 43 65 6c 6c 3b 0a 20 20 6d 65  tesPerCell;.  me
42d0: 6d 6d 6f 76 65 28 70 44 73 74 2c 20 70 53 72 63  mmove(pDst, pSrc
42e0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 77 72 69 74  , nByte);.  writ
42f0: 65 49 6e 74 31 36 28 26 70 4e 6f 64 65 2d 3e 7a  eInt16(&pNode->z
4300: 44 61 74 61 5b 32 5d 2c 20 4e 43 45 4c 4c 28 70  Data[2], NCELL(p
4310: 4e 6f 64 65 29 2d 31 29 3b 0a 20 20 70 4e 6f 64  Node)-1);.  pNod
4320: 65 2d 3e 69 73 44 69 72 74 79 20 3d 20 31 3b 0a  e->isDirty = 1;.
4330: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
4340: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
4350: 63 65 6c 6c 20 70 43 65 6c 6c 20 69 6e 74 6f 20  cell pCell into 
4360: 6e 6f 64 65 20 70 4e 6f 64 65 2e 20 49 66 20 74  node pNode. If t
4370: 68 65 20 69 6e 73 65 72 74 0a 2a 2a 20 69 73 20  he insert.** is 
4380: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
4390: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
43a0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
43b0: 6e 6f 74 20 65 6e 6f 75 67 68 20 66 72 65 65 20  not enough free 
43c0: 73 70 61 63 65 20 69 6e 20 70 4e 6f 64 65 2c 20  space in pNode, 
43d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
43e0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LL..*/.static in
43f0: 74 0a 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c  t.nodeInsertCell
4400: 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  (.  Rtree *pRtre
4410: 65 2c 20 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  e, .  RtreeNode 
4420: 2a 70 4e 6f 64 65 2c 20 0a 20 20 52 74 72 65 65  *pNode, .  Rtree
4430: 43 65 6c 6c 20 2a 70 43 65 6c 6c 20 0a 29 7b 0a  Cell *pCell .){.
4440: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65  /* Current numbe
4470: 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 4e  r of cells in pN
4480: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
4490: 78 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  xCell;          
44a0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
44b0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  m number of cell
44c0: 73 20 66 6f 72 20 70 4e 6f 64 65 20 2a 2f 0a 0a  s for pNode */..
44d0: 20 20 6e 4d 61 78 43 65 6c 6c 20 3d 20 28 70 52    nMaxCell = (pR
44e0: 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 2d  tree->iNodeSize-
44f0: 34 29 2f 70 52 74 72 65 65 2d 3e 6e 42 79 74 65  4)/pRtree->nByte
4500: 73 50 65 72 43 65 6c 6c 3b 0a 20 20 6e 43 65 6c  sPerCell;.  nCel
4510: 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29  l = NCELL(pNode)
4520: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  ;..  assert( nCe
4530: 6c 6c 3c 3d 6e 4d 61 78 43 65 6c 6c 20 29 3b 0a  ll<=nMaxCell );.
4540: 20 20 69 66 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78    if( nCell<nMax
4550: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 6f 64 65  Cell ){.    node
4560: 4f 76 65 72 77 72 69 74 65 43 65 6c 6c 28 70 52  OverwriteCell(pR
4570: 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 70 43 65  tree, pNode, pCe
4580: 6c 6c 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 20 20  ll, nCell);.    
4590: 77 72 69 74 65 49 6e 74 31 36 28 26 70 4e 6f 64  writeInt16(&pNod
45a0: 65 2d 3e 7a 44 61 74 61 5b 32 5d 2c 20 6e 43 65  e->zData[2], nCe
45b0: 6c 6c 2b 31 29 3b 0a 20 20 20 20 70 4e 6f 64 65  ll+1);.    pNode
45c0: 2d 3e 69 73 44 69 72 74 79 20 3d 20 31 3b 0a 20  ->isDirty = 1;. 
45d0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 6e 43   }..  return (nC
45e0: 65 6c 6c 3d 3d 6e 4d 61 78 43 65 6c 6c 29 3b 0a  ell==nMaxCell);.
45f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
4600: 6e 6f 64 65 20 69 73 20 64 69 72 74 79 2c 20 77  node is dirty, w
4610: 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74  rite it out to t
4620: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
4630: 73 74 61 74 69 63 20 69 6e 74 0a 6e 6f 64 65 57  static int.nodeW
4640: 72 69 74 65 28 52 74 72 65 65 20 2a 70 52 74 72  rite(Rtree *pRtr
4650: 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70  ee, RtreeNode *p
4660: 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Node){.  int rc 
4670: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
4680: 66 28 20 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74  f( pNode->isDirt
4690: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
46a0: 5f 73 74 6d 74 20 2a 70 20 3d 20 70 52 74 72 65  _stmt *p = pRtre
46b0: 65 2d 3e 70 57 72 69 74 65 4e 6f 64 65 3b 0a 20  e->pWriteNode;. 
46c0: 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e     if( pNode->iN
46d0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ode ){.      sql
46e0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
46f0: 70 2c 20 31 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f  p, 1, pNode->iNo
4700: 64 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  de);.    }else{.
4710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
4720: 6e 64 5f 6e 75 6c 6c 28 70 2c 20 31 29 3b 0a 20  nd_null(p, 1);. 
4730: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
4740: 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2c 20 32 2c  _bind_blob(p, 2,
4750: 20 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 2c 20 70   pNode->zData, p
4760: 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65  Rtree->iNodeSize
4770: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
4780: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
4790: 65 70 28 70 29 3b 0a 20 20 20 20 70 4e 6f 64 65  ep(p);.    pNode
47a0: 2d 3e 69 73 44 69 72 74 79 20 3d 20 30 3b 0a 20  ->isDirty = 0;. 
47b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
47c0: 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69 66  reset(p);.    if
47d0: 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d  ( pNode->iNode==
47e0: 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
47f0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 6f 64  OK ){.      pNod
4800: 65 2d 3e 69 4e 6f 64 65 20 3d 20 73 71 6c 69 74  e->iNode = sqlit
4810: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
4820: 6f 77 69 64 28 70 52 74 72 65 65 2d 3e 64 62 29  owid(pRtree->db)
4830: 3b 0a 20 20 20 20 20 20 6e 6f 64 65 48 61 73 68  ;.      nodeHash
4840: 49 6e 73 65 72 74 28 70 52 74 72 65 65 2c 20 70  Insert(pRtree, p
4850: 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Node);.    }.  }
4860: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4870: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4880: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
4890: 6e 6f 64 65 2e 20 49 66 20 74 68 65 20 6e 6f 64  node. If the nod
48a0: 65 20 69 73 20 64 69 72 74 79 20 61 6e 64 20 74  e is dirty and t
48b0: 68 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  he reference.** 
48c0: 63 6f 75 6e 74 20 64 72 6f 70 73 20 74 6f 20 7a  count drops to z
48d0: 65 72 6f 2c 20 74 68 65 20 6e 6f 64 65 20 64 61  ero, the node da
48e0: 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
48f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
4900: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 6e 6f 64  /.static int.nod
4910: 65 52 65 6c 65 61 73 65 28 52 74 72 65 65 20 2a  eRelease(Rtree *
4920: 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64  pRtree, RtreeNod
4930: 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74  e *pNode){.  int
4940: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4950: 0a 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a  .  if( pNode ){.
4960: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64      assert( pNod
4970: 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  e->nRef>0 );.   
4980: 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a   pNode->nRef--;.
4990: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6e      if( pNode->n
49a0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
49b0: 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65  if( pNode->iNode
49c0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==1 ){.        p
49d0: 52 74 72 65 65 2d 3e 69 44 65 70 74 68 20 3d 20  Rtree->iDepth = 
49e0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
49f0: 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 70 50 61    if( pNode->pPa
4a00: 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rent ){.        
4a10: 72 63 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65  rc = nodeRelease
4a20: 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2d 3e  (pRtree, pNode->
4a30: 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  pParent);.      
4a40: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
4a50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4a60: 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 57 72       rc = nodeWr
4a70: 69 74 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ite(pRtree, pNod
4a80: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
4a90: 20 20 6e 6f 64 65 48 61 73 68 44 65 6c 65 74 65    nodeHashDelete
4aa0: 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b  (pRtree, pNode);
4ab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
4ac0: 72 65 65 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20  ree(pNode);.    
4ad0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
4ae0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
4af0: 72 6e 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e  rn the 64-bit in
4b00: 74 65 67 65 72 20 76 61 6c 75 65 20 61 73 73 6f  teger value asso
4b10: 63 69 61 74 65 64 20 77 69 74 68 20 63 65 6c 6c  ciated with cell
4b20: 20 69 43 65 6c 6c 20 6f 66 0a 2a 2a 20 6e 6f 64   iCell of.** nod
4b30: 65 20 70 4e 6f 64 65 2e 20 49 66 20 70 4e 6f 64  e pNode. If pNod
4b40: 65 20 69 73 20 61 20 6c 65 61 66 20 6e 6f 64 65  e is a leaf node
4b50: 2c 20 74 68 69 73 20 69 73 20 61 20 72 6f 77 69  , this is a rowi
4b60: 64 2e 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 61  d. If it is.** a
4b70: 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c  n internal node,
4b80: 20 74 68 65 6e 20 74 68 65 20 36 34 2d 62 69 74   then the 64-bit
4b90: 20 69 6e 74 65 67 65 72 20 69 73 20 61 20 63 68   integer is a ch
4ba0: 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ild page number.
4bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6e  .*/.static i64 n
4bc0: 6f 64 65 47 65 74 52 6f 77 69 64 28 0a 20 20 52  odeGetRowid(.  R
4bd0: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 0a 20  tree *pRtree, . 
4be0: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64   RtreeNode *pNod
4bf0: 65 2c 20 0a 20 20 69 6e 74 20 69 43 65 6c 6c 0a  e, .  int iCell.
4c00: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43 65  ){.  assert( iCe
4c10: 6c 6c 3c 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 20  ll<NCELL(pNode) 
4c20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 61 64  );.  return read
4c30: 49 6e 74 36 34 28 26 70 4e 6f 64 65 2d 3e 7a 44  Int64(&pNode->zD
4c40: 61 74 61 5b 34 20 2b 20 70 52 74 72 65 65 2d 3e  ata[4 + pRtree->
4c50: 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 2a 69 43  nBytesPerCell*iC
4c60: 65 6c 6c 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ell]);.}../*.** 
4c70: 52 65 74 75 72 6e 20 63 6f 6f 72 64 69 6e 61 74  Return coordinat
4c80: 65 20 69 43 6f 6f 72 64 20 66 72 6f 6d 20 63 65  e iCoord from ce
4c90: 6c 6c 20 69 43 65 6c 6c 20 69 6e 20 6e 6f 64 65  ll iCell in node
4ca0: 20 70 4e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69   pNode..*/.stati
4cb0: 63 20 76 6f 69 64 20 6e 6f 64 65 47 65 74 43 6f  c void nodeGetCo
4cc0: 6f 72 64 28 0a 20 20 52 74 72 65 65 20 2a 70 52  ord(.  Rtree *pR
4cd0: 74 72 65 65 2c 20 0a 20 20 52 74 72 65 65 4e 6f  tree, .  RtreeNo
4ce0: 64 65 20 2a 70 4e 6f 64 65 2c 20 0a 20 20 69 6e  de *pNode, .  in
4cf0: 74 20 69 43 65 6c 6c 2c 0a 20 20 69 6e 74 20 69  t iCell,.  int i
4d00: 43 6f 6f 72 64 2c 0a 20 20 52 74 72 65 65 43 6f  Coord,.  RtreeCo
4d10: 6f 72 64 20 2a 70 43 6f 6f 72 64 20 20 20 20 20  ord *pCoord     
4d20: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74        /* Space t
4d30: 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 20 74  o write result t
4d40: 6f 20 2a 2f 0a 29 7b 0a 20 20 72 65 61 64 43 6f  o */.){.  readCo
4d50: 6f 72 64 28 26 70 4e 6f 64 65 2d 3e 7a 44 61 74  ord(&pNode->zDat
4d60: 61 5b 31 32 20 2b 20 70 52 74 72 65 65 2d 3e 6e  a[12 + pRtree->n
4d70: 42 79 74 65 73 50 65 72 43 65 6c 6c 2a 69 43 65  BytesPerCell*iCe
4d80: 6c 6c 20 2b 20 34 2a 69 43 6f 6f 72 64 5d 2c 20  ll + 4*iCoord], 
4d90: 70 43 6f 6f 72 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pCoord);.}../*.*
4da0: 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 63 65  * Deserialize ce
4db0: 6c 6c 20 69 43 65 6c 6c 20 6f 66 20 6e 6f 64 65  ll iCell of node
4dc0: 20 70 4e 6f 64 65 2e 20 50 6f 70 75 6c 61 74 65   pNode. Populate
4dd0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
4de0: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
4df0: 70 43 65 6c 6c 20 77 69 74 68 20 74 68 65 20 72  pCell with the r
4e00: 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  esults..*/.stati
4e10: 63 20 76 6f 69 64 20 6e 6f 64 65 47 65 74 43 65  c void nodeGetCe
4e20: 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74  ll(.  Rtree *pRt
4e30: 72 65 65 2c 20 0a 20 20 52 74 72 65 65 4e 6f 64  ree, .  RtreeNod
4e40: 65 20 2a 70 4e 6f 64 65 2c 20 0a 20 20 69 6e 74  e *pNode, .  int
4e50: 20 69 43 65 6c 6c 2c 0a 20 20 52 74 72 65 65 43   iCell,.  RtreeC
4e60: 65 6c 6c 20 2a 70 43 65 6c 6c 0a 29 7b 0a 20 20  ell *pCell.){.  
4e70: 69 6e 74 20 69 69 3b 0a 20 20 70 43 65 6c 6c 2d  int ii;.  pCell-
4e80: 3e 69 52 6f 77 69 64 20 3d 20 6e 6f 64 65 47 65  >iRowid = nodeGe
4e90: 74 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70  tRowid(pRtree, p
4ea0: 4e 6f 64 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20  Node, iCell);.  
4eb0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 52 74  for(ii=0; ii<pRt
4ec0: 72 65 65 2d 3e 6e 44 69 6d 2a 32 3b 20 69 69 2b  ree->nDim*2; ii+
4ed0: 2b 29 7b 0a 20 20 20 20 6e 6f 64 65 47 65 74 43  +){.    nodeGetC
4ee0: 6f 6f 72 64 28 70 52 74 72 65 65 2c 20 70 4e 6f  oord(pRtree, pNo
4ef0: 64 65 2c 20 69 43 65 6c 6c 2c 20 69 69 2c 20 26  de, iCell, ii, &
4f00: 70 43 65 6c 6c 2d 3e 61 43 6f 6f 72 64 5b 69 69  pCell->aCoord[ii
4f10: 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 46  ]);.  }.}.../* F
4f20: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
4f30: 6f 6e 20 66 6f 72 20 74 68 65 20 66 75 6e 63 74  on for the funct
4f40: 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 74 68  ion that does th
4f50: 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 74 68 65  e work of.** the
4f60: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
4f70: 6f 64 75 6c 65 20 78 43 72 65 61 74 65 28 29 20  odule xCreate() 
4f80: 61 6e 64 20 78 43 6f 6e 6e 65 63 74 28 29 20 6d  and xConnect() m
4f90: 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
4fa0: 63 20 69 6e 74 20 72 74 72 65 65 49 6e 69 74 28  c int rtreeInit(
4fb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 2c 20 76 6f  .  sqlite3 *, vo
4fc0: 69 64 20 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74  id *, int, const
4fd0: 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 2c 20 73   char *const*, s
4fe0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 2c 20  qlite3_vtab **, 
4ff0: 63 68 61 72 20 2a 2a 2c 20 69 6e 74 0a 29 3b 0a  char **, int.);.
5000: 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69  ./* .** Rtree vi
5010: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
5020: 6c 65 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f  le xCreate metho
5030: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5040: 20 72 74 72 65 65 43 72 65 61 74 65 28 0a 20 20   rtreeCreate(.  
5050: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
5060: 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
5070: 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
5080: 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
5090: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
50a0: 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVtab,.  char *
50b0: 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74 75  *pzErr.){.  retu
50c0: 72 6e 20 72 74 72 65 65 49 6e 69 74 28 64 62 2c  rn rtreeInit(db,
50d0: 20 70 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67   pAux, argc, arg
50e0: 76 2c 20 70 70 56 74 61 62 2c 20 70 7a 45 72 72  v, ppVtab, pzErr
50f0: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  , 1);.}../* .** 
5100: 52 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61  Rtree virtual ta
5110: 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e  ble module xConn
5120: 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  ect method..*/.s
5130: 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 43  tatic int rtreeC
5140: 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65  onnect(.  sqlite
5150: 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70  3 *db,.  void *p
5160: 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  Aux,.  int argc,
5170: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
5180: 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74  st*argv,.  sqlit
5190: 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62  e3_vtab **ppVtab
51a0: 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
51b0: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 72 74 72  .){.  return rtr
51c0: 65 65 49 6e 69 74 28 64 62 2c 20 70 41 75 78 2c  eeInit(db, pAux,
51d0: 20 61 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56   argc, argv, ppV
51e0: 74 61 62 2c 20 70 7a 45 72 72 2c 20 30 29 3b 0a  tab, pzErr, 0);.
51f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  }../*.** Increme
5200: 6e 74 20 74 68 65 20 72 2d 74 72 65 65 20 72 65  nt the r-tree re
5210: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 0a 2a  ference count..*
5220: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 74  /.static void rt
5230: 72 65 65 52 65 66 65 72 65 6e 63 65 28 52 74 72  reeReference(Rtr
5240: 65 65 20 2a 70 52 74 72 65 65 29 7b 0a 20 20 70  ee *pRtree){.  p
5250: 52 74 72 65 65 2d 3e 6e 42 75 73 79 2b 2b 3b 0a  Rtree->nBusy++;.
5260: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
5270: 6e 74 20 74 68 65 20 72 2d 74 72 65 65 20 72 65  nt the r-tree re
5280: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 57  ference count. W
5290: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
52a0: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 0a  e count reaches.
52b0: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 73 74 72 75  ** zero the stru
52c0: 63 74 75 72 65 20 69 73 20 64 65 6c 65 74 65 64  cture is deleted
52d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
52e0: 20 72 74 72 65 65 52 65 6c 65 61 73 65 28 52 74   rtreeRelease(Rt
52f0: 72 65 65 20 2a 70 52 74 72 65 65 29 7b 0a 20 20  ree *pRtree){.  
5300: 70 52 74 72 65 65 2d 3e 6e 42 75 73 79 2d 2d 3b  pRtree->nBusy--;
5310: 0a 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e 6e  .  if( pRtree->n
5320: 42 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Busy==0 ){.    s
5330: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
5340: 70 52 74 72 65 65 2d 3e 70 52 65 61 64 4e 6f 64  pRtree->pReadNod
5350: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
5360: 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d  finalize(pRtree-
5370: 3e 70 57 72 69 74 65 4e 6f 64 65 29 3b 0a 20 20  >pWriteNode);.  
5380: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
5390: 7a 65 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65  ze(pRtree->pDele
53a0: 74 65 4e 6f 64 65 29 3b 0a 20 20 20 20 73 71 6c  teNode);.    sql
53b0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52  ite3_finalize(pR
53c0: 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64  tree->pReadRowid
53d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
53e0: 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e  inalize(pRtree->
53f0: 70 57 72 69 74 65 52 6f 77 69 64 29 3b 0a 20 20  pWriteRowid);.  
5400: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
5410: 7a 65 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65  ze(pRtree->pDele
5420: 74 65 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71  teRowid);.    sq
5430: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
5440: 52 74 72 65 65 2d 3e 70 52 65 61 64 50 61 72 65  Rtree->pReadPare
5450: 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nt);.    sqlite3
5460: 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65  _finalize(pRtree
5470: 2d 3e 70 57 72 69 74 65 50 61 72 65 6e 74 29 3b  ->pWriteParent);
5480: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
5490: 61 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 44  alize(pRtree->pD
54a0: 65 6c 65 74 65 50 61 72 65 6e 74 29 3b 0a 20 20  eleteParent);.  
54b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
54c0: 52 74 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Rtree);.  }.}../
54d0: 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74  * .** Rtree virt
54e0: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
54f0: 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74   xDisconnect met
5500: 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
5510: 6e 74 20 72 74 72 65 65 44 69 73 63 6f 6e 6e 65  nt rtreeDisconne
5520: 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ct(sqlite3_vtab 
5530: 2a 70 56 74 61 62 29 7b 0a 20 20 72 74 72 65 65  *pVtab){.  rtree
5540: 52 65 6c 65 61 73 65 28 28 52 74 72 65 65 20 2a  Release((Rtree *
5550: 29 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75 72  )pVtab);.  retur
5560: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5570: 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72  /* .** Rtree vir
5580: 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
5590: 65 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68 6f  e xDestroy metho
55a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
55b0: 20 72 74 72 65 65 44 65 73 74 72 6f 79 28 73 71   rtreeDestroy(sq
55c0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
55d0: 62 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74  b){.  Rtree *pRt
55e0: 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70  ree = (Rtree *)p
55f0: 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Vtab;.  int rc;.
5600: 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20    char *zCreate 
5610: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5620: 66 28 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42  f(.    "DROP TAB
5630: 4c 45 20 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65  LE '%q'.'%q_node
5640: 27 3b 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41  ';".    "DROP TA
5650: 42 4c 45 20 27 25 71 27 2e 27 25 71 5f 72 6f 77  BLE '%q'.'%q_row
5660: 69 64 27 3b 22 0a 20 20 20 20 22 44 52 4f 50 20  id';".    "DROP 
5670: 54 41 42 4c 45 20 27 25 71 27 2e 27 25 71 5f 70  TABLE '%q'.'%q_p
5680: 61 72 65 6e 74 27 3b 22 2c 0a 20 20 20 20 70 52  arent';",.    pR
5690: 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65  tree->zDb, pRtre
56a0: 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 70  e->zName, .    p
56b0: 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72  Rtree->zDb, pRtr
56c0: 65 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 70  ee->zName,.    p
56d0: 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72  Rtree->zDb, pRtr
56e0: 65 65 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20  ee->zName.  );. 
56f0: 20 69 66 28 20 21 7a 43 72 65 61 74 65 20 29 7b   if( !zCreate ){
5700: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5710: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
5720: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
5730: 33 5f 65 78 65 63 28 70 52 74 72 65 65 2d 3e 64  3_exec(pRtree->d
5740: 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30  b, zCreate, 0, 0
5750: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
5760: 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b  3_free(zCreate);
5770: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
5780: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5790: 72 74 72 65 65 52 65 6c 65 61 73 65 28 70 52 74  rtreeRelease(pRt
57a0: 72 65 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ree);.  }..  ret
57b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
57c0: 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c 20  * Rtree virtual 
57d0: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 4f 70  table module xOp
57e0: 65 6e 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  en method..*/.st
57f0: 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 4f 70  atic int rtreeOp
5800: 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  en(sqlite3_vtab 
5810: 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f  *pVTab, sqlite3_
5820: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70  vtab_cursor **pp
5830: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 72  Cursor){.  int r
5840: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
5850: 3b 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72 20  ;.  RtreeCursor 
5860: 2a 70 43 73 72 3b 0a 0a 20 20 70 43 73 72 20 3d  *pCsr;..  pCsr =
5870: 20 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29   (RtreeCursor *)
5880: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
5890: 69 7a 65 6f 66 28 52 74 72 65 65 43 75 72 73 6f  izeof(RtreeCurso
58a0: 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73 72 20  r));.  if( pCsr 
58b0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 43  ){.    memset(pC
58c0: 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74  sr, 0, sizeof(Rt
58d0: 72 65 65 43 75 72 73 6f 72 29 29 3b 0a 20 20 20  reeCursor));.   
58e0: 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61   pCsr->base.pVta
58f0: 62 20 3d 20 70 56 54 61 62 3b 0a 20 20 20 20 72  b = pVTab;.    r
5900: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5910: 20 7d 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d   }.  *ppCursor =
5920: 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63   (sqlite3_vtab_c
5930: 75 72 73 6f 72 20 2a 29 70 43 73 72 3b 0a 0a 20  ursor *)pCsr;.. 
5940: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
5950: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 52  /*.** Free the R
5960: 74 72 65 65 43 75 72 73 6f 72 2e 61 43 6f 6e 73  treeCursor.aCons
5970: 74 72 61 69 6e 74 5b 5d 20 61 72 72 61 79 20 61  traint[] array a
5980: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
5990: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
59a0: 66 72 65 65 43 75 72 73 6f 72 43 6f 6e 73 74 72  freeCursorConstr
59b0: 61 69 6e 74 73 28 52 74 72 65 65 43 75 72 73 6f  aints(RtreeCurso
59c0: 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 66 28 20  r *pCsr){.  if( 
59d0: 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  pCsr->aConstrain
59e0: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  t ){.    int i; 
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
5a10: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
5a20: 68 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 72 72  h constraint arr
5a30: 61 79 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  ay */.    for(i=
5a40: 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 43 6f 6e 73  0; i<pCsr->nCons
5a50: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
5a60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 74 72 65      sqlite3_rtre
5a70: 65 5f 67 65 6f 6d 65 74 72 79 20 2a 70 47 65 6f  e_geometry *pGeo
5a80: 6d 20 3d 20 70 43 73 72 2d 3e 61 43 6f 6e 73 74  m = pCsr->aConst
5a90: 72 61 69 6e 74 5b 69 5d 2e 70 47 65 6f 6d 3b 0a  raint[i].pGeom;.
5aa0: 20 20 20 20 20 20 69 66 28 20 70 47 65 6f 6d 20        if( pGeom 
5ab0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
5ac0: 47 65 6f 6d 2d 3e 78 44 65 6c 55 73 65 72 20 29  Geom->xDelUser )
5ad0: 20 70 47 65 6f 6d 2d 3e 78 44 65 6c 55 73 65 72   pGeom->xDelUser
5ae0: 28 70 47 65 6f 6d 2d 3e 70 55 73 65 72 29 3b 0a  (pGeom->pUser);.
5af0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5b00: 66 72 65 65 28 70 47 65 6f 6d 29 3b 0a 20 20 20  free(pGeom);.   
5b10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
5b20: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72  qlite3_free(pCsr
5b30: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  ->aConstraint);.
5b40: 20 20 20 20 70 43 73 72 2d 3e 61 43 6f 6e 73 74      pCsr->aConst
5b50: 72 61 69 6e 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  raint = 0;.  }.}
5b60: 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76  ../* .** Rtree v
5b70: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
5b80: 75 6c 65 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f  ule xClose metho
5b90: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5ba0: 20 72 74 72 65 65 43 6c 6f 73 65 28 73 71 6c 69   rtreeClose(sqli
5bb0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
5bc0: 2a 63 75 72 29 7b 0a 20 20 52 74 72 65 65 20 2a  *cur){.  Rtree *
5bd0: 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65 20  pRtree = (Rtree 
5be0: 2a 29 28 63 75 72 2d 3e 70 56 74 61 62 29 3b 0a  *)(cur->pVtab);.
5bf0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 74 72 65    int rc;.  Rtre
5c00: 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  eCursor *pCsr = 
5c10: 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29 63  (RtreeCursor *)c
5c20: 75 72 3b 0a 20 20 66 72 65 65 43 75 72 73 6f 72  ur;.  freeCursor
5c30: 43 6f 6e 73 74 72 61 69 6e 74 73 28 70 43 73 72  Constraints(pCsr
5c40: 29 3b 0a 20 20 72 63 20 3d 20 6e 6f 64 65 52 65  );.  rc = nodeRe
5c50: 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 43  lease(pRtree, pC
5c60: 73 72 2d 3e 70 4e 6f 64 65 29 3b 0a 20 20 73 71  sr->pNode);.  sq
5c70: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 29  lite3_free(pCsr)
5c80: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5c90: 0a 0a 2f 2a 0a 2a 2a 20 52 74 72 65 65 20 76 69  ../*.** Rtree vi
5ca0: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
5cb0: 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f 64 2e 0a  le xEof method..
5cc0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  **.** Return non
5cd0: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 63 75 72  -zero if the cur
5ce0: 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 63 75 72  sor does not cur
5cf0: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 20  rently point to 
5d00: 61 20 76 61 6c 69 64 20 0a 2a 2a 20 72 65 63 6f  a valid .** reco
5d10: 72 64 20 28 69 2e 65 20 69 66 20 74 68 65 20 73  rd (i.e if the s
5d20: 63 61 6e 20 68 61 73 20 66 69 6e 69 73 68 65 64  can has finished
5d30: 29 2c 20 6f 72 20 7a 65 72 6f 20 6f 74 68 65 72  ), or zero other
5d40: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
5d50: 69 6e 74 20 72 74 72 65 65 45 6f 66 28 73 71 6c  int rtreeEof(sql
5d60: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
5d70: 20 2a 63 75 72 29 7b 0a 20 20 52 74 72 65 65 43   *cur){.  RtreeC
5d80: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 52  ursor *pCsr = (R
5d90: 74 72 65 65 43 75 72 73 6f 72 20 2a 29 63 75 72  treeCursor *)cur
5da0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 43 73 72  ;.  return (pCsr
5db0: 2d 3e 70 4e 6f 64 65 3d 3d 30 29 3b 0a 7d 0a 0a  ->pNode==0);.}..
5dc0: 2f 2a 0a 2a 2a 20 54 68 65 20 72 2d 74 72 65 65  /*.** The r-tree
5dd0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 70 61 73 73   constraint pass
5de0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
5df0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
5e00: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
5e10: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
5e20: 65 20 61 20 4d 41 54 43 48 20 63 6f 6e 73 74 72  e a MATCH constr
5e30: 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aint..*/.static 
5e40: 69 6e 74 20 74 65 73 74 52 74 72 65 65 47 65 6f  int testRtreeGeo
5e50: 6d 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  m(.  Rtree *pRtr
5e60: 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
5e70: 20 20 20 20 20 2f 2a 20 52 2d 54 72 65 65 20 6f       /* R-Tree o
5e80: 62 6a 65 63 74 20 2a 2f 0a 20 20 52 74 72 65 65  bject */.  Rtree
5e90: 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e  Constraint *pCon
5ea0: 73 74 72 61 69 6e 74 2c 20 20 20 2f 2a 20 4d 41  straint,   /* MA
5eb0: 54 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  TCH constraint t
5ec0: 6f 20 74 65 73 74 20 2a 2f 0a 20 20 52 74 72 65  o test */.  Rtre
5ed0: 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 20 20 20  eCell *pCell,   
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5ef0: 65 6c 6c 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  ell to test */. 
5f00: 20 69 6e 74 20 2a 70 62 52 65 73 20 20 20 20 20   int *pbRes     
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 20 2f 2a 20 4f 55 54 3a 20 54 65 73 74 20 72 65   /* OUT: Test re
5f30: 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  sult */.){.  int
5f40: 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 61 43 6f   i;.  double aCo
5f50: 6f 72 64 5b 52 54 52 45 45 5f 4d 41 58 5f 44 49  ord[RTREE_MAX_DI
5f60: 4d 45 4e 53 49 4f 4e 53 2a 32 5d 3b 0a 20 20 69  MENSIONS*2];.  i
5f70: 6e 74 20 6e 43 6f 6f 72 64 20 3d 20 70 52 74 72  nt nCoord = pRtr
5f80: 65 65 2d 3e 6e 44 69 6d 2a 32 3b 0a 0a 20 20 61  ee->nDim*2;..  a
5f90: 73 73 65 72 74 28 20 70 43 6f 6e 73 74 72 61 69  ssert( pConstrai
5fa0: 6e 74 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4d 41  nt->op==RTREE_MA
5fb0: 54 43 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  TCH );.  assert(
5fc0: 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 70 47   pConstraint->pG
5fd0: 65 6f 6d 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  eom );..  for(i=
5fe0: 30 3b 20 69 3c 6e 43 6f 6f 72 64 3b 20 69 2b 2b  0; i<nCoord; i++
5ff0: 29 7b 0a 20 20 20 20 61 43 6f 6f 72 64 5b 69 5d  ){.    aCoord[i]
6000: 20 3d 20 44 43 4f 4f 52 44 28 70 43 65 6c 6c 2d   = DCOORD(pCell-
6010: 3e 61 43 6f 6f 72 64 5b 69 5d 29 3b 0a 20 20 7d  >aCoord[i]);.  }
6020: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6e 73 74  .  return pConst
6030: 72 61 69 6e 74 2d 3e 78 47 65 6f 6d 28 70 43 6f  raint->xGeom(pCo
6040: 6e 73 74 72 61 69 6e 74 2d 3e 70 47 65 6f 6d 2c  nstraint->pGeom,
6050: 20 6e 43 6f 6f 72 64 2c 20 61 43 6f 6f 72 64 2c   nCoord, aCoord,
6060: 20 70 62 52 65 73 29 3b 0a 7d 0a 0a 2f 2a 20 0a   pbRes);.}../* .
6070: 2a 2a 20 43 75 72 73 6f 72 20 70 43 75 72 73 6f  ** Cursor pCurso
6080: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
6090: 74 73 20 74 6f 20 61 20 63 65 6c 6c 20 69 6e 20  ts to a cell in 
60a0: 61 20 6e 6f 6e 2d 6c 65 61 66 20 70 61 67 65 2e  a non-leaf page.
60b0: 0a 2a 2a 20 53 65 74 20 2a 70 62 45 6f 66 20 74  .** Set *pbEof t
60c0: 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  o true if the su
60d0: 62 2d 74 72 65 65 20 68 65 61 64 65 64 20 62 79  b-tree headed by
60e0: 20 74 68 65 20 63 65 6c 6c 20 69 73 20 66 69 6c   the cell is fil
60f0: 74 65 72 65 64 0a 2a 2a 20 28 65 78 63 6c 75 64  tered.** (exclud
6100: 65 64 29 20 62 79 20 74 68 65 20 63 6f 6e 73 74  ed) by the const
6110: 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 70 43  raints in the pC
6120: 75 72 73 6f 72 2d 3e 61 43 6f 6e 73 74 72 61 69  ursor->aConstrai
6130: 6e 74 5b 5d 20 0a 2a 2a 20 61 72 72 61 79 2c 20  nt[] .** array, 
6140: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
6150: 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  se..**.** Return
6160: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
6170: 63 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 53  ccessful or an S
6180: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
6190: 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20   if an error.** 
61a0: 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 61 20  occurs within a 
61b0: 67 65 6f 6d 65 74 72 79 20 63 61 6c 6c 62 61 63  geometry callbac
61c0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
61d0: 20 74 65 73 74 52 74 72 65 65 43 65 6c 6c 28 52   testRtreeCell(R
61e0: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74  tree *pRtree, Rt
61f0: 72 65 65 43 75 72 73 6f 72 20 2a 70 43 75 72 73  reeCursor *pCurs
6200: 6f 72 2c 20 69 6e 74 20 2a 70 62 45 6f 66 29 7b  or, int *pbEof){
6210: 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65 6c  .  RtreeCell cel
6220: 6c 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  l;.  int ii;.  i
6230: 6e 74 20 62 52 65 73 20 3d 20 30 3b 0a 20 20 69  nt bRes = 0;.  i
6240: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6250: 4b 3b 0a 0a 20 20 6e 6f 64 65 47 65 74 43 65 6c  K;..  nodeGetCel
6260: 6c 28 70 52 74 72 65 65 2c 20 70 43 75 72 73 6f  l(pRtree, pCurso
6270: 72 2d 3e 70 4e 6f 64 65 2c 20 70 43 75 72 73 6f  r->pNode, pCurso
6280: 72 2d 3e 69 43 65 6c 6c 2c 20 26 63 65 6c 6c 29  r->iCell, &cell)
6290: 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 62 52  ;.  for(ii=0; bR
62a0: 65 73 3d 3d 30 20 26 26 20 69 69 3c 70 43 75 72  es==0 && ii<pCur
62b0: 73 6f 72 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  sor->nConstraint
62c0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72  ; ii++){.    Rtr
62d0: 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 20  eeConstraint *p 
62e0: 3d 20 26 70 43 75 72 73 6f 72 2d 3e 61 43 6f 6e  = &pCursor->aCon
62f0: 73 74 72 61 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  straint[ii];.   
6300: 20 64 6f 75 62 6c 65 20 63 65 6c 6c 5f 6d 69 6e   double cell_min
6310: 20 3d 20 44 43 4f 4f 52 44 28 63 65 6c 6c 2e 61   = DCOORD(cell.a
6320: 43 6f 6f 72 64 5b 28 70 2d 3e 69 43 6f 6f 72 64  Coord[(p->iCoord
6330: 3e 3e 31 29 2a 32 5d 29 3b 0a 20 20 20 20 64 6f  >>1)*2]);.    do
6340: 75 62 6c 65 20 63 65 6c 6c 5f 6d 61 78 20 3d 20  uble cell_max = 
6350: 44 43 4f 4f 52 44 28 63 65 6c 6c 2e 61 43 6f 6f  DCOORD(cell.aCoo
6360: 72 64 5b 28 70 2d 3e 69 43 6f 6f 72 64 3e 3e 31  rd[(p->iCoord>>1
6370: 29 2a 32 2b 31 5d 29 3b 0a 0a 20 20 20 20 61 73  )*2+1]);..    as
6380: 73 65 72 74 28 70 2d 3e 6f 70 3d 3d 52 54 52 45  sert(p->op==RTRE
6390: 45 5f 4c 45 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52  E_LE || p->op==R
63a0: 54 52 45 45 5f 4c 54 20 7c 7c 20 70 2d 3e 6f 70  TREE_LT || p->op
63b0: 3d 3d 52 54 52 45 45 5f 47 45 20 0a 20 20 20 20  ==RTREE_GE .    
63c0: 20 20 20 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54      || p->op==RT
63d0: 52 45 45 5f 47 54 20 7c 7c 20 70 2d 3e 6f 70 3d  REE_GT || p->op=
63e0: 3d 52 54 52 45 45 5f 45 51 20 7c 7c 20 70 2d 3e  =RTREE_EQ || p->
63f0: 6f 70 3d 3d 52 54 52 45 45 5f 4d 41 54 43 48 0a  op==RTREE_MATCH.
6400: 20 20 20 20 29 3b 0a 0a 20 20 20 20 73 77 69 74      );..    swit
6410: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
6420: 20 20 20 63 61 73 65 20 52 54 52 45 45 5f 4c 45     case RTREE_LE
6430: 3a 20 63 61 73 65 20 52 54 52 45 45 5f 4c 54 3a  : case RTREE_LT:
6440: 20 0a 20 20 20 20 20 20 20 20 62 52 65 73 20 3d   .        bRes =
6450: 20 70 2d 3e 72 56 61 6c 75 65 3c 63 65 6c 6c 5f   p->rValue<cell_
6460: 6d 69 6e 3b 20 0a 20 20 20 20 20 20 20 20 62 72  min; .        br
6470: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
6480: 20 52 54 52 45 45 5f 47 45 3a 20 63 61 73 65 20   RTREE_GE: case 
6490: 52 54 52 45 45 5f 47 54 3a 20 0a 20 20 20 20 20  RTREE_GT: .     
64a0: 20 20 20 62 52 65 73 20 3d 20 70 2d 3e 72 56 61     bRes = p->rVa
64b0: 6c 75 65 3e 63 65 6c 6c 5f 6d 61 78 3b 20 0a 20  lue>cell_max; . 
64c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
64d0: 20 20 20 20 20 63 61 73 65 20 52 54 52 45 45 5f       case RTREE_
64e0: 45 51 3a 0a 20 20 20 20 20 20 20 20 62 52 65 73  EQ:.        bRes
64f0: 20 3d 20 28 70 2d 3e 72 56 61 6c 75 65 3e 63 65   = (p->rValue>ce
6500: 6c 6c 5f 6d 61 78 20 7c 7c 20 70 2d 3e 72 56 61  ll_max || p->rVa
6510: 6c 75 65 3c 63 65 6c 6c 5f 6d 69 6e 29 3b 0a 20  lue<cell_min);. 
6520: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
6530: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
6540: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6550: 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4d 41 54  p->op==RTREE_MAT
6560: 43 48 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  CH );.        rc
6570: 20 3d 20 74 65 73 74 52 74 72 65 65 47 65 6f 6d   = testRtreeGeom
6580: 28 70 52 74 72 65 65 2c 20 70 2c 20 26 63 65 6c  (pRtree, p, &cel
6590: 6c 2c 20 26 62 52 65 73 29 3b 0a 20 20 20 20 20  l, &bRes);.     
65a0: 20 20 20 62 52 65 73 20 3d 20 21 62 52 65 73 3b     bRes = !bRes;
65b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
65c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
65d0: 7d 0a 0a 20 20 2a 70 62 45 6f 66 20 3d 20 62 52  }..  *pbEof = bR
65e0: 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  es;.  return rc;
65f0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 73 74 20  .}../* .** Test 
6600: 69 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  if the cell that
6610: 20 63 75 72 73 6f 72 20 70 43 75 72 73 6f 72 20   cursor pCursor 
6620: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
6630: 20 74 6f 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20   to.** would be 
6640: 66 69 6c 74 65 72 65 64 20 28 65 78 63 6c 75 64  filtered (exclud
6650: 65 64 29 20 62 79 20 74 68 65 20 63 6f 6e 73 74  ed) by the const
6660: 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 0a 2a  raints in the .*
6670: 2a 20 70 43 75 72 73 6f 72 2d 3e 61 43 6f 6e 73  * pCursor->aCons
6680: 74 72 61 69 6e 74 5b 5d 20 61 72 72 61 79 2e 20  traint[] array. 
6690: 49 66 20 73 6f 2c 20 73 65 74 20 2a 70 62 45 6f  If so, set *pbEo
66a0: 66 20 74 6f 20 74 72 75 65 20 62 65 66 6f 72 65  f to true before
66b0: 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 20 49  .** returning. I
66c0: 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 6e 6f  f the cell is no
66d0: 74 20 66 69 6c 74 65 72 65 64 20 28 65 78 63 6c  t filtered (excl
66e0: 75 64 65 64 29 20 62 79 20 74 68 65 20 63 6f 6e  uded) by the con
66f0: 73 74 72 61 69 6e 74 73 2c 0a 2a 2a 20 73 65 74  straints,.** set
6700: 20 70 62 45 6f 66 20 74 6f 20 7a 65 72 6f 2e 0a   pbEof to zero..
6710: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
6720: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
6730: 73 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74  sful or an SQLit
6740: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
6750: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
6760: 72 73 20 77 69 74 68 69 6e 20 61 20 67 65 6f 6d  rs within a geom
6770: 65 74 72 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  etry callback..*
6780: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6790: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
67a0: 74 68 65 20 63 65 6c 6c 20 69 73 20 70 61 72 74  the cell is part
67b0: 20 6f 66 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e   of a leaf node.
67c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
67d0: 65 73 74 52 74 72 65 65 45 6e 74 72 79 28 52 74  estRtreeEntry(Rt
67e0: 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72  ree *pRtree, Rtr
67f0: 65 65 43 75 72 73 6f 72 20 2a 70 43 75 72 73 6f  eeCursor *pCurso
6800: 72 2c 20 69 6e 74 20 2a 70 62 45 6f 66 29 7b 0a  r, int *pbEof){.
6810: 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c    RtreeCell cell
6820: 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 2a 70  ;.  int ii;.  *p
6830: 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 6e 6f 64  bEof = 0;..  nod
6840: 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65 2c  eGetCell(pRtree,
6850: 20 70 43 75 72 73 6f 72 2d 3e 70 4e 6f 64 65 2c   pCursor->pNode,
6860: 20 70 43 75 72 73 6f 72 2d 3e 69 43 65 6c 6c 2c   pCursor->iCell,
6870: 20 26 63 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69   &cell);.  for(i
6880: 69 3d 30 3b 20 69 69 3c 70 43 75 72 73 6f 72 2d  i=0; ii<pCursor-
6890: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 69  >nConstraint; ii
68a0: 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65 43 6f  ++){.    RtreeCo
68b0: 6e 73 74 72 61 69 6e 74 20 2a 70 20 3d 20 26 70  nstraint *p = &p
68c0: 43 75 72 73 6f 72 2d 3e 61 43 6f 6e 73 74 72 61  Cursor->aConstra
68d0: 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 64 6f 75  int[ii];.    dou
68e0: 62 6c 65 20 63 6f 6f 72 64 20 3d 20 44 43 4f 4f  ble coord = DCOO
68f0: 52 44 28 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 70  RD(cell.aCoord[p
6900: 2d 3e 69 43 6f 6f 72 64 5d 29 3b 0a 20 20 20 20  ->iCoord]);.    
6910: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 61 73 73  int res;.    ass
6920: 65 72 74 28 70 2d 3e 6f 70 3d 3d 52 54 52 45 45  ert(p->op==RTREE
6930: 5f 4c 45 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54  _LE || p->op==RT
6940: 52 45 45 5f 4c 54 20 7c 7c 20 70 2d 3e 6f 70 3d  REE_LT || p->op=
6950: 3d 52 54 52 45 45 5f 47 45 20 0a 20 20 20 20 20  =RTREE_GE .     
6960: 20 20 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52     || p->op==RTR
6970: 45 45 5f 47 54 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  EE_GT || p->op==
6980: 52 54 52 45 45 5f 45 51 20 7c 7c 20 70 2d 3e 6f  RTREE_EQ || p->o
6990: 70 3d 3d 52 54 52 45 45 5f 4d 41 54 43 48 0a 20  p==RTREE_MATCH. 
69a0: 20 20 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68     );.    switch
69b0: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  ( p->op ){.     
69c0: 20 63 61 73 65 20 52 54 52 45 45 5f 4c 45 3a 20   case RTREE_LE: 
69d0: 72 65 73 20 3d 20 28 63 6f 6f 72 64 3c 3d 70 2d  res = (coord<=p-
69e0: 3e 72 56 61 6c 75 65 29 3b 20 62 72 65 61 6b 3b  >rValue); break;
69f0: 0a 20 20 20 20 20 20 63 61 73 65 20 52 54 52 45  .      case RTRE
6a00: 45 5f 4c 54 3a 20 72 65 73 20 3d 20 28 63 6f 6f  E_LT: res = (coo
6a10: 72 64 3c 70 2d 3e 72 56 61 6c 75 65 29 3b 20 20  rd<p->rValue);  
6a20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
6a30: 65 20 52 54 52 45 45 5f 47 45 3a 20 72 65 73 20  e RTREE_GE: res 
6a40: 3d 20 28 63 6f 6f 72 64 3e 3d 70 2d 3e 72 56 61  = (coord>=p->rVa
6a50: 6c 75 65 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20  lue); break;.   
6a60: 20 20 20 63 61 73 65 20 52 54 52 45 45 5f 47 54     case RTREE_GT
6a70: 3a 20 72 65 73 20 3d 20 28 63 6f 6f 72 64 3e 70  : res = (coord>p
6a80: 2d 3e 72 56 61 6c 75 65 29 3b 20 20 62 72 65 61  ->rValue);  brea
6a90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 52 54  k;.      case RT
6aa0: 52 45 45 5f 45 51 3a 20 72 65 73 20 3d 20 28 63  REE_EQ: res = (c
6ab0: 6f 6f 72 64 3d 3d 70 2d 3e 72 56 61 6c 75 65 29  oord==p->rValue)
6ac0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64  ; break;.      d
6ad0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6ae0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
6af0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
6b00: 3d 52 54 52 45 45 5f 4d 41 54 43 48 20 29 3b 0a  =RTREE_MATCH );.
6b10: 20 20 20 20 20 20 20 20 72 63 20 3d 20 74 65 73          rc = tes
6b20: 74 52 74 72 65 65 47 65 6f 6d 28 70 52 74 72 65  tRtreeGeom(pRtre
6b30: 65 2c 20 70 2c 20 26 63 65 6c 6c 2c 20 26 72 65  e, p, &cell, &re
6b40: 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
6b50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6b60: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
6b70: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
6b80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6b90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
6ba0: 20 20 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20    if( !res ){.  
6bb0: 20 20 20 20 2a 70 62 45 6f 66 20 3d 20 31 3b 0a      *pbEof = 1;.
6bc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6bd0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
6be0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
6bf0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6c00: 43 75 72 73 6f 72 20 70 43 75 72 73 6f 72 20 63  Cursor pCursor c
6c10: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
6c20: 61 74 20 61 20 6e 6f 64 65 20 74 68 61 74 20 68  at a node that h
6c30: 65 61 64 73 20 61 20 73 75 62 2d 74 72 65 65 20  eads a sub-tree 
6c40: 6f 66 0a 2a 2a 20 68 65 69 67 68 74 20 69 48 65  of.** height iHe
6c50: 69 67 68 74 20 28 69 66 20 69 48 65 69 67 68 74  ight (if iHeight
6c60: 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6e 6f  ==0, then the no
6c70: 64 65 20 69 73 20 61 20 6c 65 61 66 29 2e 20 44  de is a leaf). D
6c80: 65 73 63 65 6e 64 0a 2a 2a 20 74 6f 20 70 6f 69  escend.** to poi
6c90: 6e 74 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  nt to the left-m
6ca0: 6f 73 74 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  ost cell of the 
6cb0: 73 75 62 2d 74 72 65 65 20 74 68 61 74 20 6d 61  sub-tree that ma
6cc0: 74 63 68 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f  tches the .** co
6cd0: 6e 66 69 67 75 72 65 64 20 63 6f 6e 73 74 72 61  nfigured constra
6ce0: 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ints..*/.static 
6cf0: 69 6e 74 20 64 65 73 63 65 6e 64 54 6f 43 65 6c  int descendToCel
6d00: 6c 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  l(.  Rtree *pRtr
6d10: 65 65 2c 20 0a 20 20 52 74 72 65 65 43 75 72 73  ee, .  RtreeCurs
6d20: 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 0a 20 20  or *pCursor, .  
6d30: 69 6e 74 20 69 48 65 69 67 68 74 2c 0a 20 20 69  int iHeight,.  i
6d40: 6e 74 20 2a 70 45 6f 66 20 20 20 20 20 20 20 20  nt *pEof        
6d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
6d60: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
6d70: 63 61 6e 6e 6f 74 20 64 65 73 63 65 6e 64 20 2a  cannot descend *
6d80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 73 45 6f 66  /.){.  int isEof
6d90: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
6da0: 74 20 69 69 3b 0a 20 20 52 74 72 65 65 4e 6f 64  t ii;.  RtreeNod
6db0: 65 20 2a 70 43 68 69 6c 64 3b 0a 20 20 73 71 6c  e *pChild;.  sql
6dc0: 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69  ite3_int64 iRowi
6dd0: 64 3b 0a 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  d;..  RtreeNode 
6de0: 2a 70 53 61 76 65 64 4e 6f 64 65 20 3d 20 70 43  *pSavedNode = pC
6df0: 75 72 73 6f 72 2d 3e 70 4e 6f 64 65 3b 0a 20 20  ursor->pNode;.  
6e00: 69 6e 74 20 69 53 61 76 65 64 43 65 6c 6c 20 3d  int iSavedCell =
6e10: 20 70 43 75 72 73 6f 72 2d 3e 69 43 65 6c 6c 3b   pCursor->iCell;
6e20: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 48 65 69  ..  assert( iHei
6e30: 67 68 74 3e 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ght>=0 );..  if(
6e40: 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20   iHeight==0 ){. 
6e50: 20 20 20 72 63 20 3d 20 74 65 73 74 52 74 72 65     rc = testRtre
6e60: 65 45 6e 74 72 79 28 70 52 74 72 65 65 2c 20 70  eEntry(pRtree, p
6e70: 43 75 72 73 6f 72 2c 20 26 69 73 45 6f 66 29 3b  Cursor, &isEof);
6e80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
6e90: 20 3d 20 74 65 73 74 52 74 72 65 65 43 65 6c 6c   = testRtreeCell
6ea0: 28 70 52 74 72 65 65 2c 20 70 43 75 72 73 6f 72  (pRtree, pCursor
6eb0: 2c 20 26 69 73 45 6f 66 29 3b 0a 20 20 7d 0a 20  , &isEof);.  }. 
6ec0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6ed0: 4f 4b 20 7c 7c 20 69 73 45 6f 66 20 7c 7c 20 69  OK || isEof || i
6ee0: 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20  Height==0 ){.   
6ef0: 20 67 6f 74 6f 20 64 65 73 63 65 6e 64 5f 74 6f   goto descend_to
6f00: 5f 63 65 6c 6c 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  _cell_out;.  }..
6f10: 20 20 69 52 6f 77 69 64 20 3d 20 6e 6f 64 65 47    iRowid = nodeG
6f20: 65 74 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20  etRowid(pRtree, 
6f30: 70 43 75 72 73 6f 72 2d 3e 70 4e 6f 64 65 2c 20  pCursor->pNode, 
6f40: 70 43 75 72 73 6f 72 2d 3e 69 43 65 6c 6c 29 3b  pCursor->iCell);
6f50: 0a 20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71 75  .  rc = nodeAcqu
6f60: 69 72 65 28 70 52 74 72 65 65 2c 20 69 52 6f 77  ire(pRtree, iRow
6f70: 69 64 2c 20 70 43 75 72 73 6f 72 2d 3e 70 4e 6f  id, pCursor->pNo
6f80: 64 65 2c 20 26 70 43 68 69 6c 64 29 3b 0a 20 20  de, &pChild);.  
6f90: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6fa0: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65  K ){.    goto de
6fb0: 73 63 65 6e 64 5f 74 6f 5f 63 65 6c 6c 5f 6f 75  scend_to_cell_ou
6fc0: 74 3b 0a 20 20 7d 0a 0a 20 20 6e 6f 64 65 52 65  t;.  }..  nodeRe
6fd0: 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 43  lease(pRtree, pC
6fe0: 75 72 73 6f 72 2d 3e 70 4e 6f 64 65 29 3b 0a 20  ursor->pNode);. 
6ff0: 20 70 43 75 72 73 6f 72 2d 3e 70 4e 6f 64 65 20   pCursor->pNode 
7000: 3d 20 70 43 68 69 6c 64 3b 0a 20 20 69 73 45 6f  = pChild;.  isEo
7010: 66 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 69 3d  f = 1;.  for(ii=
7020: 30 3b 20 69 73 45 6f 66 20 26 26 20 69 69 3c 4e  0; isEof && ii<N
7030: 43 45 4c 4c 28 70 43 68 69 6c 64 29 3b 20 69 69  CELL(pChild); ii
7040: 2b 2b 29 7b 0a 20 20 20 20 70 43 75 72 73 6f 72  ++){.    pCursor
7050: 2d 3e 69 43 65 6c 6c 20 3d 20 69 69 3b 0a 20 20  ->iCell = ii;.  
7060: 20 20 72 63 20 3d 20 64 65 73 63 65 6e 64 54 6f    rc = descendTo
7070: 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 43 75  Cell(pRtree, pCu
7080: 72 73 6f 72 2c 20 69 48 65 69 67 68 74 2d 31 2c  rsor, iHeight-1,
7090: 20 26 69 73 45 6f 66 29 3b 0a 20 20 20 20 69 66   &isEof);.    if
70a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
70b0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
70c0: 73 63 65 6e 64 5f 74 6f 5f 63 65 6c 6c 5f 6f 75  scend_to_cell_ou
70d0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
70e0: 69 66 28 20 69 73 45 6f 66 20 29 7b 0a 20 20 20  if( isEof ){.   
70f0: 20 61 73 73 65 72 74 28 20 70 43 75 72 73 6f 72   assert( pCursor
7100: 2d 3e 70 4e 6f 64 65 3d 3d 70 43 68 69 6c 64 20  ->pNode==pChild 
7110: 29 3b 0a 20 20 20 20 6e 6f 64 65 52 65 66 65 72  );.    nodeRefer
7120: 65 6e 63 65 28 70 53 61 76 65 64 4e 6f 64 65 29  ence(pSavedNode)
7130: 3b 0a 20 20 20 20 6e 6f 64 65 52 65 6c 65 61 73  ;.    nodeReleas
7140: 65 28 70 52 74 72 65 65 2c 20 70 43 68 69 6c 64  e(pRtree, pChild
7150: 29 3b 0a 20 20 20 20 70 43 75 72 73 6f 72 2d 3e  );.    pCursor->
7160: 70 4e 6f 64 65 20 3d 20 70 53 61 76 65 64 4e 6f  pNode = pSavedNo
7170: 64 65 3b 0a 20 20 20 20 70 43 75 72 73 6f 72 2d  de;.    pCursor-
7180: 3e 69 43 65 6c 6c 20 3d 20 69 53 61 76 65 64 43  >iCell = iSavedC
7190: 65 6c 6c 3b 0a 20 20 7d 0a 0a 64 65 73 63 65 6e  ell;.  }..descen
71a0: 64 5f 74 6f 5f 63 65 6c 6c 5f 6f 75 74 3a 0a 20  d_to_cell_out:. 
71b0: 20 2a 70 45 6f 66 20 3d 20 69 73 45 6f 66 3b 0a   *pEof = isEof;.
71c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
71d0: 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 66 20 74 68 65  /*.** One of the
71e0: 20 63 65 6c 6c 73 20 69 6e 20 6e 6f 64 65 20 70   cells in node p
71f0: 4e 6f 64 65 20 69 73 20 67 75 61 72 61 6e 74 65  Node is guarante
7200: 65 64 20 74 6f 20 68 61 76 65 20 61 20 36 34 2d  ed to have a 64-
7210: 62 69 74 20 0a 2a 2a 20 69 6e 74 65 67 65 72 20  bit .** integer 
7220: 76 61 6c 75 65 20 65 71 75 61 6c 20 74 6f 20 69  value equal to i
7230: 52 6f 77 69 64 2e 20 52 65 74 75 72 6e 20 74 68  Rowid. Return th
7240: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 69 73 20  e index of this 
7250: 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
7260: 69 6e 74 20 6e 6f 64 65 52 6f 77 69 64 49 6e 64  int nodeRowidInd
7270: 65 78 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74  ex(.  Rtree *pRt
7280: 72 65 65 2c 20 0a 20 20 52 74 72 65 65 4e 6f 64  ree, .  RtreeNod
7290: 65 20 2a 70 4e 6f 64 65 2c 20 0a 20 20 69 36 34  e *pNode, .  i64
72a0: 20 69 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20 2a   iRowid,.  int *
72b0: 70 69 49 6e 64 65 78 0a 29 7b 0a 20 20 69 6e 74  piIndex.){.  int
72c0: 20 69 69 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c   ii;.  int nCell
72d0: 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3b   = NCELL(pNode);
72e0: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
72f0: 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  nCell; ii++){.  
7300: 20 20 69 66 28 20 6e 6f 64 65 47 65 74 52 6f 77    if( nodeGetRow
7310: 69 64 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  id(pRtree, pNode
7320: 2c 20 69 69 29 3d 3d 69 52 6f 77 69 64 20 29 7b  , ii)==iRowid ){
7330: 0a 20 20 20 20 20 20 2a 70 69 49 6e 64 65 78 20  .      *piIndex 
7340: 3d 20 69 69 3b 0a 20 20 20 20 20 20 72 65 74 75  = ii;.      retu
7350: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7360: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7370: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7380: 56 54 41 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  VTAB;.}../*.** R
7390: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
73a0: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
73b0: 61 69 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  aining a pointer
73c0: 20 74 6f 20 6e 6f 64 65 20 70 4e 6f 64 65 0a 2a   to node pNode.*
73d0: 2a 20 69 6e 20 69 74 73 20 70 61 72 65 6e 74 2e  * in its parent.
73e0: 20 49 66 20 70 4e 6f 64 65 20 69 73 20 74 68 65   If pNode is the
73f0: 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 72 65 74 75   root node, retu
7400: 72 6e 20 2d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  rn -1..*/.static
7410: 20 69 6e 74 20 6e 6f 64 65 50 61 72 65 6e 74 49   int nodeParentI
7420: 6e 64 65 78 28 52 74 72 65 65 20 2a 70 52 74 72  ndex(Rtree *pRtr
7430: 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70  ee, RtreeNode *p
7440: 4e 6f 64 65 2c 20 69 6e 74 20 2a 70 69 49 6e 64  Node, int *piInd
7450: 65 78 29 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65  ex){.  RtreeNode
7460: 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64   *pParent = pNod
7470: 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66  e->pParent;.  if
7480: 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
7490: 20 72 65 74 75 72 6e 20 6e 6f 64 65 52 6f 77 69   return nodeRowi
74a0: 64 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20 70  dIndex(pRtree, p
74b0: 50 61 72 65 6e 74 2c 20 70 4e 6f 64 65 2d 3e 69  Parent, pNode->i
74c0: 4e 6f 64 65 2c 20 70 69 49 6e 64 65 78 29 3b 0a  Node, piIndex);.
74d0: 20 20 7d 0a 20 20 2a 70 69 49 6e 64 65 78 20 3d    }.  *piIndex =
74e0: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   -1;.  return SQ
74f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a  LITE_OK;.}../* .
7500: 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c  ** Rtree virtual
7510: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 4e   table module xN
7520: 65 78 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  ext method..*/.s
7530: 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 4e  tatic int rtreeN
7540: 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ext(sqlite3_vtab
7550: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
7560: 72 73 6f 72 29 7b 0a 20 20 52 74 72 65 65 20 2a  rsor){.  Rtree *
7570: 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65 20  pRtree = (Rtree 
7580: 2a 29 28 70 56 74 61 62 43 75 72 73 6f 72 2d 3e  *)(pVtabCursor->
7590: 70 56 74 61 62 29 3b 0a 20 20 52 74 72 65 65 43  pVtab);.  RtreeC
75a0: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 52  ursor *pCsr = (R
75b0: 74 72 65 65 43 75 72 73 6f 72 20 2a 29 70 56 74  treeCursor *)pVt
75c0: 61 62 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20  abCursor;.  int 
75d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
75e0: 0a 20 20 2f 2a 20 52 74 72 65 65 43 75 72 73 6f  .  /* RtreeCurso
75f0: 72 2e 70 4e 6f 64 65 20 6d 75 73 74 20 6e 6f 74  r.pNode must not
7600: 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 73 20   be NULL. If is 
7610: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
7620: 69 73 20 63 75 72 73 6f 72 20 69 73 0a 20 20 2a  is cursor is.  *
7630: 2a 20 61 6c 72 65 61 64 79 20 61 74 20 45 4f 46  * already at EOF
7640: 2e 20 49 74 20 69 73 20 61 67 61 69 6e 73 74 20  . It is against 
7650: 74 68 65 20 72 75 6c 65 73 20 74 6f 20 63 61 6c  the rules to cal
7660: 6c 20 74 68 65 20 78 4e 65 78 74 28 29 20 6d 65  l the xNext() me
7670: 74 68 6f 64 20 6f 66 0a 20 20 2a 2a 20 61 20 63  thod of.  ** a c
7680: 75 72 73 6f 72 20 74 68 61 74 20 68 61 73 20 61  ursor that has a
7690: 6c 72 65 61 64 79 20 72 65 61 63 68 65 64 20 45  lready reached E
76a0: 4f 46 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  OF..  */.  asser
76b0: 74 28 20 70 43 73 72 2d 3e 70 4e 6f 64 65 20 29  t( pCsr->pNode )
76c0: 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 69  ;..  if( pCsr->i
76d0: 53 74 72 61 74 65 67 79 3d 3d 31 20 29 7b 0a 20  Strategy==1 ){. 
76e0: 20 20 20 2f 2a 20 54 68 69 73 20 22 73 63 61 6e     /* This "scan
76f0: 22 20 69 73 20 61 20 64 69 72 65 63 74 20 6c 6f  " is a direct lo
7700: 6f 6b 75 70 20 62 79 20 72 6f 77 69 64 2e 20 54  okup by rowid. T
7710: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20  here is no next 
7720: 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20 20 6e 6f  entry. */.    no
7730: 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65  deRelease(pRtree
7740: 2c 20 70 43 73 72 2d 3e 70 4e 6f 64 65 29 3b 0a  , pCsr->pNode);.
7750: 20 20 20 20 70 43 73 72 2d 3e 70 4e 6f 64 65 20      pCsr->pNode 
7760: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
7770: 20 20 2f 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65    /* Move to the
7780: 20 6e 65 78 74 20 65 6e 74 72 79 20 74 68 61 74   next entry that
7790: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 6f 6e   matches the con
77a0: 66 69 67 75 72 65 64 20 63 6f 6e 73 74 72 61 69  figured constrai
77b0: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nts. */.    int 
77c0: 69 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  iHeight = 0;.   
77d0: 20 77 68 69 6c 65 28 20 70 43 73 72 2d 3e 70 4e   while( pCsr->pN
77e0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 52 74 72  ode ){.      Rtr
77f0: 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20  eeNode *pNode = 
7800: 70 43 73 72 2d 3e 70 4e 6f 64 65 3b 0a 20 20 20  pCsr->pNode;.   
7810: 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e     int nCell = N
7820: 43 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a 20 20 20  CELL(pNode);.   
7830: 20 20 20 66 6f 72 28 70 43 73 72 2d 3e 69 43 65     for(pCsr->iCe
7840: 6c 6c 2b 2b 3b 20 70 43 73 72 2d 3e 69 43 65 6c  ll++; pCsr->iCel
7850: 6c 3c 6e 43 65 6c 6c 3b 20 70 43 73 72 2d 3e 69  l<nCell; pCsr->i
7860: 43 65 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Cell++){.       
7870: 20 69 6e 74 20 69 73 45 6f 66 3b 0a 20 20 20 20   int isEof;.    
7880: 20 20 20 20 72 63 20 3d 20 64 65 73 63 65 6e 64      rc = descend
7890: 54 6f 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70  ToCell(pRtree, p
78a0: 43 73 72 2c 20 69 48 65 69 67 68 74 2c 20 26 69  Csr, iHeight, &i
78b0: 73 45 6f 66 29 3b 0a 20 20 20 20 20 20 20 20 69  sEof);.        i
78c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
78d0: 20 7c 7c 20 21 69 73 45 6f 66 20 29 7b 0a 20 20   || !isEof ){.  
78e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
78f0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
7900: 20 20 20 7d 0a 20 20 20 20 20 20 70 43 73 72 2d     }.      pCsr-
7910: 3e 70 4e 6f 64 65 20 3d 20 70 4e 6f 64 65 2d 3e  >pNode = pNode->
7920: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 72  pParent;.      r
7930: 63 20 3d 20 6e 6f 64 65 50 61 72 65 6e 74 49 6e  c = nodeParentIn
7940: 64 65 78 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  dex(pRtree, pNod
7950: 65 2c 20 26 70 43 73 72 2d 3e 69 43 65 6c 6c 29  e, &pCsr->iCell)
7960: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
7970: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7980: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
7990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 6f        }.      no
79a0: 64 65 52 65 66 65 72 65 6e 63 65 28 70 43 73 72  deReference(pCsr
79b0: 2d 3e 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  ->pNode);.      
79c0: 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74 72  nodeRelease(pRtr
79d0: 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20  ee, pNode);.    
79e0: 20 20 69 48 65 69 67 68 74 2b 2b 3b 0a 20 20 20    iHeight++;.   
79f0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
7a00: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52   rc;.}../* .** R
7a10: 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61 62  tree virtual tab
7a20: 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69 64  le module xRowid
7a30: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
7a40: 69 63 20 69 6e 74 20 72 74 72 65 65 52 6f 77 69  ic int rtreeRowi
7a50: 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  d(sqlite3_vtab_c
7a60: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
7a70: 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  or, sqlite_int64
7a80: 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20 52 74 72   *pRowid){.  Rtr
7a90: 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74  ee *pRtree = (Rt
7aa0: 72 65 65 20 2a 29 70 56 74 61 62 43 75 72 73 6f  ree *)pVtabCurso
7ab0: 72 2d 3e 70 56 74 61 62 3b 0a 20 20 52 74 72 65  r->pVtab;.  Rtre
7ac0: 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  eCursor *pCsr = 
7ad0: 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29 70  (RtreeCursor *)p
7ae0: 56 74 61 62 43 75 72 73 6f 72 3b 0a 0a 20 20 61  VtabCursor;..  a
7af0: 73 73 65 72 74 28 70 43 73 72 2d 3e 70 4e 6f 64  ssert(pCsr->pNod
7b00: 65 29 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20  e);.  *pRowid = 
7b10: 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 70 52 74  nodeGetRowid(pRt
7b20: 72 65 65 2c 20 70 43 73 72 2d 3e 70 4e 6f 64 65  ree, pCsr->pNode
7b30: 2c 20 70 43 73 72 2d 3e 69 43 65 6c 6c 29 3b 0a  , pCsr->iCell);.
7b40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7b50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52  _OK;.}../* .** R
7b60: 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61 62  tree virtual tab
7b70: 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6c 75 6d  le module xColum
7b80: 6e 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  n method..*/.sta
7b90: 74 69 63 20 69 6e 74 20 72 74 72 65 65 43 6f 6c  tic int rtreeCol
7ba0: 75 6d 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62  umn(sqlite3_vtab
7bb0: 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71  _cursor *cur, sq
7bc0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7bd0: 74 78 2c 20 69 6e 74 20 69 29 7b 0a 20 20 52 74  tx, int i){.  Rt
7be0: 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52  ree *pRtree = (R
7bf0: 74 72 65 65 20 2a 29 63 75 72 2d 3e 70 56 74 61  tree *)cur->pVta
7c00: 62 3b 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72  b;.  RtreeCursor
7c10: 20 2a 70 43 73 72 20 3d 20 28 52 74 72 65 65 43   *pCsr = (RtreeC
7c20: 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 0a 20 20  ursor *)cur;..  
7c30: 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
7c40: 69 36 34 20 69 52 6f 77 69 64 20 3d 20 6e 6f 64  i64 iRowid = nod
7c50: 65 47 65 74 52 6f 77 69 64 28 70 52 74 72 65 65  eGetRowid(pRtree
7c60: 2c 20 70 43 73 72 2d 3e 70 4e 6f 64 65 2c 20 70  , pCsr->pNode, p
7c70: 43 73 72 2d 3e 69 43 65 6c 6c 29 3b 0a 20 20 20  Csr->iCell);.   
7c80: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7c90: 69 6e 74 36 34 28 63 74 78 2c 20 69 52 6f 77 69  int64(ctx, iRowi
7ca0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
7cb0: 20 52 74 72 65 65 43 6f 6f 72 64 20 63 3b 0a 20   RtreeCoord c;. 
7cc0: 20 20 20 6e 6f 64 65 47 65 74 43 6f 6f 72 64 28     nodeGetCoord(
7cd0: 70 52 74 72 65 65 2c 20 70 43 73 72 2d 3e 70 4e  pRtree, pCsr->pN
7ce0: 6f 64 65 2c 20 70 43 73 72 2d 3e 69 43 65 6c 6c  ode, pCsr->iCell
7cf0: 2c 20 69 2d 31 2c 20 26 63 29 3b 0a 20 20 20 20  , i-1, &c);.    
7d00: 69 66 28 20 70 52 74 72 65 65 2d 3e 65 43 6f 6f  if( pRtree->eCoo
7d10: 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f 43 4f  rdType==RTREE_CO
7d20: 4f 52 44 5f 52 45 41 4c 33 32 20 29 7b 0a 20 20  ORD_REAL32 ){.  
7d30: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7d40: 6c 74 5f 64 6f 75 62 6c 65 28 63 74 78 2c 20 63  lt_double(ctx, c
7d50: 2e 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  .f);.    }else{.
7d60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
7d70: 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65  tree->eCoordType
7d80: 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e  ==RTREE_COORD_IN
7d90: 54 33 32 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  T32 );.      sql
7da0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
7db0: 63 74 78 2c 20 63 2e 69 29 3b 0a 20 20 20 20 7d  ctx, c.i);.    }
7dc0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
7dd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
7de0: 0a 2a 2a 20 55 73 65 20 6e 6f 64 65 41 63 71 75  .** Use nodeAcqu
7df0: 69 72 65 28 29 20 74 6f 20 6f 62 74 61 69 6e 20  ire() to obtain 
7e00: 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 63 6f  the leaf node co
7e10: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65 63  ntaining the rec
7e20: 6f 72 64 20 77 69 74 68 20 0a 2a 2a 20 72 6f 77  ord with .** row
7e30: 69 64 20 69 52 6f 77 69 64 2e 20 49 66 20 73 75  id iRowid. If su
7e40: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
7e50: 70 4c 65 61 66 20 74 6f 20 70 6f 69 6e 74 20 74  pLeaf to point t
7e60: 6f 20 74 68 65 20 6e 6f 64 65 20 61 6e 64 0a 2a  o the node and.*
7e70: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
7e80: 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
7e90: 6e 6f 20 73 75 63 68 20 72 65 63 6f 72 64 20 69  no such record i
7ea0: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 73 65 74  n the table, set
7eb0: 0a 2a 2a 20 2a 70 70 4c 65 61 66 20 74 6f 20 30  .** *ppLeaf to 0
7ec0: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
7ed0: 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65 72 72  TE_OK. If an err
7ee0: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
7ef0: 70 70 4c 65 61 66 0a 2a 2a 20 74 6f 20 7a 65 72  ppLeaf.** to zer
7f00: 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  o and return an 
7f10: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
7f20: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7f30: 20 66 69 6e 64 4c 65 61 66 4e 6f 64 65 28 52 74   findLeafNode(Rt
7f40: 72 65 65 20 2a 70 52 74 72 65 65 2c 20 69 36 34  ree *pRtree, i64
7f50: 20 69 52 6f 77 69 64 2c 20 52 74 72 65 65 4e 6f   iRowid, RtreeNo
7f60: 64 65 20 2a 2a 70 70 4c 65 61 66 29 7b 0a 20 20  de **ppLeaf){.  
7f70: 69 6e 74 20 72 63 3b 0a 20 20 2a 70 70 4c 65 61  int rc;.  *ppLea
7f80: 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  f = 0;.  sqlite3
7f90: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72  _bind_int64(pRtr
7fa0: 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 2c 20  ee->pReadRowid, 
7fb0: 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66  1, iRowid);.  if
7fc0: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
7fd0: 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69  Rtree->pReadRowi
7fe0: 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  d)==SQLITE_ROW )
7ff0: 7b 0a 20 20 20 20 69 36 34 20 69 4e 6f 64 65 20  {.    i64 iNode 
8000: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
8010: 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70  _int64(pRtree->p
8020: 52 65 61 64 52 6f 77 69 64 2c 20 30 29 3b 0a 20  ReadRowid, 0);. 
8030: 20 20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71 75     rc = nodeAcqu
8040: 69 72 65 28 70 52 74 72 65 65 2c 20 69 4e 6f 64  ire(pRtree, iNod
8050: 65 2c 20 30 2c 20 70 70 4c 65 61 66 29 3b 0a 20  e, 0, ppLeaf);. 
8060: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
8070: 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f  (pRtree->pReadRo
8080: 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  wid);.  }else{. 
8090: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
80a0: 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 52  reset(pRtree->pR
80b0: 65 61 64 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  eadRowid);.  }. 
80c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
80d0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
80e0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
80f0: 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 52 74  configure the Rt
8100: 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 6f 62  reeConstraint ob
8110: 6a 65 63 74 20 70 61 73 73 65 64 0a 2a 2a 20 61  ject passed.** a
8120: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
8130: 75 6d 65 6e 74 20 66 6f 72 20 61 20 4d 41 54 43  ument for a MATC
8140: 48 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68  H constraint. Th
8150: 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
8160: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
8170: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
8180: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
8190: 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61  right-hand opera
81a0: 6e 64 20 74 6f 20 74 68 65 20 4d 41 54 43 48 0a  nd to the MATCH.
81b0: 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  ** operator..*/.
81c0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 73 65 72  static int deser
81d0: 69 61 6c 69 7a 65 47 65 6f 6d 65 74 72 79 28 73  ializeGeometry(s
81e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
81f0: 61 6c 75 65 2c 20 52 74 72 65 65 43 6f 6e 73 74  alue, RtreeConst
8200: 72 61 69 6e 74 20 2a 70 43 6f 6e 73 29 7b 0a 20  raint *pCons){. 
8210: 20 52 74 72 65 65 4d 61 74 63 68 41 72 67 20 2a   RtreeMatchArg *
8220: 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 74 72  p;.  sqlite3_rtr
8230: 65 65 5f 67 65 6f 6d 65 74 72 79 20 2a 70 47 65  ee_geometry *pGe
8240: 6f 6d 3b 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b  om;.  int nBlob;
8250: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
8260: 74 20 76 61 6c 75 65 20 69 73 20 61 63 74 75 61  t value is actua
8270: 6c 6c 79 20 61 20 62 6c 6f 62 2e 20 2a 2f 0a 20  lly a blob. */. 
8280: 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 76 61   if( !sqlite3_va
8290: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 75 65 29  lue_type(pValue)
82a0: 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 20  ==SQLITE_BLOB ) 
82b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
82c0: 52 4f 52 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ROR;..  /* Check
82d0: 20 74 68 61 74 20 74 68 65 20 62 6c 6f 62 20 69   that the blob i
82e0: 73 20 72 6f 75 67 68 6c 79 20 74 68 65 20 72 69  s roughly the ri
82f0: 67 68 74 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 6e  ght size. */.  n
8300: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
8310: 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 75  alue_bytes(pValu
8320: 65 29 3b 0a 20 20 69 66 28 20 6e 42 6c 6f 62 3c  e);.  if( nBlob<
8330: 28 69 6e 74 29 73 69 7a 65 6f 66 28 52 74 72 65  (int)sizeof(Rtre
8340: 65 4d 61 74 63 68 41 72 67 29 20 0a 20 20 20 7c  eMatchArg) .   |
8350: 7c 20 28 28 6e 42 6c 6f 62 2d 73 69 7a 65 6f 66  | ((nBlob-sizeof
8360: 28 52 74 72 65 65 4d 61 74 63 68 41 72 67 29 29  (RtreeMatchArg))
8370: 25 73 69 7a 65 6f 66 28 64 6f 75 62 6c 65 29 29  %sizeof(double))
8380: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  !=0.  ){.    ret
8390: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
83a0: 3b 0a 20 20 7d 0a 0a 20 20 70 47 65 6f 6d 20 3d  ;.  }..  pGeom =
83b0: 20 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f   (sqlite3_rtree_
83c0: 67 65 6f 6d 65 74 72 79 20 2a 29 73 71 6c 69 74  geometry *)sqlit
83d0: 65 33 5f 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3_malloc(.     
83e0: 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
83f0: 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 29 20  rtree_geometry) 
8400: 2b 20 6e 42 6c 6f 62 0a 20 20 29 3b 0a 20 20 69  + nBlob.  );.  i
8410: 66 28 20 21 70 47 65 6f 6d 20 29 20 72 65 74 75  f( !pGeom ) retu
8420: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
8430: 0a 20 20 6d 65 6d 73 65 74 28 70 47 65 6f 6d 2c  .  memset(pGeom,
8440: 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74   0, sizeof(sqlit
8450: 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72  e3_rtree_geometr
8460: 79 29 29 3b 0a 20 20 70 20 3d 20 28 52 74 72 65  y));.  p = (Rtre
8470: 65 4d 61 74 63 68 41 72 67 20 2a 29 26 70 47 65  eMatchArg *)&pGe
8480: 6f 6d 5b 31 5d 3b 0a 0a 20 20 6d 65 6d 63 70 79  om[1];..  memcpy
8490: 28 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  (p, sqlite3_valu
84a0: 65 5f 62 6c 6f 62 28 70 56 61 6c 75 65 29 2c 20  e_blob(pValue), 
84b0: 6e 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 70 2d  nBlob);.  if( p-
84c0: 3e 6d 61 67 69 63 21 3d 52 54 52 45 45 5f 47 45  >magic!=RTREE_GE
84d0: 4f 4d 45 54 52 59 5f 4d 41 47 49 43 20 0a 20 20  OMETRY_MAGIC .  
84e0: 20 7c 7c 20 6e 42 6c 6f 62 21 3d 28 69 6e 74 29   || nBlob!=(int)
84f0: 28 73 69 7a 65 6f 66 28 52 74 72 65 65 4d 61 74  (sizeof(RtreeMat
8500: 63 68 41 72 67 29 20 2b 20 28 70 2d 3e 6e 50 61  chArg) + (p->nPa
8510: 72 61 6d 2d 31 29 2a 73 69 7a 65 6f 66 28 64 6f  ram-1)*sizeof(do
8520: 75 62 6c 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  uble)).  ){.    
8530: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 47 65  sqlite3_free(pGe
8540: 6f 6d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  om);.    return 
8550: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8560: 7d 0a 0a 20 20 70 47 65 6f 6d 2d 3e 70 43 6f 6e  }..  pGeom->pCon
8570: 74 65 78 74 20 3d 20 70 2d 3e 70 43 6f 6e 74 65  text = p->pConte
8580: 78 74 3b 0a 20 20 70 47 65 6f 6d 2d 3e 6e 50 61  xt;.  pGeom->nPa
8590: 72 61 6d 20 3d 20 70 2d 3e 6e 50 61 72 61 6d 3b  ram = p->nParam;
85a0: 0a 20 20 70 47 65 6f 6d 2d 3e 61 50 61 72 61 6d  .  pGeom->aParam
85b0: 20 3d 20 70 2d 3e 61 50 61 72 61 6d 3b 0a 0a 20   = p->aParam;.. 
85c0: 20 70 43 6f 6e 73 2d 3e 78 47 65 6f 6d 20 3d 20   pCons->xGeom = 
85d0: 70 2d 3e 78 47 65 6f 6d 3b 0a 20 20 70 43 6f 6e  p->xGeom;.  pCon
85e0: 73 2d 3e 70 47 65 6f 6d 20 3d 20 70 47 65 6f 6d  s->pGeom = pGeom
85f0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8600: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  E_OK;.}../* .** 
8610: 52 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61  Rtree virtual ta
8620: 62 6c 65 20 6d 6f 64 75 6c 65 20 78 46 69 6c 74  ble module xFilt
8630: 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  er method..*/.st
8640: 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 46 69  atic int rtreeFi
8650: 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  lter(.  sqlite3_
8660: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
8670: 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74  abCursor, .  int
8680: 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63   idxNum, const c
8690: 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69  har *idxStr,.  i
86a0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
86b0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
86c0: 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
86d0: 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74 61   = (Rtree *)pVta
86e0: 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a  bCursor->pVtab;.
86f0: 20 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70    RtreeCursor *p
8700: 43 73 72 20 3d 20 28 52 74 72 65 65 43 75 72 73  Csr = (RtreeCurs
8710: 6f 72 20 2a 29 70 56 74 61 62 43 75 72 73 6f 72  or *)pVtabCursor
8720: 3b 0a 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  ;..  RtreeNode *
8730: 70 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pRoot = 0;.  int
8740: 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   ii;.  int rc = 
8750: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 72 74  SQLITE_OK;..  rt
8760: 72 65 65 52 65 66 65 72 65 6e 63 65 28 70 52 74  reeReference(pRt
8770: 72 65 65 29 3b 0a 0a 20 20 66 72 65 65 43 75 72  ree);..  freeCur
8780: 73 6f 72 43 6f 6e 73 74 72 61 69 6e 74 73 28 70  sorConstraints(p
8790: 43 73 72 29 3b 0a 20 20 70 43 73 72 2d 3e 69 53  Csr);.  pCsr->iS
87a0: 74 72 61 74 65 67 79 20 3d 20 69 64 78 4e 75 6d  trategy = idxNum
87b0: 3b 0a 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 3d  ;..  if( idxNum=
87c0: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65  =1 ){.    /* Spe
87d0: 63 69 61 6c 20 63 61 73 65 20 2d 20 6c 6f 6f 6b  cial case - look
87e0: 75 70 20 62 79 20 72 6f 77 69 64 2e 20 2a 2f 0a  up by rowid. */.
87f0: 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
8800: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  Leaf;        /* 
8810: 4c 65 61 66 20 6f 6e 20 77 68 69 63 68 20 74 68  Leaf on which th
8820: 65 20 72 65 71 75 69 72 65 64 20 63 65 6c 6c 20  e required cell 
8830: 72 65 73 69 64 65 73 20 2a 2f 0a 20 20 20 20 69  resides */.    i
8840: 36 34 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69  64 iRowid = sqli
8850: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
8860: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 63  argv[0]);.    rc
8870: 20 3d 20 66 69 6e 64 4c 65 61 66 4e 6f 64 65 28   = findLeafNode(
8880: 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64 2c 20  pRtree, iRowid, 
8890: 26 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 43 73  &pLeaf);.    pCs
88a0: 72 2d 3e 70 4e 6f 64 65 20 3d 20 70 4c 65 61 66  r->pNode = pLeaf
88b0: 3b 20 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  ; .    if( pLeaf
88c0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
88d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
88e0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 6f  );.      rc = no
88f0: 64 65 52 6f 77 69 64 49 6e 64 65 78 28 70 52 74  deRowidIndex(pRt
8900: 72 65 65 2c 20 70 4c 65 61 66 2c 20 69 52 6f 77  ree, pLeaf, iRow
8910: 69 64 2c 20 26 70 43 73 72 2d 3e 69 43 65 6c 6c  id, &pCsr->iCell
8920: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
8930: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20  {.    /* Normal 
8940: 63 61 73 65 20 2d 20 72 2d 74 72 65 65 20 73 63  case - r-tree sc
8950: 61 6e 2e 20 53 65 74 20 75 70 20 74 68 65 20 52  an. Set up the R
8960: 74 72 65 65 43 75 72 73 6f 72 2e 61 43 6f 6e 73  treeCursor.aCons
8970: 74 72 61 69 6e 74 20 61 72 72 61 79 20 0a 20 20  traint array .  
8980: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 63 6f    ** with the co
8990: 6e 66 69 67 75 72 65 64 20 63 6f 6e 73 74 72 61  nfigured constra
89a0: 69 6e 74 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ints. .    */.  
89b0: 20 20 69 66 28 20 61 72 67 63 3e 30 20 29 7b 0a    if( argc>0 ){.
89c0: 20 20 20 20 20 20 70 43 73 72 2d 3e 61 43 6f 6e        pCsr->aCon
89d0: 73 74 72 61 69 6e 74 20 3d 20 73 71 6c 69 74 65  straint = sqlite
89e0: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
89f0: 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 29  RtreeConstraint)
8a00: 2a 61 72 67 63 29 3b 0a 20 20 20 20 20 20 70 43  *argc);.      pC
8a10: 73 72 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  sr->nConstraint 
8a20: 3d 20 61 72 67 63 3b 0a 20 20 20 20 20 20 69 66  = argc;.      if
8a30: 28 20 21 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72  ( !pCsr->aConstr
8a40: 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  aint ){.        
8a50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
8a60: 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
8a70: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
8a80: 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Csr->aConstraint
8a90: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65  , 0, sizeof(Rtre
8aa0: 65 43 6f 6e 73 74 72 61 69 6e 74 29 2a 61 72 67  eConstraint)*arg
8ab0: 63 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  c);.        asse
8ac0: 72 74 28 20 28 69 64 78 53 74 72 3d 3d 30 20 26  rt( (idxStr==0 &
8ad0: 26 20 61 72 67 63 3d 3d 30 29 0a 20 20 20 20 20  & argc==0).     
8ae0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69             || (i
8af0: 64 78 53 74 72 20 26 26 20 28 69 6e 74 29 73 74  dxStr && (int)st
8b00: 72 6c 65 6e 28 69 64 78 53 74 72 29 3d 3d 61 72  rlen(idxStr)==ar
8b10: 67 63 2a 32 29 20 29 3b 0a 20 20 20 20 20 20 20  gc*2) );.       
8b20: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 61 72   for(ii=0; ii<ar
8b30: 67 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  gc; ii++){.     
8b40: 20 20 20 20 20 52 74 72 65 65 43 6f 6e 73 74 72       RtreeConstr
8b50: 61 69 6e 74 20 2a 70 20 3d 20 26 70 43 73 72 2d  aint *p = &pCsr-
8b60: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 69 5d  >aConstraint[ii]
8b70: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6f  ;.          p->o
8b80: 70 20 3d 20 69 64 78 53 74 72 5b 69 69 2a 32 5d  p = idxStr[ii*2]
8b90: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  ;.          p->i
8ba0: 43 6f 6f 72 64 20 3d 20 69 64 78 53 74 72 5b 69  Coord = idxStr[i
8bb0: 69 2a 32 2b 31 5d 2d 27 61 27 3b 0a 20 20 20 20  i*2+1]-'a';.    
8bc0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
8bd0: 3d 52 54 52 45 45 5f 4d 41 54 43 48 20 29 7b 0a  =RTREE_MATCH ){.
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8bf0: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e   MATCH operator.
8c00: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 2d   The right-hand-
8c10: 73 69 64 65 20 6d 75 73 74 20 62 65 20 61 20 62  side must be a b
8c20: 6c 6f 62 20 74 68 61 74 0a 20 20 20 20 20 20 20  lob that.       
8c30: 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 63       ** can be c
8c40: 61 73 74 20 69 6e 74 6f 20 61 6e 20 52 74 72 65  ast into an Rtre
8c50: 65 4d 61 74 63 68 41 72 67 20 6f 62 6a 65 63 74  eMatchArg object
8c60: 2e 20 4f 6e 65 20 63 72 65 61 74 65 64 20 75 73  . One created us
8c70: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20  ing.            
8c80: 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 74  ** an sqlite3_rt
8c90: 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c  ree_geometry_cal
8ca0: 6c 62 61 63 6b 28 29 20 53 51 4c 20 75 73 65 72  lback() SQL user
8cb0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
8cc0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
8cd0: 20 20 20 20 20 20 72 63 20 3d 20 64 65 73 65 72        rc = deser
8ce0: 69 61 6c 69 7a 65 47 65 6f 6d 65 74 72 79 28 61  ializeGeometry(a
8cf0: 72 67 76 5b 69 69 5d 2c 20 70 29 3b 0a 20 20 20  rgv[ii], p);.   
8d00: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
8d10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
8d30: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
8d40: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
8d50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
8d60: 3e 72 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65  >rValue = sqlite
8d70: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
8d80: 72 67 76 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20  rgv[ii]);.      
8d90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8db0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8dc0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8dd0: 70 43 73 72 2d 3e 70 4e 6f 64 65 20 3d 20 30 3b  pCsr->pNode = 0;
8de0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65  .      rc = node
8df0: 41 63 71 75 69 72 65 28 70 52 74 72 65 65 2c 20  Acquire(pRtree, 
8e00: 31 2c 20 30 2c 20 26 70 52 6f 6f 74 29 3b 0a 20  1, 0, &pRoot);. 
8e10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
8e20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8e30: 20 20 20 20 69 6e 74 20 69 73 45 6f 66 20 3d 20      int isEof = 
8e40: 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 65  1;.      int nCe
8e50: 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 52 6f 6f 74  ll = NCELL(pRoot
8e60: 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 70  );.      pCsr->p
8e70: 4e 6f 64 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20  Node = pRoot;.  
8e80: 20 20 20 20 66 6f 72 28 70 43 73 72 2d 3e 69 43      for(pCsr->iC
8e90: 65 6c 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  ell=0; rc==SQLIT
8ea0: 45 5f 4f 4b 20 26 26 20 70 43 73 72 2d 3e 69 43  E_OK && pCsr->iC
8eb0: 65 6c 6c 3c 6e 43 65 6c 6c 3b 20 70 43 73 72 2d  ell<nCell; pCsr-
8ec0: 3e 69 43 65 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  >iCell++){.     
8ed0: 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d     assert( pCsr-
8ee0: 3e 70 4e 6f 64 65 3d 3d 70 52 6f 6f 74 20 29 3b  >pNode==pRoot );
8ef0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 64 65  .        rc = de
8f00: 73 63 65 6e 64 54 6f 43 65 6c 6c 28 70 52 74 72  scendToCell(pRtr
8f10: 65 65 2c 20 70 43 73 72 2c 20 70 52 74 72 65 65  ee, pCsr, pRtree
8f20: 2d 3e 69 44 65 70 74 68 2c 20 26 69 73 45 6f 66  ->iDepth, &isEof
8f30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
8f40: 69 73 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 20  isEof ){.       
8f50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8f60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8f70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8f80: 5f 4f 4b 20 26 26 20 69 73 45 6f 66 20 29 7b 0a  _OK && isEof ){.
8f90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8fa0: 70 43 73 72 2d 3e 70 4e 6f 64 65 3d 3d 70 52 6f  pCsr->pNode==pRo
8fb0: 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 6f  ot );.        no
8fc0: 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65  deRelease(pRtree
8fd0: 2c 20 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  , pRoot);.      
8fe0: 20 20 70 43 73 72 2d 3e 70 4e 6f 64 65 20 3d 20    pCsr->pNode = 
8ff0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
9000: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
9010: 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 43 73 72 2d  ITE_OK || !pCsr-
9020: 3e 70 4e 6f 64 65 20 7c 7c 20 70 43 73 72 2d 3e  >pNode || pCsr->
9030: 69 43 65 6c 6c 3c 4e 43 45 4c 4c 28 70 43 73 72  iCell<NCELL(pCsr
9040: 2d 3e 70 4e 6f 64 65 29 20 29 3b 0a 20 20 20 20  ->pNode) );.    
9050: 7d 0a 20 20 7d 0a 0a 20 20 72 74 72 65 65 52 65  }.  }..  rtreeRe
9060: 6c 65 61 73 65 28 70 52 74 72 65 65 29 3b 0a 20  lease(pRtree);. 
9070: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9080: 2a 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75  *.** Rtree virtu
9090: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
90a0: 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
90b0: 64 2e 20 54 68 65 72 65 20 61 72 65 20 74 68 72  d. There are thr
90c0: 65 65 0a 2a 2a 20 74 61 62 6c 65 20 73 63 61 6e  ee.** table scan
90d0: 20 73 74 72 61 74 65 67 69 65 73 20 74 6f 20 63   strategies to c
90e0: 68 6f 6f 73 65 20 66 72 6f 6d 20 28 69 6e 20 6f  hoose from (in o
90f0: 72 64 65 72 20 66 72 6f 6d 20 6d 6f 73 74 20 74  rder from most t
9100: 6f 20 0a 2a 2a 20 6c 65 61 73 74 20 64 65 73 69  o .** least desi
9110: 72 61 62 6c 65 29 3a 0a 2a 2a 0a 2a 2a 20 20 20  rable):.**.**   
9120: 69 64 78 4e 75 6d 20 20 20 20 20 69 64 78 53 74  idxNum     idxSt
9130: 72 20 20 20 20 20 20 20 20 53 74 72 61 74 65 67  r        Strateg
9140: 79 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  y.**   ---------
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9170: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 31  -------.**     1
9180: 20 20 20 20 20 20 20 20 55 6e 75 73 65 64 20 20          Unused  
9190: 20 20 20 20 20 20 44 69 72 65 63 74 20 6c 6f 6f        Direct loo
91a0: 6b 75 70 20 62 79 20 72 6f 77 69 64 2e 0a 2a 2a  kup by rowid..**
91b0: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 53 65       2        Se
91c0: 65 20 62 65 6c 6f 77 20 20 20 20 20 52 2d 74 72  e below     R-tr
91d0: 65 65 20 71 75 65 72 79 20 6f 72 20 66 75 6c 6c  ee query or full
91e0: 2d 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2a 20  -table scan..** 
91f0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
9200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9220: 2d 2d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 74 72 61  --.**.** If stra
9230: 74 65 67 79 20 31 20 69 73 20 75 73 65 64 2c 20  tegy 1 is used, 
9240: 74 68 65 6e 20 69 64 78 53 74 72 20 69 73 20 6e  then idxStr is n
9250: 6f 74 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 20 49  ot meaningful. I
9260: 66 20 73 74 72 61 74 65 67 79 0a 2a 2a 20 32 20  f strategy.** 2 
9270: 69 73 20 75 73 65 64 2c 20 69 64 78 53 74 72 20  is used, idxStr 
9280: 69 73 20 66 6f 72 6d 61 74 74 65 64 20 74 6f 20  is formatted to 
9290: 63 6f 6e 74 61 69 6e 20 32 20 62 79 74 65 73 20  contain 2 bytes 
92a0: 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 63 6f 6e  for each .** con
92b0: 73 74 72 61 69 6e 74 20 75 73 65 64 2e 20 54 68  straint used. Th
92c0: 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65  e first two byte
92d0: 73 20 6f 66 20 69 64 78 53 74 72 20 63 6f 72 72  s of idxStr corr
92e0: 65 73 70 6f 6e 64 20 74 6f 20 0a 2a 2a 20 74 68  espond to .** th
92f0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20  e constraint in 
9300: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
9310: 66 6f 2e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  fo.aConstraintUs
9320: 61 67 65 5b 5d 20 77 69 74 68 0a 2a 2a 20 28 61  age[] with.** (a
9330: 72 67 76 49 6e 64 65 78 3d 3d 31 29 20 65 74 63  rgvIndex==1) etc
9340: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
9350: 74 20 6f 66 20 65 61 63 68 20 70 61 69 72 20 6f  t of each pair o
9360: 66 20 62 79 74 65 73 20 69 6e 20 69 64 78 53 74  f bytes in idxSt
9370: 72 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  r identifies the
9380: 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 6f   constraint.** o
9390: 70 65 72 61 74 6f 72 20 61 73 20 66 6f 6c 6c 6f  perator as follo
93a0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 65 72  ws:.**.**   Oper
93b0: 61 74 6f 72 20 20 20 20 42 79 74 65 20 56 61 6c  ator    Byte Val
93c0: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
93e0: 2a 20 20 20 20 20 20 3d 20 20 20 20 20 20 20 20  *      =        
93f0: 30 78 34 31 20 28 27 41 27 29 0a 2a 2a 20 20 20  0x41 ('A').**   
9400: 20 20 3c 3d 20 20 20 20 20 20 20 20 30 78 34 32    <=        0x42
9410: 20 28 27 42 27 29 0a 2a 2a 20 20 20 20 20 20 3c   ('B').**      <
9420: 20 20 20 20 20 20 20 20 30 78 34 33 20 28 27 43          0x43 ('C
9430: 27 29 0a 2a 2a 20 20 20 20 20 3e 3d 20 20 20 20  ').**     >=    
9440: 20 20 20 20 30 78 34 34 20 28 27 44 27 29 0a 2a      0x44 ('D').*
9450: 2a 20 20 20 20 20 20 3e 20 20 20 20 20 20 20 20  *      >        
9460: 30 78 34 35 20 28 27 45 27 29 0a 2a 2a 20 20 20  0x45 ('E').**   
9470: 4d 41 54 43 48 20 20 20 20 20 20 20 30 78 34 36  MATCH       0x46
9480: 20 28 27 46 27 29 0a 2a 2a 20 20 20 2d 2d 2d 2d   ('F').**   ----
9490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94a0: 2d 2d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  --.**.** The sec
94b0: 6f 6e 64 20 6f 66 20 65 61 63 68 20 70 61 69 72  ond of each pair
94c0: 20 6f 66 20 62 79 74 65 73 20 69 64 65 6e 74 69   of bytes identi
94d0: 66 69 65 73 20 74 68 65 20 63 6f 6f 72 64 69 6e  fies the coordin
94e0: 61 74 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f  ate column.** to
94f0: 20 77 68 69 63 68 20 74 68 65 20 63 6f 6e 73 74   which the const
9500: 72 61 69 6e 74 20 61 70 70 6c 69 65 73 2e 20 54  raint applies. T
9510: 68 65 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6f 72  he leftmost coor
9520: 64 69 6e 61 74 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  dinate column.**
9530: 20 69 73 20 27 61 27 2c 20 74 68 65 20 73 65 63   is 'a', the sec
9540: 6f 6e 64 20 66 72 6f 6d 20 74 68 65 20 6c 65 66  ond from the lef
9550: 74 20 27 62 27 20 65 74 63 2e 0a 2a 2f 0a 73 74  t 'b' etc..*/.st
9560: 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 42 65  atic int rtreeBe
9570: 73 74 49 6e 64 65 78 28 73 71 6c 69 74 65 33 5f  stIndex(sqlite3_
9580: 76 74 61 62 20 2a 74 61 62 2c 20 73 71 6c 69 74  vtab *tab, sqlit
9590: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
95a0: 49 64 78 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20  IdxInfo){.  int 
95b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
95c0: 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 69 6e 74    int ii;..  int
95d0: 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 63 68 61   iIdx = 0;.  cha
95e0: 72 20 7a 49 64 78 53 74 72 5b 52 54 52 45 45 5f  r zIdxStr[RTREE_
95f0: 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 2a 38  MAX_DIMENSIONS*8
9600: 2b 31 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 49  +1];.  memset(zI
9610: 64 78 53 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66  dxStr, 0, sizeof
9620: 28 7a 49 64 78 53 74 72 29 29 3b 0a 20 20 55 4e  (zIdxStr));.  UN
9630: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 74  USED_PARAMETER(t
9640: 61 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ab);..  assert( 
9650: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
9660: 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d  ==0 );.  for(ii=
9670: 30 3b 20 69 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  0; ii<pIdxInfo->
9680: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 69  nConstraint && i
9690: 49 64 78 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  Idx<(int)(sizeof
96a0: 28 7a 49 64 78 53 74 72 29 2d 31 29 3b 20 69 69  (zIdxStr)-1); ii
96b0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
96c0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
96d0: 6e 73 74 72 61 69 6e 74 20 2a 70 20 3d 20 26 70  nstraint *p = &p
96e0: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
96f0: 61 69 6e 74 5b 69 69 5d 3b 0a 0a 20 20 20 20 69  aint[ii];..    i
9700: 66 28 20 70 2d 3e 75 73 61 62 6c 65 20 26 26 20  f( p->usable && 
9710: 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26  p->iColumn==0 &&
9720: 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49   p->op==SQLITE_I
9730: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
9740: 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  EQ ){.      /* W
9750: 65 20 68 61 76 65 20 61 6e 20 65 71 75 61 6c 69  e have an equali
9760: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ty constraint on
9770: 20 74 68 65 20 72 6f 77 69 64 2e 20 55 73 65 20   the rowid. Use 
9780: 73 74 72 61 74 65 67 79 20 31 2e 20 2a 2f 0a 20  strategy 1. */. 
9790: 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20       int jj;.   
97a0: 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
97b0: 69 69 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ii; jj++){.     
97c0: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
97d0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 6a  nstraintUsage[jj
97e0: 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 30 3b  ].argvIndex = 0;
97f0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66  .        pIdxInf
9800: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
9810: 61 67 65 5b 6a 6a 5d 2e 6f 6d 69 74 20 3d 20 30  age[jj].omit = 0
9820: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9830: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
9840: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64 78   = 1;.      pIdx
9850: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
9860: 74 55 73 61 67 65 5b 69 69 5d 2e 61 72 67 76 49  tUsage[ii].argvI
9870: 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  ndex = 1;.      
9880: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
9890: 72 61 69 6e 74 55 73 61 67 65 5b 6a 6a 5d 2e 6f  raintUsage[jj].o
98a0: 6d 69 74 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  mit = 1;..      
98b0: 2f 2a 20 54 68 69 73 20 73 74 72 61 74 65 67 79  /* This strategy
98c0: 20 69 6e 76 6f 6c 76 65 73 20 61 20 74 77 6f 20   involves a two 
98d0: 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 73 20 6f 6e  rowid lookups on
98e0: 20 61 6e 20 42 2d 54 72 65 65 20 73 74 72 75 63   an B-Tree struc
98f0: 74 75 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  tures.      ** a
9900: 6e 64 20 74 68 65 6e 20 61 20 6c 69 6e 65 61 72  nd then a linear
9910: 20 73 65 61 72 63 68 20 6f 66 20 61 6e 20 52 2d   search of an R-
9920: 54 72 65 65 20 6e 6f 64 65 2e 20 54 68 69 73 20  Tree node. This 
9930: 73 68 6f 75 6c 64 20 62 65 20 0a 20 20 20 20 20  should be .     
9940: 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61   ** considered a
9950: 6c 6d 6f 73 74 20 61 73 20 71 75 69 63 6b 20 61  lmost as quick a
9960: 73 20 61 20 64 69 72 65 63 74 20 72 6f 77 69 64  s a direct rowid
9970: 20 6c 6f 6f 6b 75 70 20 28 66 6f 72 20 77 68 69   lookup (for whi
9980: 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  ch .      ** sql
9990: 69 74 65 20 75 73 65 73 20 61 6e 20 69 6e 74 65  ite uses an inte
99a0: 72 6e 61 6c 20 63 6f 73 74 20 6f 66 20 30 2e 30  rnal cost of 0.0
99b0: 29 2e 0a 20 20 20 20 20 20 2a 2f 20 0a 20 20 20  )..      */ .   
99c0: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
99d0: 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 30 2e  imatedCost = 10.
99e0: 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
99f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
9a00: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 73 61  ..    if( p->usa
9a10: 62 6c 65 20 26 26 20 28 70 2d 3e 69 43 6f 6c 75  ble && (p->iColu
9a20: 6d 6e 3e 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 53  mn>0 || p->op==S
9a30: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
9a40: 54 52 41 49 4e 54 5f 4d 41 54 43 48 29 20 29 7b  TRAINT_MATCH) ){
9a50: 0a 20 20 20 20 20 20 75 38 20 6f 70 3b 0a 20 20  .      u8 op;.  
9a60: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
9a70: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  p ){.        cas
9a80: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  e SQLITE_INDEX_C
9a90: 4f 4e 53 54 52 41 49 4e 54 5f 45 51 3a 20 6f 70  ONSTRAINT_EQ: op
9aa0: 20 3d 20 52 54 52 45 45 5f 45 51 3b 20 62 72 65   = RTREE_EQ; bre
9ab0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
9ac0: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
9ad0: 4e 53 54 52 41 49 4e 54 5f 47 54 3a 20 6f 70 20  NSTRAINT_GT: op 
9ae0: 3d 20 52 54 52 45 45 5f 47 54 3b 20 62 72 65 61  = RTREE_GT; brea
9af0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
9b00: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
9b10: 53 54 52 41 49 4e 54 5f 4c 45 3a 20 6f 70 20 3d  STRAINT_LE: op =
9b20: 20 52 54 52 45 45 5f 4c 45 3b 20 62 72 65 61 6b   RTREE_LE; break
9b30: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  ;.        case S
9b40: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
9b50: 54 52 41 49 4e 54 5f 4c 54 3a 20 6f 70 20 3d 20  TRAINT_LT: op = 
9b60: 52 54 52 45 45 5f 4c 54 3b 20 62 72 65 61 6b 3b  RTREE_LT; break;
9b70: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
9b80: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
9b90: 52 41 49 4e 54 5f 47 45 3a 20 6f 70 20 3d 20 52  RAINT_GE: op = R
9ba0: 54 52 45 45 5f 47 45 3b 20 62 72 65 61 6b 3b 0a  TREE_GE; break;.
9bb0: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
9bc0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9bd0: 74 28 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  t( p->op==SQLITE
9be0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
9bf0: 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 20  T_MATCH );.     
9c00: 20 20 20 20 20 6f 70 20 3d 20 52 54 52 45 45 5f       op = RTREE_
9c10: 4d 41 54 43 48 3b 20 0a 20 20 20 20 20 20 20 20  MATCH; .        
9c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9c30: 0a 20 20 20 20 20 20 7a 49 64 78 53 74 72 5b 69  .      zIdxStr[i
9c40: 49 64 78 2b 2b 5d 20 3d 20 6f 70 3b 0a 20 20 20  Idx++] = op;.   
9c50: 20 20 20 7a 49 64 78 53 74 72 5b 69 49 64 78 2b     zIdxStr[iIdx+
9c60: 2b 5d 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20  +] = p->iColumn 
9c70: 2d 20 31 20 2b 20 27 61 27 3b 0a 20 20 20 20 20  - 1 + 'a';.     
9c80: 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
9c90: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 69 5d 2e  traintUsage[ii].
9ca0: 61 72 67 76 49 6e 64 65 78 20 3d 20 28 69 49 64  argvIndex = (iId
9cb0: 78 2f 32 29 3b 0a 20 20 20 20 20 20 70 49 64 78  x/2);.      pIdx
9cc0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
9cd0: 74 55 73 61 67 65 5b 69 69 5d 2e 6f 6d 69 74 20  tUsage[ii].omit 
9ce0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
9cf0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
9d00: 75 6d 20 3d 20 32 3b 0a 20 20 70 49 64 78 49 6e  um = 2;.  pIdxIn
9d10: 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
9d20: 78 53 74 72 20 3d 20 31 3b 0a 20 20 69 66 28 20  xStr = 1;.  if( 
9d30: 69 49 64 78 3e 30 20 26 26 20 30 3d 3d 28 70 49  iIdx>0 && 0==(pI
9d40: 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
9d50: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9d60: 28 22 25 73 22 2c 20 7a 49 64 78 53 74 72 29 29  ("%s", zIdxStr))
9d70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9d80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
9d90: 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3e  .  assert( iIdx>
9da0: 3d 30 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f  =0 );.  pIdxInfo
9db0: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
9dc0: 3d 20 28 32 30 30 30 30 30 30 2e 30 20 2f 20 28  = (2000000.0 / (
9dd0: 64 6f 75 62 6c 65 29 28 69 49 64 78 20 2b 20 31  double)(iIdx + 1
9de0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
9df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9e00: 20 74 68 65 20 4e 2d 64 69 6d 65 6e 73 69 6f 6e   the N-dimension
9e10: 61 6c 20 76 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  al volumn of the
9e20: 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 69 6e 20   cell stored in 
9e30: 2a 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 66 6c  *p..*/.static fl
9e40: 6f 61 74 20 63 65 6c 6c 41 72 65 61 28 52 74 72  oat cellArea(Rtr
9e50: 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65  ee *pRtree, Rtre
9e60: 65 43 65 6c 6c 20 2a 70 29 7b 0a 20 20 66 6c 6f  eCell *p){.  flo
9e70: 61 74 20 61 72 65 61 20 3d 20 31 2e 30 3b 0a 20  at area = 1.0;. 
9e80: 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28 69   int ii;.  for(i
9e90: 69 3d 30 3b 20 69 69 3c 28 70 52 74 72 65 65 2d  i=0; ii<(pRtree-
9ea0: 3e 6e 44 69 6d 2a 32 29 3b 20 69 69 2b 3d 32 29  >nDim*2); ii+=2)
9eb0: 7b 0a 20 20 20 20 61 72 65 61 20 3d 20 28 66 6c  {.    area = (fl
9ec0: 6f 61 74 29 28 61 72 65 61 20 2a 20 28 44 43 4f  oat)(area * (DCO
9ed0: 4f 52 44 28 70 2d 3e 61 43 6f 6f 72 64 5b 69 69  ORD(p->aCoord[ii
9ee0: 2b 31 5d 29 20 2d 20 44 43 4f 4f 52 44 28 70 2d  +1]) - DCOORD(p-
9ef0: 3e 61 43 6f 6f 72 64 5b 69 69 5d 29 29 29 3b 0a  >aCoord[ii])));.
9f00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 65    }.  return are
9f10: 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  a;.}../*.** Retu
9f20: 72 6e 20 74 68 65 20 6d 61 72 67 69 6e 20 6c 65  rn the margin le
9f30: 6e 67 74 68 20 6f 66 20 63 65 6c 6c 20 70 2e 20  ngth of cell p. 
9f40: 54 68 65 20 6d 61 72 67 69 6e 20 6c 65 6e 67 74  The margin lengt
9f50: 68 20 69 73 20 74 68 65 20 73 75 6d 0a 2a 2a 20  h is the sum.** 
9f60: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 73 20 73  of the objects s
9f70: 69 7a 65 20 69 6e 20 65 61 63 68 20 64 69 6d 65  ize in each dime
9f80: 6e 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  nsion..*/.static
9f90: 20 66 6c 6f 61 74 20 63 65 6c 6c 4d 61 72 67 69   float cellMargi
9fa0: 6e 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  n(Rtree *pRtree,
9fb0: 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 29 7b 0a   RtreeCell *p){.
9fc0: 20 20 66 6c 6f 61 74 20 6d 61 72 67 69 6e 20 3d    float margin =
9fd0: 20 30 2e 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a   0.0;.  int ii;.
9fe0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 28    for(ii=0; ii<(
9ff0: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b  pRtree->nDim*2);
a000: 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 6d 61 72   ii+=2){.    mar
a010: 67 69 6e 20 2b 3d 20 28 66 6c 6f 61 74 29 28 44  gin += (float)(D
a020: 43 4f 4f 52 44 28 70 2d 3e 61 43 6f 6f 72 64 5b  COORD(p->aCoord[
a030: 69 69 2b 31 5d 29 20 2d 20 44 43 4f 4f 52 44 28  ii+1]) - DCOORD(
a040: 70 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 29 29 3b  p->aCoord[ii]));
a050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61  .  }.  return ma
a060: 72 67 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rgin;.}../*.** S
a070: 74 6f 72 65 20 74 68 65 20 75 6e 69 6f 6e 20 6f  tore the union o
a080: 66 20 63 65 6c 6c 73 20 70 31 20 61 6e 64 20 70  f cells p1 and p
a090: 32 20 69 6e 20 70 31 2e 0a 2a 2f 0a 73 74 61 74  2 in p1..*/.stat
a0a0: 69 63 20 76 6f 69 64 20 63 65 6c 6c 55 6e 69 6f  ic void cellUnio
a0b0: 6e 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  n(Rtree *pRtree,
a0c0: 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 31 2c 20   RtreeCell *p1, 
a0d0: 52 74 72 65 65 43 65 6c 6c 20 2a 70 32 29 7b 0a  RtreeCell *p2){.
a0e0: 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 66 28 20    int ii;.  if( 
a0f0: 70 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79  pRtree->eCoordTy
a100: 70 65 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44 5f  pe==RTREE_COORD_
a110: 52 45 41 4c 33 32 20 29 7b 0a 20 20 20 20 66 6f  REAL32 ){.    fo
a120: 72 28 69 69 3d 30 3b 20 69 69 3c 28 70 52 74 72  r(ii=0; ii<(pRtr
a130: 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20 69 69 2b  ee->nDim*2); ii+
a140: 3d 32 29 7b 0a 20 20 20 20 20 20 70 31 2d 3e 61  =2){.      p1->a
a150: 43 6f 6f 72 64 5b 69 69 5d 2e 66 20 3d 20 4d 49  Coord[ii].f = MI
a160: 4e 28 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d  N(p1->aCoord[ii]
a170: 2e 66 2c 20 70 32 2d 3e 61 43 6f 6f 72 64 5b 69  .f, p2->aCoord[i
a180: 69 5d 2e 66 29 3b 0a 20 20 20 20 20 20 70 31 2d  i].f);.      p1-
a190: 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 66 20  >aCoord[ii+1].f 
a1a0: 3d 20 4d 41 58 28 70 31 2d 3e 61 43 6f 6f 72 64  = MAX(p1->aCoord
a1b0: 5b 69 69 2b 31 5d 2e 66 2c 20 70 32 2d 3e 61 43  [ii+1].f, p2->aC
a1c0: 6f 6f 72 64 5b 69 69 2b 31 5d 2e 66 29 3b 0a 20  oord[ii+1].f);. 
a1d0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
a1e0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 28    for(ii=0; ii<(
a1f0: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b  pRtree->nDim*2);
a200: 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 70   ii+=2){.      p
a210: 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e 69 20  1->aCoord[ii].i 
a220: 3d 20 4d 49 4e 28 70 31 2d 3e 61 43 6f 6f 72 64  = MIN(p1->aCoord
a230: 5b 69 69 5d 2e 69 2c 20 70 32 2d 3e 61 43 6f 6f  [ii].i, p2->aCoo
a240: 72 64 5b 69 69 5d 2e 69 29 3b 0a 20 20 20 20 20  rd[ii].i);.     
a250: 20 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31   p1->aCoord[ii+1
a260: 5d 2e 69 20 3d 20 4d 41 58 28 70 31 2d 3e 61 43  ].i = MAX(p1->aC
a270: 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69 2c 20 70 32  oord[ii+1].i, p2
a280: 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69  ->aCoord[ii+1].i
a290: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
a2a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
a2b0: 65 20 69 66 20 74 68 65 20 61 72 65 61 20 63 6f  e if the area co
a2c0: 76 65 72 65 64 20 62 79 20 70 32 20 69 73 20 61  vered by p2 is a
a2d0: 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 61   subset of the a
a2e0: 72 65 61 20 63 6f 76 65 72 65 64 0a 2a 2a 20 62  rea covered.** b
a2f0: 79 20 70 31 2e 20 46 61 6c 73 65 20 6f 74 68 65  y p1. False othe
a300: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
a310: 20 69 6e 74 20 63 65 6c 6c 43 6f 6e 74 61 69 6e   int cellContain
a320: 73 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  s(Rtree *pRtree,
a330: 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 31 2c 20   RtreeCell *p1, 
a340: 52 74 72 65 65 43 65 6c 6c 20 2a 70 32 29 7b 0a  RtreeCell *p2){.
a350: 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
a360: 69 73 49 6e 74 20 3d 20 28 70 52 74 72 65 65 2d  isInt = (pRtree-
a370: 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52  >eCoordType==RTR
a380: 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 29 3b  EE_COORD_INT32);
a390: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
a3a0: 28 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 32 29  (pRtree->nDim*2)
a3b0: 3b 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 52 74  ; ii+=2){.    Rt
a3c0: 72 65 65 43 6f 6f 72 64 20 2a 61 31 20 3d 20 26  reeCoord *a1 = &
a3d0: 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 3b 0a  p1->aCoord[ii];.
a3e0: 20 20 20 20 52 74 72 65 65 43 6f 6f 72 64 20 2a      RtreeCoord *
a3f0: 61 32 20 3d 20 26 70 32 2d 3e 61 43 6f 6f 72 64  a2 = &p2->aCoord
a400: 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 21  [ii];.    if( (!
a410: 69 73 49 6e 74 20 26 26 20 28 61 32 5b 30 5d 2e  isInt && (a2[0].
a420: 66 3c 61 31 5b 30 5d 2e 66 20 7c 7c 20 61 32 5b  f<a1[0].f || a2[
a430: 31 5d 2e 66 3e 61 31 5b 31 5d 2e 66 29 29 20 0a  1].f>a1[1].f)) .
a440: 20 20 20 20 20 7c 7c 20 28 20 69 73 49 6e 74 20       || ( isInt 
a450: 26 26 20 28 61 32 5b 30 5d 2e 69 3c 61 31 5b 30  && (a2[0].i<a1[0
a460: 5d 2e 69 20 7c 7c 20 61 32 5b 31 5d 2e 69 3e 61  ].i || a2[1].i>a
a470: 31 5b 31 5d 2e 69 29 29 20 0a 20 20 20 20 29 7b  1[1].i)) .    ){
a480: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
a490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
a4a0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
a4b0: 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
a4c0: 74 20 63 65 6c 6c 20 70 20 77 6f 75 6c 64 20 67  t cell p would g
a4d0: 72 6f 77 20 62 79 20 69 66 20 69 74 20 77 65 72  row by if it wer
a4e0: 65 20 75 6e 69 6f 6e 65 64 20 77 69 74 68 20 70  e unioned with p
a4f0: 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
a500: 66 6c 6f 61 74 20 63 65 6c 6c 47 72 6f 77 74 68  float cellGrowth
a510: 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20  (Rtree *pRtree, 
a520: 52 74 72 65 65 43 65 6c 6c 20 2a 70 2c 20 52 74  RtreeCell *p, Rt
a530: 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 29 7b  reeCell *pCell){
a540: 0a 20 20 66 6c 6f 61 74 20 61 72 65 61 3b 0a 20  .  float area;. 
a550: 20 52 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b   RtreeCell cell;
a560: 0a 20 20 6d 65 6d 63 70 79 28 26 63 65 6c 6c 2c  .  memcpy(&cell,
a570: 20 70 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65   p, sizeof(Rtree
a580: 43 65 6c 6c 29 29 3b 0a 20 20 61 72 65 61 20 3d  Cell));.  area =
a590: 20 63 65 6c 6c 41 72 65 61 28 70 52 74 72 65 65   cellArea(pRtree
a5a0: 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 63 65 6c 6c  , &cell);.  cell
a5b0: 55 6e 69 6f 6e 28 70 52 74 72 65 65 2c 20 26 63  Union(pRtree, &c
a5c0: 65 6c 6c 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 72  ell, pCell);.  r
a5d0: 65 74 75 72 6e 20 28 63 65 6c 6c 41 72 65 61 28  eturn (cellArea(
a5e0: 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 29 2d 61  pRtree, &cell)-a
a5f0: 72 65 61 29 3b 0a 7d 0a 0a 23 69 66 20 56 41 52  rea);.}..#if VAR
a600: 49 41 4e 54 5f 52 53 54 41 52 54 52 45 45 5f 43  IANT_RSTARTREE_C
a610: 48 4f 4f 53 45 53 55 42 54 52 45 45 20 7c 7c 20  HOOSESUBTREE || 
a620: 56 41 52 49 41 4e 54 5f 52 53 54 41 52 54 52 45  VARIANT_RSTARTRE
a630: 45 5f 53 50 4c 49 54 0a 73 74 61 74 69 63 20 66  E_SPLIT.static f
a640: 6c 6f 61 74 20 63 65 6c 6c 4f 76 65 72 6c 61 70  loat cellOverlap
a650: 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  (.  Rtree *pRtre
a660: 65 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  e, .  RtreeCell 
a670: 2a 70 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c  *p, .  RtreeCell
a680: 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20   *aCell, .  int 
a690: 6e 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 69 45  nCell, .  int iE
a6a0: 78 63 6c 75 64 65 0a 29 7b 0a 20 20 69 6e 74 20  xclude.){.  int 
a6b0: 69 69 3b 0a 20 20 66 6c 6f 61 74 20 6f 76 65 72  ii;.  float over
a6c0: 6c 61 70 20 3d 20 30 2e 30 3b 0a 20 20 66 6f 72  lap = 0.0;.  for
a6d0: 28 69 69 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c 3b  (ii=0; ii<nCell;
a6e0: 20 69 69 2b 2b 29 7b 0a 23 69 66 20 56 41 52 49   ii++){.#if VARI
a6f0: 41 4e 54 5f 52 53 54 41 52 54 52 45 45 5f 43 48  ANT_RSTARTREE_CH
a700: 4f 4f 53 45 53 55 42 54 52 45 45 0a 20 20 20 20  OOSESUBTREE.    
a710: 69 66 28 20 69 69 21 3d 69 45 78 63 6c 75 64 65  if( ii!=iExclude
a720: 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 61 73 73   ).#else.    ass
a730: 65 72 74 28 20 69 45 78 63 6c 75 64 65 3d 3d 2d  ert( iExclude==-
a740: 31 20 29 3b 0a 20 20 20 20 55 4e 55 53 45 44 5f  1 );.    UNUSED_
a750: 50 41 52 41 4d 45 54 45 52 28 69 45 78 63 6c 75  PARAMETER(iExclu
a760: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
a770: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a  {.      int jj;.
a780: 20 20 20 20 20 20 66 6c 6f 61 74 20 6f 20 3d 20        float o = 
a790: 31 2e 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  1.0;.      for(j
a7a0: 6a 3d 30 3b 20 6a 6a 3c 28 70 52 74 72 65 65 2d  j=0; jj<(pRtree-
a7b0: 3e 6e 44 69 6d 2a 32 29 3b 20 6a 6a 2b 3d 32 29  >nDim*2); jj+=2)
a7c0: 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65  {.        double
a7d0: 20 78 31 3b 0a 20 20 20 20 20 20 20 20 64 6f 75   x1;.        dou
a7e0: 62 6c 65 20 78 32 3b 0a 0a 20 20 20 20 20 20 20  ble x2;..       
a7f0: 20 78 31 20 3d 20 4d 41 58 28 44 43 4f 4f 52 44   x1 = MAX(DCOORD
a800: 28 70 2d 3e 61 43 6f 6f 72 64 5b 6a 6a 5d 29 2c  (p->aCoord[jj]),
a810: 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 69 69   DCOORD(aCell[ii
a820: 5d 2e 61 43 6f 6f 72 64 5b 6a 6a 5d 29 29 3b 0a  ].aCoord[jj]));.
a830: 20 20 20 20 20 20 20 20 78 32 20 3d 20 4d 49 4e          x2 = MIN
a840: 28 44 43 4f 4f 52 44 28 70 2d 3e 61 43 6f 6f 72  (DCOORD(p->aCoor
a850: 64 5b 6a 6a 2b 31 5d 29 2c 20 44 43 4f 4f 52 44  d[jj+1]), DCOORD
a860: 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f 72  (aCell[ii].aCoor
a870: 64 5b 6a 6a 2b 31 5d 29 29 3b 0a 0a 20 20 20 20  d[jj+1]));..    
a880: 20 20 20 20 69 66 28 20 78 32 3c 78 31 20 29 7b      if( x2<x1 ){
a890: 0a 20 20 20 20 20 20 20 20 20 20 6f 20 3d 20 30  .          o = 0
a8a0: 2e 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  .0;.          br
a8b0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
a8c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 20  se{.          o 
a8d0: 3d 20 6f 20 2a 20 28 66 6c 6f 61 74 29 28 78 32  = o * (float)(x2
a8e0: 2d 78 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  -x1);.        }.
a8f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 76        }.      ov
a900: 65 72 6c 61 70 20 2b 3d 20 6f 3b 0a 20 20 20 20  erlap += o;.    
a910: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  }.  }.  return o
a920: 76 65 72 6c 61 70 3b 0a 7d 0a 23 65 6e 64 69 66  verlap;.}.#endif
a930: 0a 0a 23 69 66 20 56 41 52 49 41 4e 54 5f 52 53  ..#if VARIANT_RS
a940: 54 41 52 54 52 45 45 5f 43 48 4f 4f 53 45 53 55  TARTREE_CHOOSESU
a950: 42 54 52 45 45 0a 73 74 61 74 69 63 20 66 6c 6f  BTREE.static flo
a960: 61 74 20 63 65 6c 6c 4f 76 65 72 6c 61 70 45 6e  at cellOverlapEn
a970: 6c 61 72 67 65 6d 65 6e 74 28 0a 20 20 52 74 72  largement(.  Rtr
a980: 65 65 20 2a 70 52 74 72 65 65 2c 20 0a 20 20 52  ee *pRtree, .  R
a990: 74 72 65 65 43 65 6c 6c 20 2a 70 2c 20 0a 20 20  treeCell *p, .  
a9a0: 52 74 72 65 65 43 65 6c 6c 20 2a 70 49 6e 73 65  RtreeCell *pInse
a9b0: 72 74 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c  rt, .  RtreeCell
a9c0: 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20   *aCell, .  int 
a9d0: 6e 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 69 45  nCell, .  int iE
a9e0: 78 63 6c 75 64 65 0a 29 7b 0a 20 20 64 6f 75 62  xclude.){.  doub
a9f0: 6c 65 20 62 65 66 6f 72 65 3b 0a 20 20 64 6f 75  le before;.  dou
aa00: 62 6c 65 20 61 66 74 65 72 3b 0a 20 20 62 65 66  ble after;.  bef
aa10: 6f 72 65 20 3d 20 63 65 6c 6c 4f 76 65 72 6c 61  ore = cellOverla
aa20: 70 28 70 52 74 72 65 65 2c 20 70 2c 20 61 43 65  p(pRtree, p, aCe
aa30: 6c 6c 2c 20 6e 43 65 6c 6c 2c 20 69 45 78 63 6c  ll, nCell, iExcl
aa40: 75 64 65 29 3b 0a 20 20 63 65 6c 6c 55 6e 69 6f  ude);.  cellUnio
aa50: 6e 28 70 52 74 72 65 65 2c 20 70 2c 20 70 49 6e  n(pRtree, p, pIn
aa60: 73 65 72 74 29 3b 0a 20 20 61 66 74 65 72 20 3d  sert);.  after =
aa70: 20 63 65 6c 6c 4f 76 65 72 6c 61 70 28 70 52 74   cellOverlap(pRt
aa80: 72 65 65 2c 20 70 2c 20 61 43 65 6c 6c 2c 20 6e  ree, p, aCell, n
aa90: 43 65 6c 6c 2c 20 69 45 78 63 6c 75 64 65 29 3b  Cell, iExclude);
aaa0: 0a 20 20 72 65 74 75 72 6e 20 28 66 6c 6f 61 74  .  return (float
aab0: 29 28 61 66 74 65 72 2d 62 65 66 6f 72 65 29 3b  )(after-before);
aac0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
aad0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
aae0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
aaf0: 68 6f 6f 73 65 4c 65 61 66 20 61 6c 67 6f 72 69  hooseLeaf algori
ab00: 74 68 6d 20 66 72 6f 6d 20 47 75 74 6d 61 6e 5b  thm from Gutman[
ab10: 38 34 5d 2e 0a 2a 2a 20 43 68 6f 6f 73 65 53 75  84]..** ChooseSu
ab20: 62 54 72 65 65 20 69 6e 20 72 2a 74 72 65 65 20  bTree in r*tree 
ab30: 74 65 72 6d 69 6e 6f 6c 6f 67 79 2e 0a 2a 2f 0a  terminology..*/.
ab40: 73 74 61 74 69 63 20 69 6e 74 20 43 68 6f 6f 73  static int Choos
ab50: 65 4c 65 61 66 28 0a 20 20 52 74 72 65 65 20 2a  eLeaf(.  Rtree *
ab60: 70 52 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pRtree,         
ab70: 20 20 20 20 20 20 2f 2a 20 52 74 72 65 65 20 74        /* Rtree t
ab80: 61 62 6c 65 20 2a 2f 0a 20 20 52 74 72 65 65 43  able */.  RtreeC
ab90: 65 6c 6c 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  ell *pCell,     
aba0: 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 74         /* Cell t
abb0: 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 72 74  o insert into rt
abc0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 48 65  ree */.  int iHe
abd0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
abe0: 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20        /* Height 
abf0: 6f 66 20 73 75 62 2d 74 72 65 65 20 72 6f 6f 74  of sub-tree root
ac00: 65 64 20 61 74 20 70 43 65 6c 6c 20 2a 2f 0a 20  ed at pCell */. 
ac10: 20 52 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70 4c   RtreeNode **ppL
ac20: 65 61 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eaf           /*
ac30: 20 4f 55 54 3a 20 53 65 6c 65 63 74 65 64 20 6c   OUT: Selected l
ac40: 65 61 66 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  eaf page */.){. 
ac50: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
ac60: 69 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  i;.  RtreeNode *
ac70: 70 4e 6f 64 65 3b 0a 20 20 72 63 20 3d 20 6e 6f  pNode;.  rc = no
ac80: 64 65 41 63 71 75 69 72 65 28 70 52 74 72 65 65  deAcquire(pRtree
ac90: 2c 20 31 2c 20 30 2c 20 26 70 4e 6f 64 65 29 3b  , 1, 0, &pNode);
aca0: 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63  ..  for(ii=0; rc
acb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
acc0: 69 3c 28 70 52 74 72 65 65 2d 3e 69 44 65 70 74  i<(pRtree->iDept
acd0: 68 2d 69 48 65 69 67 68 74 29 3b 20 69 69 2b 2b  h-iHeight); ii++
ace0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  ){.    int iCell
acf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ;.    sqlite3_in
ad00: 74 36 34 20 69 42 65 73 74 20 3d 20 30 3b 0a 0a  t64 iBest = 0;..
ad10: 20 20 20 20 66 6c 6f 61 74 20 66 4d 69 6e 47 72      float fMinGr
ad20: 6f 77 74 68 20 3d 20 30 2e 30 3b 0a 20 20 20 20  owth = 0.0;.    
ad30: 66 6c 6f 61 74 20 66 4d 69 6e 41 72 65 61 20 3d  float fMinArea =
ad40: 20 30 2e 30 3b 0a 23 69 66 20 56 41 52 49 41 4e   0.0;.#if VARIAN
ad50: 54 5f 52 53 54 41 52 54 52 45 45 5f 43 48 4f 4f  T_RSTARTREE_CHOO
ad60: 53 45 53 55 42 54 52 45 45 0a 20 20 20 20 66 6c  SESUBTREE.    fl
ad70: 6f 61 74 20 66 4d 69 6e 4f 76 65 72 6c 61 70 20  oat fMinOverlap 
ad80: 3d 20 30 2e 30 3b 0a 20 20 20 20 66 6c 6f 61 74  = 0.0;.    float
ad90: 20 6f 76 65 72 6c 61 70 3b 0a 23 65 6e 64 69 66   overlap;.#endif
ada0: 0a 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20  ..    int nCell 
adb0: 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a  = NCELL(pNode);.
adc0: 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65      RtreeCell ce
add0: 6c 6c 3b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64  ll;.    RtreeNod
ade0: 65 20 2a 70 43 68 69 6c 64 3b 0a 0a 20 20 20 20  e *pChild;..    
adf0: 52 74 72 65 65 43 65 6c 6c 20 2a 61 43 65 6c 6c  RtreeCell *aCell
ae00: 20 3d 20 30 3b 0a 0a 23 69 66 20 56 41 52 49 41   = 0;..#if VARIA
ae10: 4e 54 5f 52 53 54 41 52 54 52 45 45 5f 43 48 4f  NT_RSTARTREE_CHO
ae20: 4f 53 45 53 55 42 54 52 45 45 0a 20 20 20 20 69  OSESUBTREE.    i
ae30: 66 28 20 69 69 3d 3d 28 70 52 74 72 65 65 2d 3e  f( ii==(pRtree->
ae40: 69 44 65 70 74 68 2d 31 29 20 29 7b 0a 20 20 20  iDepth-1) ){.   
ae50: 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20     int jj;.     
ae60: 20 61 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33   aCell = sqlite3
ae70: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 52  _malloc(sizeof(R
ae80: 74 72 65 65 43 65 6c 6c 29 2a 6e 43 65 6c 6c 29  treeCell)*nCell)
ae90: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 43 65  ;.      if( !aCe
aea0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ll ){.        rc
aeb0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
aec0: 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 52 65 6c  .        nodeRel
aed0: 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 4e 6f  ease(pRtree, pNo
aee0: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f  de);.        pNo
aef0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
af00: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
af10: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30  }.      for(jj=0
af20: 3b 20 6a 6a 3c 6e 43 65 6c 6c 3b 20 6a 6a 2b 2b  ; jj<nCell; jj++
af30: 29 7b 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 47  ){.        nodeG
af40: 65 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70  etCell(pRtree, p
af50: 4e 6f 64 65 2c 20 6a 6a 2c 20 26 61 43 65 6c 6c  Node, jj, &aCell
af60: 5b 6a 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [jj]);.      }. 
af70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
af80: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
af90: 68 69 6c 64 20 6e 6f 64 65 20 77 68 69 63 68 20  hild node which 
afa0: 77 69 6c 6c 20 62 65 20 65 6e 6c 61 72 67 65 64  will be enlarged
afb0: 20 74 68 65 20 6c 65 61 73 74 20 69 66 20 70 43   the least if pC
afc0: 65 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20 69 6e  ell.    ** is in
afd0: 73 65 72 74 65 64 20 69 6e 74 6f 20 69 74 2e 20  serted into it. 
afe0: 52 65 73 6f 6c 76 65 20 74 69 65 73 20 62 79 20  Resolve ties by 
aff0: 63 68 6f 6f 73 69 6e 67 20 74 68 65 20 65 6e 74  choosing the ent
b000: 72 79 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 74  ry with.    ** t
b010: 68 65 20 73 6d 61 6c 6c 65 73 74 20 61 72 65 61  he smallest area
b020: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
b030: 28 69 43 65 6c 6c 3d 30 3b 20 69 43 65 6c 6c 3c  (iCell=0; iCell<
b040: 6e 43 65 6c 6c 3b 20 69 43 65 6c 6c 2b 2b 29 7b  nCell; iCell++){
b050: 0a 20 20 20 20 20 20 69 6e 74 20 62 42 65 73 74  .      int bBest
b060: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6c 6f 61   = 0;.      floa
b070: 74 20 67 72 6f 77 74 68 3b 0a 20 20 20 20 20 20  t growth;.      
b080: 66 6c 6f 61 74 20 61 72 65 61 3b 0a 20 20 20 20  float area;.    
b090: 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70 52    nodeGetCell(pR
b0a0: 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69 43 65  tree, pNode, iCe
b0b0: 6c 6c 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 20 20  ll, &cell);.    
b0c0: 20 20 67 72 6f 77 74 68 20 3d 20 63 65 6c 6c 47    growth = cellG
b0d0: 72 6f 77 74 68 28 70 52 74 72 65 65 2c 20 26 63  rowth(pRtree, &c
b0e0: 65 6c 6c 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ell, pCell);.   
b0f0: 20 20 20 61 72 65 61 20 3d 20 63 65 6c 6c 41 72     area = cellAr
b100: 65 61 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c  ea(pRtree, &cell
b110: 29 3b 0a 0a 23 69 66 20 56 41 52 49 41 4e 54 5f  );..#if VARIANT_
b120: 52 53 54 41 52 54 52 45 45 5f 43 48 4f 4f 53 45  RSTARTREE_CHOOSE
b130: 53 55 42 54 52 45 45 0a 20 20 20 20 20 20 69 66  SUBTREE.      if
b140: 28 20 69 69 3d 3d 28 70 52 74 72 65 65 2d 3e 69  ( ii==(pRtree->i
b150: 44 65 70 74 68 2d 31 29 20 29 7b 0a 20 20 20 20  Depth-1) ){.    
b160: 20 20 20 20 6f 76 65 72 6c 61 70 20 3d 20 63 65      overlap = ce
b170: 6c 6c 4f 76 65 72 6c 61 70 45 6e 6c 61 72 67 65  llOverlapEnlarge
b180: 6d 65 6e 74 28 70 52 74 72 65 65 2c 26 63 65 6c  ment(pRtree,&cel
b190: 6c 2c 70 43 65 6c 6c 2c 61 43 65 6c 6c 2c 6e 43  l,pCell,aCell,nC
b1a0: 65 6c 6c 2c 69 43 65 6c 6c 29 3b 0a 20 20 20 20  ell,iCell);.    
b1b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b1c0: 20 6f 76 65 72 6c 61 70 20 3d 20 30 2e 30 3b 0a   overlap = 0.0;.
b1d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b1e0: 28 20 28 69 43 65 6c 6c 3d 3d 30 29 20 0a 20 20  ( (iCell==0) .  
b1f0: 20 20 20 20 20 7c 7c 20 28 6f 76 65 72 6c 61 70       || (overlap
b200: 3c 66 4d 69 6e 4f 76 65 72 6c 61 70 29 20 0a 20  <fMinOverlap) . 
b210: 20 20 20 20 20 20 7c 7c 20 28 6f 76 65 72 6c 61        || (overla
b220: 70 3d 3d 66 4d 69 6e 4f 76 65 72 6c 61 70 20 26  p==fMinOverlap &
b230: 26 20 67 72 6f 77 74 68 3c 66 4d 69 6e 47 72 6f  & growth<fMinGro
b240: 77 74 68 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  wth).       || (
b250: 6f 76 65 72 6c 61 70 3d 3d 66 4d 69 6e 4f 76 65  overlap==fMinOve
b260: 72 6c 61 70 20 26 26 20 67 72 6f 77 74 68 3d 3d  rlap && growth==
b270: 66 4d 69 6e 47 72 6f 77 74 68 20 26 26 20 61 72  fMinGrowth && ar
b280: 65 61 3c 66 4d 69 6e 41 72 65 61 29 0a 20 20 20  ea<fMinArea).   
b290: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42     ){.        bB
b2a0: 65 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  est = 1;.       
b2b0: 20 66 4d 69 6e 4f 76 65 72 6c 61 70 20 3d 20 6f   fMinOverlap = o
b2c0: 76 65 72 6c 61 70 3b 0a 20 20 20 20 20 20 7d 0a  verlap;.      }.
b2d0: 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  #else.      if( 
b2e0: 69 43 65 6c 6c 3d 3d 30 7c 7c 67 72 6f 77 74 68  iCell==0||growth
b2f0: 3c 66 4d 69 6e 47 72 6f 77 74 68 7c 7c 28 67 72  <fMinGrowth||(gr
b300: 6f 77 74 68 3d 3d 66 4d 69 6e 47 72 6f 77 74 68  owth==fMinGrowth
b310: 20 26 26 20 61 72 65 61 3c 66 4d 69 6e 41 72 65   && area<fMinAre
b320: 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42  a) ){.        bB
b330: 65 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  est = 1;.      }
b340: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
b350: 28 20 62 42 65 73 74 20 29 7b 0a 20 20 20 20 20  ( bBest ){.     
b360: 20 20 20 66 4d 69 6e 47 72 6f 77 74 68 20 3d 20     fMinGrowth = 
b370: 67 72 6f 77 74 68 3b 0a 20 20 20 20 20 20 20 20  growth;.        
b380: 66 4d 69 6e 41 72 65 61 20 3d 20 61 72 65 61 3b  fMinArea = area;
b390: 0a 20 20 20 20 20 20 20 20 69 42 65 73 74 20 3d  .        iBest =
b3a0: 20 63 65 6c 6c 2e 69 52 6f 77 69 64 3b 0a 20 20   cell.iRowid;.  
b3b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
b3c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 43   sqlite3_free(aC
b3d0: 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 6e  ell);.    rc = n
b3e0: 6f 64 65 41 63 71 75 69 72 65 28 70 52 74 72 65  odeAcquire(pRtre
b3f0: 65 2c 20 69 42 65 73 74 2c 20 70 4e 6f 64 65 2c  e, iBest, pNode,
b400: 20 26 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 6e   &pChild);.    n
b410: 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65  odeRelease(pRtre
b420: 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 70  e, pNode);.    p
b430: 4e 6f 64 65 20 3d 20 70 43 68 69 6c 64 3b 0a 20  Node = pChild;. 
b440: 20 7d 0a 0a 20 20 2a 70 70 4c 65 61 66 20 3d 20   }..  *ppLeaf = 
b450: 70 4e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20  pNode;.  return 
b460: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  rc;.}../*.** A c
b470: 65 6c 6c 20 77 69 74 68 20 74 68 65 20 73 61 6d  ell with the sam
b480: 65 20 63 6f 6e 74 65 6e 74 20 61 73 20 70 43 65  e content as pCe
b490: 6c 6c 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ll has just been
b4a0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 0a 2a   inserted into.*
b4b0: 2a 20 74 68 65 20 6e 6f 64 65 20 70 4e 6f 64 65  * the node pNode
b4c0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
b4d0: 75 70 64 61 74 65 73 20 74 68 65 20 62 6f 75 6e  updates the boun
b4e0: 64 69 6e 67 20 62 6f 78 20 63 65 6c 6c 73 20 69  ding box cells i
b4f0: 6e 0a 2a 2a 20 61 6c 6c 20 61 6e 63 65 73 74 6f  n.** all ancesto
b500: 72 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  r elements..*/.s
b510: 74 61 74 69 63 20 69 6e 74 20 41 64 6a 75 73 74  tatic int Adjust
b520: 54 72 65 65 28 0a 20 20 52 74 72 65 65 20 2a 70  Tree(.  Rtree *p
b530: 52 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  Rtree,          
b540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 74 72            /* Rtr
b550: 65 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 52 74  ee table */.  Rt
b560: 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20  reeNode *pNode, 
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 2f 2a 20 41 64 6a 75 73 74 20 61 6e 63 65 73 74  /* Adjust ancest
b590: 72 79 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 2e  ry of this node.
b5a0: 20 2a 2f 0a 20 20 52 74 72 65 65 43 65 6c 6c 20   */.  RtreeCell 
b5b0: 2a 70 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20  *pCell          
b5c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
b5d0: 63 65 6c 6c 20 77 61 73 20 6a 75 73 74 20 69 6e  cell was just in
b5e0: 73 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 52  serted */.){.  R
b5f0: 74 72 65 65 4e 6f 64 65 20 2a 70 20 3d 20 70 4e  treeNode *p = pN
b600: 6f 64 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  ode;.  while( p-
b610: 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  >pParent ){.    
b620: 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65  RtreeNode *pPare
b630: 6e 74 20 3d 20 70 2d 3e 70 50 61 72 65 6e 74 3b  nt = p->pParent;
b640: 0a 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20 63  .    RtreeCell c
b650: 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 69 43 65  ell;.    int iCe
b660: 6c 6c 3b 0a 0a 20 20 20 20 69 66 28 20 6e 6f 64  ll;..    if( nod
b670: 65 50 61 72 65 6e 74 49 6e 64 65 78 28 70 52 74  eParentIndex(pRt
b680: 72 65 65 2c 20 70 2c 20 26 69 43 65 6c 6c 29 20  ree, p, &iCell) 
b690: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b6a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
b6b0: 54 41 42 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  TAB;.    }..    
b6c0: 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72  nodeGetCell(pRtr
b6d0: 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 69 43 65  ee, pParent, iCe
b6e0: 6c 6c 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 20 20  ll, &cell);.    
b6f0: 69 66 28 20 21 63 65 6c 6c 43 6f 6e 74 61 69 6e  if( !cellContain
b700: 73 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c  s(pRtree, &cell,
b710: 20 70 43 65 6c 6c 29 20 29 7b 0a 20 20 20 20 20   pCell) ){.     
b720: 20 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65   cellUnion(pRtre
b730: 65 2c 20 26 63 65 6c 6c 2c 20 70 43 65 6c 6c 29  e, &cell, pCell)
b740: 3b 0a 20 20 20 20 20 20 6e 6f 64 65 4f 76 65 72  ;.      nodeOver
b750: 77 72 69 74 65 43 65 6c 6c 28 70 52 74 72 65 65  writeCell(pRtree
b760: 2c 20 70 50 61 72 65 6e 74 2c 20 26 63 65 6c 6c  , pParent, &cell
b770: 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , iCell);.    }.
b780: 20 0a 20 20 20 20 70 20 3d 20 70 50 61 72 65 6e   .    p = pParen
b790: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
b7a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b7b0: 0a 2a 2a 20 57 72 69 74 65 20 6d 61 70 70 69 6e  .** Write mappin
b7c0: 67 20 28 69 52 6f 77 69 64 2d 3e 69 4e 6f 64 65  g (iRowid->iNode
b7d0: 29 20 74 6f 20 74 68 65 20 3c 72 74 72 65 65 3e  ) to the <rtree>
b7e0: 5f 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2f  _rowid table..*/
b7f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 77 69  .static int rowi
b800: 64 57 72 69 74 65 28 52 74 72 65 65 20 2a 70 52  dWrite(Rtree *pR
b810: 74 72 65 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  tree, sqlite3_in
b820: 74 36 34 20 69 52 6f 77 69 64 2c 20 73 71 6c 69  t64 iRowid, sqli
b830: 74 65 33 5f 69 6e 74 36 34 20 69 4e 6f 64 65 29  te3_int64 iNode)
b840: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  {.  sqlite3_bind
b850: 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70  _int64(pRtree->p
b860: 57 72 69 74 65 52 6f 77 69 64 2c 20 31 2c 20 69  WriteRowid, 1, i
b870: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
b880: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74  3_bind_int64(pRt
b890: 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64  ree->pWriteRowid
b8a0: 2c 20 32 2c 20 69 4e 6f 64 65 29 3b 0a 20 20 73  , 2, iNode);.  s
b8b0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52 74 72  qlite3_step(pRtr
b8c0: 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 29  ee->pWriteRowid)
b8d0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
b8e0: 65 33 5f 72 65 73 65 74 28 70 52 74 72 65 65 2d  e3_reset(pRtree-
b8f0: 3e 70 57 72 69 74 65 52 6f 77 69 64 29 3b 0a 7d  >pWriteRowid);.}
b900: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 61  ../*.** Write ma
b910: 70 70 69 6e 67 20 28 69 4e 6f 64 65 2d 3e 69 50  pping (iNode->iP
b920: 61 72 29 20 74 6f 20 74 68 65 20 3c 72 74 72 65  ar) to the <rtre
b930: 65 3e 5f 70 61 72 65 6e 74 20 74 61 62 6c 65 2e  e>_parent table.
b940: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b950: 61 72 65 6e 74 57 72 69 74 65 28 52 74 72 65 65  arentWrite(Rtree
b960: 20 2a 70 52 74 72 65 65 2c 20 73 71 6c 69 74 65   *pRtree, sqlite
b970: 33 5f 69 6e 74 36 34 20 69 4e 6f 64 65 2c 20 73  3_int64 iNode, s
b980: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 61  qlite3_int64 iPa
b990: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  r){.  sqlite3_bi
b9a0: 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d  nd_int64(pRtree-
b9b0: 3e 70 57 72 69 74 65 50 61 72 65 6e 74 2c 20 31  >pWriteParent, 1
b9c0: 2c 20 69 4e 6f 64 65 29 3b 0a 20 20 73 71 6c 69  , iNode);.  sqli
b9d0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
b9e0: 52 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61 72  Rtree->pWritePar
b9f0: 65 6e 74 2c 20 32 2c 20 69 50 61 72 29 3b 0a 20  ent, 2, iPar);. 
ba00: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52   sqlite3_step(pR
ba10: 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61 72 65  tree->pWritePare
ba20: 6e 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  nt);.  return sq
ba30: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 74 72  lite3_reset(pRtr
ba40: 65 65 2d 3e 70 57 72 69 74 65 50 61 72 65 6e 74  ee->pWriteParent
ba50: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
ba60: 20 72 74 72 65 65 49 6e 73 65 72 74 43 65 6c 6c   rtreeInsertCell
ba70: 28 52 74 72 65 65 20 2a 2c 20 52 74 72 65 65 4e  (Rtree *, RtreeN
ba80: 6f 64 65 20 2a 2c 20 52 74 72 65 65 43 65 6c 6c  ode *, RtreeCell
ba90: 20 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 20 56   *, int);..#if V
baa0: 41 52 49 41 4e 54 5f 47 55 54 54 4d 41 4e 5f 4c  ARIANT_GUTTMAN_L
bab0: 49 4e 45 41 52 5f 53 50 4c 49 54 0a 2f 2a 0a 2a  INEAR_SPLIT./*.*
bac0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
bad0: 20 6f 66 20 74 68 65 20 6c 69 6e 65 61 72 20 76   of the linear v
bae0: 61 72 69 61 6e 74 20 6f 66 20 74 68 65 20 50 69  ariant of the Pi
baf0: 63 6b 4e 65 78 74 28 29 20 66 75 6e 63 74 69 6f  ckNext() functio
bb00: 6e 20 66 72 6f 6d 0a 2a 2a 20 47 75 74 74 6d 61  n from.** Guttma
bb10: 6e 5b 38 34 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63  n[84]..*/.static
bb20: 20 52 74 72 65 65 43 65 6c 6c 20 2a 4c 69 6e 65   RtreeCell *Line
bb30: 61 72 50 69 63 6b 4e 65 78 74 28 0a 20 20 52 74  arPickNext(.  Rt
bb40: 72 65 65 20 2a 70 52 74 72 65 65 2c 0a 20 20 52  ree *pRtree,.  R
bb50: 74 72 65 65 43 65 6c 6c 20 2a 61 43 65 6c 6c 2c  treeCell *aCell,
bb60: 20 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 0a   .  int nCell, .
bb70: 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 4c 65    RtreeCell *pLe
bb80: 66 74 42 6f 78 2c 20 0a 20 20 52 74 72 65 65 43  ftBox, .  RtreeC
bb90: 65 6c 6c 20 2a 70 52 69 67 68 74 42 6f 78 2c 0a  ell *pRightBox,.
bba0: 20 20 69 6e 74 20 2a 61 69 55 73 65 64 0a 29 7b    int *aiUsed.){
bbb0: 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72  .  int ii;.  for
bbc0: 28 69 69 3d 30 3b 20 61 69 55 73 65 64 5b 69 69  (ii=0; aiUsed[ii
bbd0: 5d 3b 20 69 69 2b 2b 29 3b 0a 20 20 61 69 55 73  ]; ii++);.  aiUs
bbe0: 65 64 5b 69 69 5d 20 3d 20 31 3b 0a 20 20 72 65  ed[ii] = 1;.  re
bbf0: 74 75 72 6e 20 26 61 43 65 6c 6c 5b 69 69 5d 3b  turn &aCell[ii];
bc00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
bc10: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
bc20: 6c 69 6e 65 61 72 20 76 61 72 69 61 6e 74 20 6f  linear variant o
bc30: 66 20 74 68 65 20 50 69 63 6b 53 65 65 64 73 28  f the PickSeeds(
bc40: 29 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 0a  ) function from.
bc50: 2a 2a 20 47 75 74 74 6d 61 6e 5b 38 34 5d 2e 0a  ** Guttman[84]..
bc60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4c  */.static void L
bc70: 69 6e 65 61 72 50 69 63 6b 53 65 65 64 73 28 0a  inearPickSeeds(.
bc80: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
bc90: 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61 43  .  RtreeCell *aC
bca0: 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 6e 43 65 6c  ell, .  int nCel
bcb0: 6c 2c 20 0a 20 20 69 6e 74 20 2a 70 69 4c 65 66  l, .  int *piLef
bcc0: 74 53 65 65 64 2c 20 0a 20 20 69 6e 74 20 2a 70  tSeed, .  int *p
bcd0: 69 52 69 67 68 74 53 65 65 64 0a 29 7b 0a 20 20  iRightSeed.){.  
bce0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 65  int i;.  int iLe
bcf0: 66 74 53 65 65 64 20 3d 20 30 3b 0a 20 20 69 6e  ftSeed = 0;.  in
bd00: 74 20 69 52 69 67 68 74 53 65 65 64 20 3d 20 31  t iRightSeed = 1
bd10: 3b 0a 20 20 66 6c 6f 61 74 20 6d 61 78 4e 6f 72  ;.  float maxNor
bd20: 6d 61 6c 49 6e 6e 65 72 57 69 64 74 68 20 3d 20  malInnerWidth = 
bd30: 30 2e 30 3b 0a 0a 20 20 2f 2a 20 50 69 63 6b 20  0.0;..  /* Pick 
bd40: 74 77 6f 20 22 73 65 65 64 22 20 63 65 6c 6c 73  two "seed" cells
bd50: 20 66 72 6f 6d 20 74 68 65 20 61 72 72 61 79 20   from the array 
bd60: 6f 66 20 63 65 6c 6c 73 2e 20 54 68 65 20 61 6c  of cells. The al
bd70: 67 6f 72 69 74 68 6d 20 75 73 65 64 0a 20 20 2a  gorithm used.  *
bd80: 2a 20 68 65 72 65 20 69 73 20 74 68 65 20 4c 69  * here is the Li
bd90: 6e 65 61 72 50 69 63 6b 53 65 65 64 73 20 61 6c  nearPickSeeds al
bda0: 67 6f 72 69 74 68 6d 20 66 72 6f 6d 20 47 75 74  gorithm from Gut
bdb0: 6d 61 6e 5b 31 39 38 34 5d 2e 20 54 68 65 20 0a  man[1984]. The .
bdc0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 6f 66 20    ** indices of 
bdd0: 74 68 65 20 74 77 6f 20 73 65 65 64 20 63 65 6c  the two seed cel
bde0: 6c 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ls in the array 
bdf0: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 6c 6f  are stored in lo
be00: 63 61 6c 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  cal.  ** variabl
be10: 65 73 20 69 4c 65 66 74 53 65 65 6b 20 61 6e 64  es iLeftSeek and
be20: 20 69 52 69 67 68 74 53 65 65 64 2e 0a 20 20 2a   iRightSeed..  *
be30: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
be40: 52 74 72 65 65 2d 3e 6e 44 69 6d 3b 20 69 2b 2b  Rtree->nDim; i++
be50: 29 7b 0a 20 20 20 20 66 6c 6f 61 74 20 78 31 20  ){.    float x1 
be60: 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 30  = DCOORD(aCell[0
be70: 5d 2e 61 43 6f 6f 72 64 5b 69 2a 32 5d 29 3b 0a  ].aCoord[i*2]);.
be80: 20 20 20 20 66 6c 6f 61 74 20 78 32 20 3d 20 44      float x2 = D
be90: 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 30 5d 2e 61  COORD(aCell[0].a
bea0: 43 6f 6f 72 64 5b 69 2a 32 2b 31 5d 29 3b 0a 20  Coord[i*2+1]);. 
beb0: 20 20 20 66 6c 6f 61 74 20 78 33 20 3d 20 78 31     float x3 = x1
bec0: 3b 0a 20 20 20 20 66 6c 6f 61 74 20 78 34 20 3d  ;.    float x4 =
bed0: 20 78 32 3b 0a 20 20 20 20 69 6e 74 20 6a 6a 3b   x2;.    int jj;
bee0: 0a 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c  ..    int iCellL
bef0: 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  eft = 0;.    int
bf00: 20 69 43 65 6c 6c 52 69 67 68 74 20 3d 20 30 3b   iCellRight = 0;
bf10: 0a 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 31 3b 20  ..    for(jj=1; 
bf20: 6a 6a 3c 6e 43 65 6c 6c 3b 20 6a 6a 2b 2b 29 7b  jj<nCell; jj++){
bf30: 0a 20 20 20 20 20 20 66 6c 6f 61 74 20 6c 65 66  .      float lef
bf40: 74 20 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c  t = DCOORD(aCell
bf50: 5b 6a 6a 5d 2e 61 43 6f 6f 72 64 5b 69 2a 32 5d  [jj].aCoord[i*2]
bf60: 29 3b 0a 20 20 20 20 20 20 66 6c 6f 61 74 20 72  );.      float r
bf70: 69 67 68 74 20 3d 20 44 43 4f 4f 52 44 28 61 43  ight = DCOORD(aC
bf80: 65 6c 6c 5b 6a 6a 5d 2e 61 43 6f 6f 72 64 5b 69  ell[jj].aCoord[i
bf90: 2a 32 2b 31 5d 29 3b 0a 0a 20 20 20 20 20 20 69  *2+1]);..      i
bfa0: 66 28 20 6c 65 66 74 3c 78 31 20 29 20 78 31 20  f( left<x1 ) x1 
bfb0: 3d 20 6c 65 66 74 3b 0a 20 20 20 20 20 20 69 66  = left;.      if
bfc0: 28 20 72 69 67 68 74 3e 78 34 20 29 20 78 34 20  ( right>x4 ) x4 
bfd0: 3d 20 72 69 67 68 74 3b 0a 20 20 20 20 20 20 69  = right;.      i
bfe0: 66 28 20 6c 65 66 74 3e 78 33 20 29 7b 0a 20 20  f( left>x3 ){.  
bff0: 20 20 20 20 20 20 78 33 20 3d 20 6c 65 66 74 3b        x3 = left;
c000: 0a 20 20 20 20 20 20 20 20 69 43 65 6c 6c 52 69  .        iCellRi
c010: 67 68 74 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20  ght = jj;.      
c020: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 69 67 68  }.      if( righ
c030: 74 3c 78 32 20 29 7b 0a 20 20 20 20 20 20 20 20  t<x2 ){.        
c040: 78 32 20 3d 20 72 69 67 68 74 3b 0a 20 20 20 20  x2 = right;.    
c050: 20 20 20 20 69 43 65 6c 6c 4c 65 66 74 20 3d 20      iCellLeft = 
c060: 6a 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  jj;.      }.    
c070: 7d 0a 0a 20 20 20 20 69 66 28 20 78 34 21 3d 78  }..    if( x4!=x
c080: 31 20 29 7b 0a 20 20 20 20 20 20 66 6c 6f 61 74  1 ){.      float
c090: 20 6e 6f 72 6d 61 6c 77 69 64 74 68 20 3d 20 28   normalwidth = (
c0a0: 78 33 20 2d 20 78 32 29 20 2f 20 28 78 34 20 2d  x3 - x2) / (x4 -
c0b0: 20 78 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   x1);.      if( 
c0c0: 6e 6f 72 6d 61 6c 77 69 64 74 68 3e 6d 61 78 4e  normalwidth>maxN
c0d0: 6f 72 6d 61 6c 49 6e 6e 65 72 57 69 64 74 68 20  ormalInnerWidth 
c0e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 65 66 74  ){.        iLeft
c0f0: 53 65 65 64 20 3d 20 69 43 65 6c 6c 4c 65 66 74  Seed = iCellLeft
c100: 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74  ;.        iRight
c110: 53 65 65 64 20 3d 20 69 43 65 6c 6c 52 69 67 68  Seed = iCellRigh
c120: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
c130: 0a 20 20 7d 0a 0a 20 20 2a 70 69 4c 65 66 74 53  .  }..  *piLeftS
c140: 65 65 64 20 3d 20 69 4c 65 66 74 53 65 65 64 3b  eed = iLeftSeed;
c150: 0a 20 20 2a 70 69 52 69 67 68 74 53 65 65 64 20  .  *piRightSeed 
c160: 3d 20 69 52 69 67 68 74 53 65 65 64 3b 0a 7d 0a  = iRightSeed;.}.
c170: 23 65 6e 64 69 66 20 2f 2a 20 56 41 52 49 41 4e  #endif /* VARIAN
c180: 54 5f 47 55 54 54 4d 41 4e 5f 4c 49 4e 45 41 52  T_GUTTMAN_LINEAR
c190: 5f 53 50 4c 49 54 20 2a 2f 0a 0a 23 69 66 20 56  _SPLIT */..#if V
c1a0: 41 52 49 41 4e 54 5f 47 55 54 54 4d 41 4e 5f 51  ARIANT_GUTTMAN_Q
c1b0: 55 41 44 52 41 54 49 43 5f 53 50 4c 49 54 0a 2f  UADRATIC_SPLIT./
c1c0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
c1d0: 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 61 64 72  ion of the quadr
c1e0: 61 74 69 63 20 76 61 72 69 61 6e 74 20 6f 66 20  atic variant of 
c1f0: 74 68 65 20 50 69 63 6b 4e 65 78 74 28 29 20 66  the PickNext() f
c200: 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20  unction from.** 
c210: 47 75 74 74 6d 61 6e 5b 38 34 5d 2e 0a 2a 2f 0a  Guttman[84]..*/.
c220: 73 74 61 74 69 63 20 52 74 72 65 65 43 65 6c 6c  static RtreeCell
c230: 20 2a 51 75 61 64 72 61 74 69 63 50 69 63 6b 4e   *QuadraticPickN
c240: 65 78 74 28 0a 20 20 52 74 72 65 65 20 2a 70 52  ext(.  Rtree *pR
c250: 74 72 65 65 2c 0a 20 20 52 74 72 65 65 43 65 6c  tree,.  RtreeCel
c260: 6c 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e 74  l *aCell, .  int
c270: 20 6e 43 65 6c 6c 2c 20 0a 20 20 52 74 72 65 65   nCell, .  Rtree
c280: 43 65 6c 6c 20 2a 70 4c 65 66 74 42 6f 78 2c 20  Cell *pLeftBox, 
c290: 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 52  .  RtreeCell *pR
c2a0: 69 67 68 74 42 6f 78 2c 0a 20 20 69 6e 74 20 2a  ightBox,.  int *
c2b0: 61 69 55 73 65 64 0a 29 7b 0a 20 20 23 64 65 66  aiUsed.){.  #def
c2c0: 69 6e 65 20 46 41 42 53 28 61 29 20 28 28 61 29  ine FABS(a) ((a)
c2d0: 3c 30 2e 30 3f 2d 31 2e 30 2a 28 61 29 3a 28 61  <0.0?-1.0*(a):(a
c2e0: 29 29 0a 0a 20 20 69 6e 74 20 69 53 65 6c 65 63  ))..  int iSelec
c2f0: 74 20 3d 20 2d 31 3b 0a 20 20 66 6c 6f 61 74 20  t = -1;.  float 
c300: 66 44 69 66 66 3b 0a 20 20 69 6e 74 20 69 69 3b  fDiff;.  int ii;
c310: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
c320: 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  nCell; ii++){.  
c330: 20 20 69 66 28 20 61 69 55 73 65 64 5b 69 69 5d    if( aiUsed[ii]
c340: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6c 6f  ==0 ){.      flo
c350: 61 74 20 6c 65 66 74 20 3d 20 63 65 6c 6c 47 72  at left = cellGr
c360: 6f 77 74 68 28 70 52 74 72 65 65 2c 20 70 4c 65  owth(pRtree, pLe
c370: 66 74 42 6f 78 2c 20 26 61 43 65 6c 6c 5b 69 69  ftBox, &aCell[ii
c380: 5d 29 3b 0a 20 20 20 20 20 20 66 6c 6f 61 74 20  ]);.      float 
c390: 72 69 67 68 74 20 3d 20 63 65 6c 6c 47 72 6f 77  right = cellGrow
c3a0: 74 68 28 70 52 74 72 65 65 2c 20 70 4c 65 66 74  th(pRtree, pLeft
c3b0: 42 6f 78 2c 20 26 61 43 65 6c 6c 5b 69 69 5d 29  Box, &aCell[ii])
c3c0: 3b 0a 20 20 20 20 20 20 66 6c 6f 61 74 20 64 69  ;.      float di
c3d0: 66 66 20 3d 20 46 41 42 53 28 72 69 67 68 74 2d  ff = FABS(right-
c3e0: 6c 65 66 74 29 3b 0a 20 20 20 20 20 20 69 66 28  left);.      if(
c3f0: 20 69 53 65 6c 65 63 74 3c 30 20 7c 7c 20 64 69   iSelect<0 || di
c400: 66 66 3e 66 44 69 66 66 20 29 7b 0a 20 20 20 20  ff>fDiff ){.    
c410: 20 20 20 20 66 44 69 66 66 20 3d 20 64 69 66 66      fDiff = diff
c420: 3b 0a 20 20 20 20 20 20 20 20 69 53 65 6c 65 63  ;.        iSelec
c430: 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 7d 0a  t = ii;.      }.
c440: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 69 55 73      }.  }.  aiUs
c450: 65 64 5b 69 53 65 6c 65 63 74 5d 20 3d 20 31 3b  ed[iSelect] = 1;
c460: 0a 20 20 72 65 74 75 72 6e 20 26 61 43 65 6c 6c  .  return &aCell
c470: 5b 69 53 65 6c 65 63 74 5d 3b 0a 7d 0a 0a 2f 2a  [iSelect];.}../*
c480: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
c490: 6f 6e 20 6f 66 20 74 68 65 20 71 75 61 64 72 61  on of the quadra
c4a0: 74 69 63 20 76 61 72 69 61 6e 74 20 6f 66 20 74  tic variant of t
c4b0: 68 65 20 50 69 63 6b 53 65 65 64 73 28 29 20 66  he PickSeeds() f
c4c0: 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20  unction from.** 
c4d0: 47 75 74 74 6d 61 6e 5b 38 34 5d 2e 0a 2a 2f 0a  Guttman[84]..*/.
c4e0: 73 74 61 74 69 63 20 76 6f 69 64 20 51 75 61 64  static void Quad
c4f0: 72 61 74 69 63 50 69 63 6b 53 65 65 64 73 28 0a  raticPickSeeds(.
c500: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
c510: 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61 43  .  RtreeCell *aC
c520: 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 6e 43 65 6c  ell, .  int nCel
c530: 6c 2c 20 0a 20 20 69 6e 74 20 2a 70 69 4c 65 66  l, .  int *piLef
c540: 74 53 65 65 64 2c 20 0a 20 20 69 6e 74 20 2a 70  tSeed, .  int *p
c550: 69 52 69 67 68 74 53 65 65 64 0a 29 7b 0a 20 20  iRightSeed.){.  
c560: 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 6a 6a  int ii;.  int jj
c570: 3b 0a 0a 20 20 69 6e 74 20 69 4c 65 66 74 53 65  ;..  int iLeftSe
c580: 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 52  ed = 0;.  int iR
c590: 69 67 68 74 53 65 65 64 20 3d 20 31 3b 0a 20 20  ightSeed = 1;.  
c5a0: 66 6c 6f 61 74 20 66 57 61 73 74 65 20 3d 20 30  float fWaste = 0
c5b0: 2e 30 3b 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b  .0;..  for(ii=0;
c5c0: 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29   ii<nCell; ii++)
c5d0: 7b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 69 69 2b  {.    for(jj=ii+
c5e0: 31 3b 20 6a 6a 3c 6e 43 65 6c 6c 3b 20 6a 6a 2b  1; jj<nCell; jj+
c5f0: 2b 29 7b 0a 20 20 20 20 20 20 66 6c 6f 61 74 20  +){.      float 
c600: 72 69 67 68 74 20 3d 20 63 65 6c 6c 41 72 65 61  right = cellArea
c610: 28 70 52 74 72 65 65 2c 20 26 61 43 65 6c 6c 5b  (pRtree, &aCell[
c620: 6a 6a 5d 29 3b 0a 20 20 20 20 20 20 66 6c 6f 61  jj]);.      floa
c630: 74 20 67 72 6f 77 74 68 20 3d 20 63 65 6c 6c 47  t growth = cellG
c640: 72 6f 77 74 68 28 70 52 74 72 65 65 2c 20 26 61  rowth(pRtree, &a
c650: 43 65 6c 6c 5b 69 69 5d 2c 20 26 61 43 65 6c 6c  Cell[ii], &aCell
c660: 5b 6a 6a 5d 29 3b 0a 20 20 20 20 20 20 66 6c 6f  [jj]);.      flo
c670: 61 74 20 77 61 73 74 65 20 3d 20 67 72 6f 77 74  at waste = growt
c680: 68 20 2d 20 72 69 67 68 74 3b 0a 0a 20 20 20 20  h - right;..    
c690: 20 20 69 66 28 20 77 61 73 74 65 3e 66 57 61 73    if( waste>fWas
c6a0: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  te ){.        iL
c6b0: 65 66 74 53 65 65 64 20 3d 20 69 69 3b 0a 20 20  eftSeed = ii;.  
c6c0: 20 20 20 20 20 20 69 52 69 67 68 74 53 65 65 64        iRightSeed
c6d0: 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 66   = jj;.        f
c6e0: 57 61 73 74 65 20 3d 20 77 61 73 74 65 3b 0a 20  Waste = waste;. 
c6f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c700: 0a 0a 20 20 2a 70 69 4c 65 66 74 53 65 65 64 20  ..  *piLeftSeed 
c710: 3d 20 69 4c 65 66 74 53 65 65 64 3b 0a 20 20 2a  = iLeftSeed;.  *
c720: 70 69 52 69 67 68 74 53 65 65 64 20 3d 20 69 52  piRightSeed = iR
c730: 69 67 68 74 53 65 65 64 3b 0a 7d 0a 23 65 6e 64  ightSeed;.}.#end
c740: 69 66 20 2f 2a 20 56 41 52 49 41 4e 54 5f 47 55  if /* VARIANT_GU
c750: 54 54 4d 41 4e 5f 51 55 41 44 52 41 54 49 43 5f  TTMAN_QUADRATIC_
c760: 53 50 4c 49 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SPLIT */../*.** 
c770: 41 72 67 75 6d 65 6e 74 73 20 61 49 64 78 2c 20  Arguments aIdx, 
c780: 61 44 69 73 74 61 6e 63 65 20 61 6e 64 20 61 53  aDistance and aS
c790: 70 61 72 65 20 61 6c 6c 20 70 6f 69 6e 74 20 74  pare all point t
c7a0: 6f 20 61 72 72 61 79 73 20 6f 66 20 73 69 7a 65  o arrays of size
c7b0: 0a 2a 2a 20 6e 49 64 78 2e 20 54 68 65 20 61 49  .** nIdx. The aI
c7c0: 64 78 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  dx array contain
c7d0: 73 20 74 68 65 20 73 65 74 20 6f 66 20 69 6e 74  s the set of int
c7e0: 65 67 65 72 73 20 66 72 6f 6d 20 30 20 74 6f 20  egers from 0 to 
c7f0: 0a 2a 2a 20 28 6e 49 64 78 2d 31 29 20 69 6e 20  .** (nIdx-1) in 
c800: 6e 6f 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72  no particular or
c810: 64 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  der. This functi
c820: 6f 6e 20 73 6f 72 74 73 20 74 68 65 20 76 61 6c  on sorts the val
c830: 75 65 73 0a 2a 2a 20 69 6e 20 61 49 64 78 20 61  ues.** in aIdx a
c840: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
c850: 69 6e 64 65 78 65 64 20 76 61 6c 75 65 73 20 69  indexed values i
c860: 6e 20 61 44 69 73 74 61 6e 63 65 2e 20 46 6f 72  n aDistance. For
c870: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
c880: 75 6d 69 6e 67 20 74 68 65 20 69 6e 70 75 74 73  uming the inputs
c890: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 49 64 78 20 20  :.**.**   aIdx  
c8a0: 20 20 20 20 3d 20 7b 20 30 2c 20 20 20 31 2c 20      = { 0,   1, 
c8b0: 20 20 32 2c 20 20 20 33 20 7d 0a 2a 2a 20 20 20    2,   3 }.**   
c8c0: 61 44 69 73 74 61 6e 63 65 20 3d 20 7b 20 35 2e  aDistance = { 5.
c8d0: 30 2c 20 32 2e 30 2c 20 37 2e 30 2c 20 36 2e 30  0, 2.0, 7.0, 6.0
c8e0: 20 7d 0a 2a 2a 0a 2a 2a 20 74 68 69 73 20 66 75   }.**.** this fu
c8f0: 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
c900: 61 49 64 78 20 61 72 72 61 79 20 74 6f 20 63 6f  aIdx array to co
c910: 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  ntain:.**.**   a
c920: 49 64 78 20 20 20 20 20 20 3d 20 7b 20 30 2c 20  Idx      = { 0, 
c930: 20 20 31 2c 20 20 20 32 2c 20 20 20 33 20 7d 0a    1,   2,   3 }.
c940: 2a 2a 0a 2a 2a 20 54 68 65 20 61 53 70 61 72 65  **.** The aSpare
c950: 20 61 72 72 61 79 20 69 73 20 75 73 65 64 20 61   array is used a
c960: 73 20 74 65 6d 70 6f 72 61 72 79 20 77 6f 72 6b  s temporary work
c970: 69 6e 67 20 73 70 61 63 65 20 62 79 20 74 68 65  ing space by the
c980: 0a 2a 2a 20 73 6f 72 74 69 6e 67 20 61 6c 67 6f  .** sorting algo
c990: 72 69 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  rithm..*/.static
c9a0: 20 76 6f 69 64 20 53 6f 72 74 42 79 44 69 73 74   void SortByDist
c9b0: 61 6e 63 65 28 0a 20 20 69 6e 74 20 2a 61 49 64  ance(.  int *aId
c9c0: 78 2c 20 0a 20 20 69 6e 74 20 6e 49 64 78 2c 20  x, .  int nIdx, 
c9d0: 0a 20 20 66 6c 6f 61 74 20 2a 61 44 69 73 74 61  .  float *aDista
c9e0: 6e 63 65 2c 20 0a 20 20 69 6e 74 20 2a 61 53 70  nce, .  int *aSp
c9f0: 61 72 65 0a 29 7b 0a 20 20 69 66 28 20 6e 49 64  are.){.  if( nId
ca00: 78 3e 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  x>1 ){.    int i
ca10: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Left = 0;.    in
ca20: 74 20 69 52 69 67 68 74 20 3d 20 30 3b 0a 0a 20  t iRight = 0;.. 
ca30: 20 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 6e     int nLeft = n
ca40: 49 64 78 2f 32 3b 0a 20 20 20 20 69 6e 74 20 6e  Idx/2;.    int n
ca50: 52 69 67 68 74 20 3d 20 6e 49 64 78 2d 6e 4c 65  Right = nIdx-nLe
ca60: 66 74 3b 0a 20 20 20 20 69 6e 74 20 2a 61 4c 65  ft;.    int *aLe
ca70: 66 74 20 3d 20 61 49 64 78 3b 0a 20 20 20 20 69  ft = aIdx;.    i
ca80: 6e 74 20 2a 61 52 69 67 68 74 20 3d 20 26 61 49  nt *aRight = &aI
ca90: 64 78 5b 6e 4c 65 66 74 5d 3b 0a 0a 20 20 20 20  dx[nLeft];..    
caa0: 53 6f 72 74 42 79 44 69 73 74 61 6e 63 65 28 61  SortByDistance(a
cab0: 4c 65 66 74 2c 20 6e 4c 65 66 74 2c 20 61 44 69  Left, nLeft, aDi
cac0: 73 74 61 6e 63 65 2c 20 61 53 70 61 72 65 29 3b  stance, aSpare);
cad0: 0a 20 20 20 20 53 6f 72 74 42 79 44 69 73 74 61  .    SortByDista
cae0: 6e 63 65 28 61 52 69 67 68 74 2c 20 6e 52 69 67  nce(aRight, nRig
caf0: 68 74 2c 20 61 44 69 73 74 61 6e 63 65 2c 20 61  ht, aDistance, a
cb00: 53 70 61 72 65 29 3b 0a 0a 20 20 20 20 6d 65 6d  Spare);..    mem
cb10: 63 70 79 28 61 53 70 61 72 65 2c 20 61 4c 65 66  cpy(aSpare, aLef
cb20: 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e  t, sizeof(int)*n
cb30: 4c 65 66 74 29 3b 0a 20 20 20 20 61 4c 65 66 74  Left);.    aLeft
cb40: 20 3d 20 61 53 70 61 72 65 3b 0a 0a 20 20 20 20   = aSpare;..    
cb50: 77 68 69 6c 65 28 20 69 4c 65 66 74 3c 6e 4c 65  while( iLeft<nLe
cb60: 66 74 20 7c 7c 20 69 52 69 67 68 74 3c 6e 52 69  ft || iRight<nRi
cb70: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ght ){.      if(
cb80: 20 69 4c 65 66 74 3d 3d 6e 4c 65 66 74 20 29 7b   iLeft==nLeft ){
cb90: 0a 20 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c  .        aIdx[iL
cba0: 65 66 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 52  eft+iRight] = aR
cbb0: 69 67 68 74 5b 69 52 69 67 68 74 5d 3b 0a 20 20  ight[iRight];.  
cbc0: 20 20 20 20 20 20 69 52 69 67 68 74 2b 2b 3b 0a        iRight++;.
cbd0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
cbe0: 69 52 69 67 68 74 3d 3d 6e 52 69 67 68 74 20 29  iRight==nRight )
cbf0: 7b 0a 20 20 20 20 20 20 20 20 61 49 64 78 5b 69  {.        aIdx[i
cc00: 4c 65 66 74 2b 69 52 69 67 68 74 5d 20 3d 20 61  Left+iRight] = a
cc10: 4c 65 66 74 5b 69 4c 65 66 74 5d 3b 0a 20 20 20  Left[iLeft];.   
cc20: 20 20 20 20 20 69 4c 65 66 74 2b 2b 3b 0a 20 20       iLeft++;.  
cc30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cc40: 20 20 20 66 6c 6f 61 74 20 66 4c 65 66 74 20 3d     float fLeft =
cc50: 20 61 44 69 73 74 61 6e 63 65 5b 61 4c 65 66 74   aDistance[aLeft
cc60: 5b 69 4c 65 66 74 5d 5d 3b 0a 20 20 20 20 20 20  [iLeft]];.      
cc70: 20 20 66 6c 6f 61 74 20 66 52 69 67 68 74 20 3d    float fRight =
cc80: 20 61 44 69 73 74 61 6e 63 65 5b 61 52 69 67 68   aDistance[aRigh
cc90: 74 5b 69 52 69 67 68 74 5d 5d 3b 0a 20 20 20 20  t[iRight]];.    
cca0: 20 20 20 20 69 66 28 20 66 4c 65 66 74 3c 66 52      if( fLeft<fR
ccb0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
ccc0: 20 20 61 49 64 78 5b 69 4c 65 66 74 2b 69 52 69    aIdx[iLeft+iRi
ccd0: 67 68 74 5d 20 3d 20 61 4c 65 66 74 5b 69 4c 65  ght] = aLeft[iLe
cce0: 66 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ft];.          i
ccf0: 4c 65 66 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Left++;.        
cd00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
cd10: 20 61 49 64 78 5b 69 4c 65 66 74 2b 69 52 69 67   aIdx[iLeft+iRig
cd20: 68 74 5d 20 3d 20 61 52 69 67 68 74 5b 69 52 69  ht] = aRight[iRi
cd30: 67 68 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  ght];.          
cd40: 69 52 69 67 68 74 2b 2b 3b 0a 20 20 20 20 20 20  iRight++;.      
cd50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
cd60: 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20  }..#if 0.    /* 
cd70: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 73  Check that the s
cd80: 6f 72 74 20 77 6f 72 6b 65 64 20 2a 2f 0a 20 20  ort worked */.  
cd90: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a    {.      int jj
cda0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31  ;.      for(jj=1
cdb0: 3b 20 6a 6a 3c 6e 49 64 78 3b 20 6a 6a 2b 2b 29  ; jj<nIdx; jj++)
cdc0: 7b 0a 20 20 20 20 20 20 20 20 66 6c 6f 61 74 20  {.        float 
cdd0: 6c 65 66 74 20 3d 20 61 44 69 73 74 61 6e 63 65  left = aDistance
cde0: 5b 61 49 64 78 5b 6a 6a 2d 31 5d 5d 3b 0a 20 20  [aIdx[jj-1]];.  
cdf0: 20 20 20 20 20 20 66 6c 6f 61 74 20 72 69 67 68        float righ
ce00: 74 20 3d 20 61 44 69 73 74 61 6e 63 65 5b 61 49  t = aDistance[aI
ce10: 64 78 5b 6a 6a 5d 5d 3b 0a 20 20 20 20 20 20 20  dx[jj]];.       
ce20: 20 61 73 73 65 72 74 28 20 6c 65 66 74 3c 3d 72   assert( left<=r
ce30: 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  ight );.      }.
ce40: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
ce50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
ce60: 6e 74 73 20 61 49 64 78 2c 20 61 43 65 6c 6c 20  nts aIdx, aCell 
ce70: 61 6e 64 20 61 53 70 61 72 65 20 61 6c 6c 20 70  and aSpare all p
ce80: 6f 69 6e 74 20 74 6f 20 61 72 72 61 79 73 20 6f  oint to arrays o
ce90: 66 20 73 69 7a 65 0a 2a 2a 20 6e 49 64 78 2e 20  f size.** nIdx. 
cea0: 54 68 65 20 61 49 64 78 20 61 72 72 61 79 20 63  The aIdx array c
ceb0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 65 74 20  ontains the set 
cec0: 6f 66 20 69 6e 74 65 67 65 72 73 20 66 72 6f 6d  of integers from
ced0: 20 30 20 74 6f 20 0a 2a 2a 20 28 6e 49 64 78 2d   0 to .** (nIdx-
cee0: 31 29 20 69 6e 20 6e 6f 20 70 61 72 74 69 63 75  1) in no particu
cef0: 6c 61 72 20 6f 72 64 65 72 2e 20 54 68 69 73 20  lar order. This 
cf00: 66 75 6e 63 74 69 6f 6e 20 73 6f 72 74 73 20 74  function sorts t
cf10: 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20 69 6e 20  he values.** in 
cf20: 61 49 64 78 20 61 63 63 6f 72 64 69 6e 67 20 74  aIdx according t
cf30: 6f 20 64 69 6d 65 6e 73 69 6f 6e 20 69 44 69 6d  o dimension iDim
cf40: 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e   of the cells in
cf50: 20 61 43 65 6c 6c 2e 20 54 68 65 0a 2a 2a 20 6d   aCell. The.** m
cf60: 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
cf70: 64 69 6d 65 6e 73 69 6f 6e 20 69 44 69 6d 20 69  dimension iDim i
cf80: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 66 69 72  s considered fir
cf90: 73 74 2c 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  st, the.** maxim
cfa0: 75 6d 20 75 73 65 64 20 74 6f 20 62 72 65 61 6b  um used to break
cfb0: 20 74 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   ties..**.** The
cfc0: 20 61 53 70 61 72 65 20 61 72 72 61 79 20 69 73   aSpare array is
cfd0: 20 75 73 65 64 20 61 73 20 74 65 6d 70 6f 72 61   used as tempora
cfe0: 72 79 20 77 6f 72 6b 69 6e 67 20 73 70 61 63 65  ry working space
cff0: 20 62 79 20 74 68 65 0a 2a 2a 20 73 6f 72 74 69   by the.** sorti
d000: 6e 67 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2f  ng algorithm..*/
d010: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 6f 72  .static void Sor
d020: 74 42 79 44 69 6d 65 6e 73 69 6f 6e 28 0a 20 20  tByDimension(.  
d030: 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 0a 20  Rtree *pRtree,. 
d040: 20 69 6e 74 20 2a 61 49 64 78 2c 20 0a 20 20 69   int *aIdx, .  i
d050: 6e 74 20 6e 49 64 78 2c 20 0a 20 20 69 6e 74 20  nt nIdx, .  int 
d060: 69 44 69 6d 2c 20 0a 20 20 52 74 72 65 65 43 65  iDim, .  RtreeCe
d070: 6c 6c 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e  ll *aCell, .  in
d080: 74 20 2a 61 53 70 61 72 65 0a 29 7b 0a 20 20 69  t *aSpare.){.  i
d090: 66 28 20 6e 49 64 78 3e 31 20 29 7b 0a 0a 20 20  f( nIdx>1 ){..  
d0a0: 20 20 69 6e 74 20 69 4c 65 66 74 20 3d 20 30 3b    int iLeft = 0;
d0b0: 0a 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 20  .    int iRight 
d0c0: 3d 20 30 3b 0a 0a 20 20 20 20 69 6e 74 20 6e 4c  = 0;..    int nL
d0d0: 65 66 74 20 3d 20 6e 49 64 78 2f 32 3b 0a 20 20  eft = nIdx/2;.  
d0e0: 20 20 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 6e    int nRight = n
d0f0: 49 64 78 2d 6e 4c 65 66 74 3b 0a 20 20 20 20 69  Idx-nLeft;.    i
d100: 6e 74 20 2a 61 4c 65 66 74 20 3d 20 61 49 64 78  nt *aLeft = aIdx
d110: 3b 0a 20 20 20 20 69 6e 74 20 2a 61 52 69 67 68  ;.    int *aRigh
d120: 74 20 3d 20 26 61 49 64 78 5b 6e 4c 65 66 74 5d  t = &aIdx[nLeft]
d130: 3b 0a 0a 20 20 20 20 53 6f 72 74 42 79 44 69 6d  ;..    SortByDim
d140: 65 6e 73 69 6f 6e 28 70 52 74 72 65 65 2c 20 61  ension(pRtree, a
d150: 4c 65 66 74 2c 20 6e 4c 65 66 74 2c 20 69 44 69  Left, nLeft, iDi
d160: 6d 2c 20 61 43 65 6c 6c 2c 20 61 53 70 61 72 65  m, aCell, aSpare
d170: 29 3b 0a 20 20 20 20 53 6f 72 74 42 79 44 69 6d  );.    SortByDim
d180: 65 6e 73 69 6f 6e 28 70 52 74 72 65 65 2c 20 61  ension(pRtree, a
d190: 52 69 67 68 74 2c 20 6e 52 69 67 68 74 2c 20 69  Right, nRight, i
d1a0: 44 69 6d 2c 20 61 43 65 6c 6c 2c 20 61 53 70 61  Dim, aCell, aSpa
d1b0: 72 65 29 3b 0a 0a 20 20 20 20 6d 65 6d 63 70 79  re);..    memcpy
d1c0: 28 61 53 70 61 72 65 2c 20 61 4c 65 66 74 2c 20  (aSpare, aLeft, 
d1d0: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4c 65 66  sizeof(int)*nLef
d1e0: 74 29 3b 0a 20 20 20 20 61 4c 65 66 74 20 3d 20  t);.    aLeft = 
d1f0: 61 53 70 61 72 65 3b 0a 20 20 20 20 77 68 69 6c  aSpare;.    whil
d200: 65 28 20 69 4c 65 66 74 3c 6e 4c 65 66 74 20 7c  e( iLeft<nLeft |
d210: 7c 20 69 52 69 67 68 74 3c 6e 52 69 67 68 74 20  | iRight<nRight 
d220: 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  ){.      double 
d230: 78 6c 65 66 74 31 20 3d 20 44 43 4f 4f 52 44 28  xleft1 = DCOORD(
d240: 61 43 65 6c 6c 5b 61 4c 65 66 74 5b 69 4c 65 66  aCell[aLeft[iLef
d250: 74 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a  t]].aCoord[iDim*
d260: 32 5d 29 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  2]);.      doubl
d270: 65 20 78 6c 65 66 74 32 20 3d 20 44 43 4f 4f 52  e xleft2 = DCOOR
d280: 44 28 61 43 65 6c 6c 5b 61 4c 65 66 74 5b 69 4c  D(aCell[aLeft[iL
d290: 65 66 74 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69  eft]].aCoord[iDi
d2a0: 6d 2a 32 2b 31 5d 29 3b 0a 20 20 20 20 20 20 64  m*2+1]);.      d
d2b0: 6f 75 62 6c 65 20 78 72 69 67 68 74 31 20 3d 20  ouble xright1 = 
d2c0: 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 61 52 69  DCOORD(aCell[aRi
d2d0: 67 68 74 5b 69 52 69 67 68 74 5d 5d 2e 61 43 6f  ght[iRight]].aCo
d2e0: 6f 72 64 5b 69 44 69 6d 2a 32 5d 29 3b 0a 20 20  ord[iDim*2]);.  
d2f0: 20 20 20 20 64 6f 75 62 6c 65 20 78 72 69 67 68      double xrigh
d300: 74 32 20 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c  t2 = DCOORD(aCel
d310: 6c 5b 61 52 69 67 68 74 5b 69 52 69 67 68 74 5d  l[aRight[iRight]
d320: 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 2b  ].aCoord[iDim*2+
d330: 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  1]);.      if( (
d340: 69 4c 65 66 74 21 3d 6e 4c 65 66 74 29 20 26 26  iLeft!=nLeft) &&
d350: 20 28 28 69 52 69 67 68 74 3d 3d 6e 52 69 67 68   ((iRight==nRigh
d360: 74 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 78 6c  t).       || (xl
d370: 65 66 74 31 3c 78 72 69 67 68 74 31 29 0a 20 20  eft1<xright1).  
d380: 20 20 20 20 20 7c 7c 20 28 78 6c 65 66 74 31 3d       || (xleft1=
d390: 3d 78 72 69 67 68 74 31 20 26 26 20 78 6c 65 66  =xright1 && xlef
d3a0: 74 32 3c 78 72 69 67 68 74 32 29 0a 20 20 20 20  t2<xright2).    
d3b0: 20 20 29 29 7b 0a 20 20 20 20 20 20 20 20 61 49    )){.        aI
d3c0: 64 78 5b 69 4c 65 66 74 2b 69 52 69 67 68 74 5d  dx[iLeft+iRight]
d3d0: 20 3d 20 61 4c 65 66 74 5b 69 4c 65 66 74 5d 3b   = aLeft[iLeft];
d3e0: 0a 20 20 20 20 20 20 20 20 69 4c 65 66 74 2b 2b  .        iLeft++
d3f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d400: 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c 65 66         aIdx[iLef
d410: 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 52 69 67  t+iRight] = aRig
d420: 68 74 5b 69 52 69 67 68 74 5d 3b 0a 20 20 20 20  ht[iRight];.    
d430: 20 20 20 20 69 52 69 67 68 74 2b 2b 3b 0a 20 20      iRight++;.  
d440: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
d450: 20 30 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20   0.    /* Check 
d460: 74 68 61 74 20 74 68 65 20 73 6f 72 74 20 77 6f  that the sort wo
d470: 72 6b 65 64 20 2a 2f 0a 20 20 20 20 7b 0a 20 20  rked */.    {.  
d480: 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20      int jj;.    
d490: 20 20 66 6f 72 28 6a 6a 3d 31 3b 20 6a 6a 3c 6e    for(jj=1; jj<n
d4a0: 49 64 78 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Idx; jj++){.    
d4b0: 20 20 20 20 66 6c 6f 61 74 20 78 6c 65 66 74 31      float xleft1
d4c0: 20 3d 20 61 43 65 6c 6c 5b 61 49 64 78 5b 6a 6a   = aCell[aIdx[jj
d4d0: 2d 31 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d  -1]].aCoord[iDim
d4e0: 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 66 6c 6f  *2];.        flo
d4f0: 61 74 20 78 6c 65 66 74 32 20 3d 20 61 43 65 6c  at xleft2 = aCel
d500: 6c 5b 61 49 64 78 5b 6a 6a 2d 31 5d 5d 2e 61 43  l[aIdx[jj-1]].aC
d510: 6f 6f 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 3b 0a  oord[iDim*2+1];.
d520: 20 20 20 20 20 20 20 20 66 6c 6f 61 74 20 78 72          float xr
d530: 69 67 68 74 31 20 3d 20 61 43 65 6c 6c 5b 61 49  ight1 = aCell[aI
d540: 64 78 5b 6a 6a 5d 5d 2e 61 43 6f 6f 72 64 5b 69  dx[jj]].aCoord[i
d550: 44 69 6d 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20  Dim*2];.        
d560: 66 6c 6f 61 74 20 78 72 69 67 68 74 32 20 3d 20  float xright2 = 
d570: 61 43 65 6c 6c 5b 61 49 64 78 5b 6a 6a 5d 5d 2e  aCell[aIdx[jj]].
d580: 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 2b 31 5d  aCoord[iDim*2+1]
d590: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d5a0: 28 20 78 6c 65 66 74 31 3c 3d 78 72 69 67 68 74  ( xleft1<=xright
d5b0: 31 20 26 26 20 28 78 6c 65 66 74 31 3c 78 72 69  1 && (xleft1<xri
d5c0: 67 68 74 31 20 7c 7c 20 78 6c 65 66 74 32 3c 3d  ght1 || xleft2<=
d5d0: 78 72 69 67 68 74 32 29 20 29 3b 0a 20 20 20 20  xright2) );.    
d5e0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
d5f0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 56 41 52 49  .  }.}..#if VARI
d600: 41 4e 54 5f 52 53 54 41 52 54 52 45 45 5f 53 50  ANT_RSTARTREE_SP
d610: 4c 49 54 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  LIT./*.** Implem
d620: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
d630: 52 2a 2d 74 72 65 65 20 76 61 72 69 61 6e 74 20  R*-tree variant 
d640: 6f 66 20 53 70 6c 69 74 4e 6f 64 65 20 66 72 6f  of SplitNode fro
d650: 6d 20 42 65 63 6b 6d 61 6e 5b 31 39 39 30 5d 2e  m Beckman[1990].
d660: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
d670: 70 6c 69 74 4e 6f 64 65 53 74 61 72 74 72 65 65  plitNodeStartree
d680: 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  (.  Rtree *pRtre
d690: 65 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a  e,.  RtreeCell *
d6a0: 61 43 65 6c 6c 2c 0a 20 20 69 6e 74 20 6e 43 65  aCell,.  int nCe
d6b0: 6c 6c 2c 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  ll,.  RtreeNode 
d6c0: 2a 70 4c 65 66 74 2c 0a 20 20 52 74 72 65 65 4e  *pLeft,.  RtreeN
d6d0: 6f 64 65 20 2a 70 52 69 67 68 74 2c 0a 20 20 52  ode *pRight,.  R
d6e0: 74 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f 78 4c  treeCell *pBboxL
d6f0: 65 66 74 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c  eft,.  RtreeCell
d700: 20 2a 70 42 62 6f 78 52 69 67 68 74 0a 29 7b 0a   *pBboxRight.){.
d710: 20 20 69 6e 74 20 2a 2a 61 61 53 6f 72 74 65 64    int **aaSorted
d720: 3b 0a 20 20 69 6e 74 20 2a 61 53 70 61 72 65 3b  ;.  int *aSpare;
d730: 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 69 6e  .  int ii;..  in
d740: 74 20 69 42 65 73 74 44 69 6d 20 3d 20 30 3b 0a  t iBestDim = 0;.
d750: 20 20 69 6e 74 20 69 42 65 73 74 53 70 6c 69 74    int iBestSplit
d760: 20 3d 20 30 3b 0a 20 20 66 6c 6f 61 74 20 66 42   = 0;.  float fB
d770: 65 73 74 4d 61 72 67 69 6e 20 3d 20 30 2e 30 3b  estMargin = 0.0;
d780: 0a 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  ..  int nByte = 
d790: 28 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2b 31 29  (pRtree->nDim+1)
d7a0: 2a 28 73 69 7a 65 6f 66 28 69 6e 74 2a 29 2b 6e  *(sizeof(int*)+n
d7b0: 43 65 6c 6c 2a 73 69 7a 65 6f 66 28 69 6e 74 29  Cell*sizeof(int)
d7c0: 29 3b 0a 0a 20 20 61 61 53 6f 72 74 65 64 20 3d  );..  aaSorted =
d7d0: 20 28 69 6e 74 20 2a 2a 29 73 71 6c 69 74 65 33   (int **)sqlite3
d7e0: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
d7f0: 20 20 69 66 28 20 21 61 61 53 6f 72 74 65 64 20    if( !aaSorted 
d800: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d810: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
d820: 0a 20 20 61 53 70 61 72 65 20 3d 20 26 28 28 69  .  aSpare = &((i
d830: 6e 74 20 2a 29 26 61 61 53 6f 72 74 65 64 5b 70  nt *)&aaSorted[p
d840: 52 74 72 65 65 2d 3e 6e 44 69 6d 5d 29 5b 70 52  Rtree->nDim])[pR
d850: 74 72 65 65 2d 3e 6e 44 69 6d 2a 6e 43 65 6c 6c  tree->nDim*nCell
d860: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 61 53 6f  ];.  memset(aaSo
d870: 72 74 65 64 2c 20 30 2c 20 6e 42 79 74 65 29 3b  rted, 0, nByte);
d880: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
d890: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3b 20 69 69  pRtree->nDim; ii
d8a0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 3b  ++){.    int jj;
d8b0: 0a 20 20 20 20 61 61 53 6f 72 74 65 64 5b 69 69  .    aaSorted[ii
d8c0: 5d 20 3d 20 26 28 28 69 6e 74 20 2a 29 26 61 61  ] = &((int *)&aa
d8d0: 53 6f 72 74 65 64 5b 70 52 74 72 65 65 2d 3e 6e  Sorted[pRtree->n
d8e0: 44 69 6d 5d 29 5b 69 69 2a 6e 43 65 6c 6c 5d 3b  Dim])[ii*nCell];
d8f0: 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a  .    for(jj=0; j
d900: 6a 3c 6e 43 65 6c 6c 3b 20 6a 6a 2b 2b 29 7b 0a  j<nCell; jj++){.
d910: 20 20 20 20 20 20 61 61 53 6f 72 74 65 64 5b 69        aaSorted[i
d920: 69 5d 5b 6a 6a 5d 20 3d 20 6a 6a 3b 0a 20 20 20  i][jj] = jj;.   
d930: 20 7d 0a 20 20 20 20 53 6f 72 74 42 79 44 69 6d   }.    SortByDim
d940: 65 6e 73 69 6f 6e 28 70 52 74 72 65 65 2c 20 61  ension(pRtree, a
d950: 61 53 6f 72 74 65 64 5b 69 69 5d 2c 20 6e 43 65  aSorted[ii], nCe
d960: 6c 6c 2c 20 69 69 2c 20 61 43 65 6c 6c 2c 20 61  ll, ii, aCell, a
d970: 53 70 61 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 66  Spare);.  }..  f
d980: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 52 74 72  or(ii=0; ii<pRtr
d990: 65 65 2d 3e 6e 44 69 6d 3b 20 69 69 2b 2b 29 7b  ee->nDim; ii++){
d9a0: 0a 20 20 20 20 66 6c 6f 61 74 20 6d 61 72 67 69  .    float margi
d9b0: 6e 20 3d 20 30 2e 30 3b 0a 20 20 20 20 66 6c 6f  n = 0.0;.    flo
d9c0: 61 74 20 66 42 65 73 74 4f 76 65 72 6c 61 70 20  at fBestOverlap 
d9d0: 3d 20 30 2e 30 3b 0a 20 20 20 20 66 6c 6f 61 74  = 0.0;.    float
d9e0: 20 66 42 65 73 74 41 72 65 61 20 3d 20 30 2e 30   fBestArea = 0.0
d9f0: 3b 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c  ;.    int iBestL
da00: 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  eft = 0;.    int
da10: 20 6e 4c 65 66 74 3b 0a 0a 20 20 20 20 66 6f 72   nLeft;..    for
da20: 28 0a 20 20 20 20 20 20 6e 4c 65 66 74 3d 52 54  (.      nLeft=RT
da30: 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52 74  REE_MINCELLS(pRt
da40: 72 65 65 29 3b 20 0a 20 20 20 20 20 20 6e 4c 65  ree); .      nLe
da50: 66 74 3c 3d 28 6e 43 65 6c 6c 2d 52 54 52 45 45  ft<=(nCell-RTREE
da60: 5f 4d 49 4e 43 45 4c 4c 53 28 70 52 74 72 65 65  _MINCELLS(pRtree
da70: 29 29 3b 20 0a 20 20 20 20 20 20 6e 4c 65 66 74  )); .      nLeft
da80: 2b 2b 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ++.    ){.      
da90: 52 74 72 65 65 43 65 6c 6c 20 6c 65 66 74 3b 0a  RtreeCell left;.
daa0: 20 20 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20        RtreeCell 
dab0: 72 69 67 68 74 3b 0a 20 20 20 20 20 20 69 6e 74  right;.      int
dac0: 20 6b 6b 3b 0a 20 20 20 20 20 20 66 6c 6f 61 74   kk;.      float
dad0: 20 6f 76 65 72 6c 61 70 3b 0a 20 20 20 20 20 20   overlap;.      
dae0: 66 6c 6f 61 74 20 61 72 65 61 3b 0a 0a 20 20 20  float area;..   
daf0: 20 20 20 6d 65 6d 63 70 79 28 26 6c 65 66 74 2c     memcpy(&left,
db00: 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64   &aCell[aaSorted
db10: 5b 69 69 5d 5b 30 5d 5d 2c 20 73 69 7a 65 6f 66  [ii][0]], sizeof
db20: 28 52 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20  (RtreeCell));.  
db30: 20 20 20 20 6d 65 6d 63 70 79 28 26 72 69 67 68      memcpy(&righ
db40: 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74  t, &aCell[aaSort
db50: 65 64 5b 69 69 5d 5b 6e 43 65 6c 6c 2d 31 5d 5d  ed[ii][nCell-1]]
db60: 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65  , sizeof(RtreeCe
db70: 6c 6c 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ll));.      for(
db80: 6b 6b 3d 31 3b 20 6b 6b 3c 28 6e 43 65 6c 6c 2d  kk=1; kk<(nCell-
db90: 31 29 3b 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20  1); kk++){.     
dba0: 20 20 20 69 66 28 20 6b 6b 3c 6e 4c 65 66 74 20     if( kk<nLeft 
dbb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 65 6c  ){.          cel
dbc0: 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65 2c 20 26  lUnion(pRtree, &
dbd0: 6c 65 66 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53  left, &aCell[aaS
dbe0: 6f 72 74 65 64 5b 69 69 5d 5b 6b 6b 5d 5d 29 3b  orted[ii][kk]]);
dbf0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
dc00: 20 20 20 20 20 20 20 20 20 20 63 65 6c 6c 55 6e            cellUn
dc10: 69 6f 6e 28 70 52 74 72 65 65 2c 20 26 72 69 67  ion(pRtree, &rig
dc20: 68 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72  ht, &aCell[aaSor
dc30: 74 65 64 5b 69 69 5d 5b 6b 6b 5d 5d 29 3b 0a 20  ted[ii][kk]]);. 
dc40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
dc50: 0a 20 20 20 20 20 20 6d 61 72 67 69 6e 20 2b 3d  .      margin +=
dc60: 20 63 65 6c 6c 4d 61 72 67 69 6e 28 70 52 74 72   cellMargin(pRtr
dc70: 65 65 2c 20 26 6c 65 66 74 29 3b 0a 20 20 20 20  ee, &left);.    
dc80: 20 20 6d 61 72 67 69 6e 20 2b 3d 20 63 65 6c 6c    margin += cell
dc90: 4d 61 72 67 69 6e 28 70 52 74 72 65 65 2c 20 26  Margin(pRtree, &
dca0: 72 69 67 68 74 29 3b 0a 20 20 20 20 20 20 6f 76  right);.      ov
dcb0: 65 72 6c 61 70 20 3d 20 63 65 6c 6c 4f 76 65 72  erlap = cellOver
dcc0: 6c 61 70 28 70 52 74 72 65 65 2c 20 26 6c 65 66  lap(pRtree, &lef
dcd0: 74 2c 20 26 72 69 67 68 74 2c 20 31 2c 20 2d 31  t, &right, 1, -1
dce0: 29 3b 0a 20 20 20 20 20 20 61 72 65 61 20 3d 20  );.      area = 
dcf0: 63 65 6c 6c 41 72 65 61 28 70 52 74 72 65 65 2c  cellArea(pRtree,
dd00: 20 26 6c 65 66 74 29 20 2b 20 63 65 6c 6c 41 72   &left) + cellAr
dd10: 65 61 28 70 52 74 72 65 65 2c 20 26 72 69 67 68  ea(pRtree, &righ
dd20: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e  t);.      if( (n
dd30: 4c 65 66 74 3d 3d 52 54 52 45 45 5f 4d 49 4e 43  Left==RTREE_MINC
dd40: 45 4c 4c 53 28 70 52 74 72 65 65 29 29 0a 20 20  ELLS(pRtree)).  
dd50: 20 20 20 20 20 7c 7c 20 28 6f 76 65 72 6c 61 70       || (overlap
dd60: 3c 66 42 65 73 74 4f 76 65 72 6c 61 70 29 0a 20  <fBestOverlap). 
dd70: 20 20 20 20 20 20 7c 7c 20 28 6f 76 65 72 6c 61        || (overla
dd80: 70 3d 3d 66 42 65 73 74 4f 76 65 72 6c 61 70 20  p==fBestOverlap 
dd90: 26 26 20 61 72 65 61 3c 66 42 65 73 74 41 72 65  && area<fBestAre
dda0: 61 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  a).      ){.    
ddb0: 20 20 20 20 69 42 65 73 74 4c 65 66 74 20 3d 20      iBestLeft = 
ddc0: 6e 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 66  nLeft;.        f
ddd0: 42 65 73 74 4f 76 65 72 6c 61 70 20 3d 20 6f 76  BestOverlap = ov
dde0: 65 72 6c 61 70 3b 0a 20 20 20 20 20 20 20 20 66  erlap;.        f
ddf0: 42 65 73 74 41 72 65 61 20 3d 20 61 72 65 61 3b  BestArea = area;
de00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
de10: 20 20 20 20 69 66 28 20 69 69 3d 3d 30 20 7c 7c      if( ii==0 ||
de20: 20 6d 61 72 67 69 6e 3c 66 42 65 73 74 4d 61 72   margin<fBestMar
de30: 67 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 42 65  gin ){.      iBe
de40: 73 74 44 69 6d 20 3d 20 69 69 3b 0a 20 20 20 20  stDim = ii;.    
de50: 20 20 66 42 65 73 74 4d 61 72 67 69 6e 20 3d 20    fBestMargin = 
de60: 6d 61 72 67 69 6e 3b 0a 20 20 20 20 20 20 69 42  margin;.      iB
de70: 65 73 74 53 70 6c 69 74 20 3d 20 69 42 65 73 74  estSplit = iBest
de80: 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Left;.    }.  }.
de90: 0a 20 20 6d 65 6d 63 70 79 28 70 42 62 6f 78 4c  .  memcpy(pBboxL
dea0: 65 66 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53 6f  eft, &aCell[aaSo
deb0: 72 74 65 64 5b 69 42 65 73 74 44 69 6d 5d 5b 30  rted[iBestDim][0
dec0: 5d 5d 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65  ]], sizeof(Rtree
ded0: 43 65 6c 6c 29 29 3b 0a 20 20 6d 65 6d 63 70 79  Cell));.  memcpy
dee0: 28 70 42 62 6f 78 52 69 67 68 74 2c 20 26 61 43  (pBboxRight, &aC
def0: 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69 42 65  ell[aaSorted[iBe
df00: 73 74 44 69 6d 5d 5b 69 42 65 73 74 53 70 6c 69  stDim][iBestSpli
df10: 74 5d 5d 2c 20 73 69 7a 65 6f 66 28 52 74 72 65  t]], sizeof(Rtre
df20: 65 43 65 6c 6c 29 29 3b 0a 20 20 66 6f 72 28 69  eCell));.  for(i
df30: 69 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69  i=0; ii<nCell; i
df40: 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65 4e  i++){.    RtreeN
df50: 6f 64 65 20 2a 70 54 61 72 67 65 74 20 3d 20 28  ode *pTarget = (
df60: 69 69 3c 69 42 65 73 74 53 70 6c 69 74 29 3f 70  ii<iBestSplit)?p
df70: 4c 65 66 74 3a 70 52 69 67 68 74 3b 0a 20 20 20  Left:pRight;.   
df80: 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f   RtreeCell *pBbo
df90: 78 20 3d 20 28 69 69 3c 69 42 65 73 74 53 70 6c  x = (ii<iBestSpl
dfa0: 69 74 29 3f 70 42 62 6f 78 4c 65 66 74 3a 70 42  it)?pBboxLeft:pB
dfb0: 62 6f 78 52 69 67 68 74 3b 0a 20 20 20 20 52 74  boxRight;.    Rt
dfc0: 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 20 3d  reeCell *pCell =
dfd0: 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64   &aCell[aaSorted
dfe0: 5b 69 42 65 73 74 44 69 6d 5d 5b 69 69 5d 5d 3b  [iBestDim][ii]];
dff0: 0a 20 20 20 20 6e 6f 64 65 49 6e 73 65 72 74 43  .    nodeInsertC
e000: 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 54 61 72  ell(pRtree, pTar
e010: 67 65 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  get, pCell);.   
e020: 20 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65   cellUnion(pRtre
e030: 65 2c 20 70 42 62 6f 78 2c 20 70 43 65 6c 6c 29  e, pBbox, pCell)
e040: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
e050: 5f 66 72 65 65 28 61 61 53 6f 72 74 65 64 29 3b  _free(aaSorted);
e060: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e070: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
e080: 69 66 20 56 41 52 49 41 4e 54 5f 47 55 54 54 4d  if VARIANT_GUTTM
e090: 41 4e 5f 53 50 4c 49 54 0a 2f 2a 0a 2a 2a 20 49  AN_SPLIT./*.** I
e0a0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
e0b0: 20 74 68 65 20 72 65 67 75 6c 61 72 20 52 2d 74   the regular R-t
e0c0: 72 65 65 20 53 70 6c 69 74 4e 6f 64 65 20 66 72  ree SplitNode fr
e0d0: 6f 6d 20 47 75 74 74 6d 61 6e 5b 31 39 38 34 5d  om Guttman[1984]
e0e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e0f0: 73 70 6c 69 74 4e 6f 64 65 47 75 74 74 6d 61 6e  splitNodeGuttman
e100: 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  (.  Rtree *pRtre
e110: 65 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a  e,.  RtreeCell *
e120: 61 43 65 6c 6c 2c 0a 20 20 69 6e 74 20 6e 43 65  aCell,.  int nCe
e130: 6c 6c 2c 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  ll,.  RtreeNode 
e140: 2a 70 4c 65 66 74 2c 0a 20 20 52 74 72 65 65 4e  *pLeft,.  RtreeN
e150: 6f 64 65 20 2a 70 52 69 67 68 74 2c 0a 20 20 52  ode *pRight,.  R
e160: 74 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f 78 4c  treeCell *pBboxL
e170: 65 66 74 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c  eft,.  RtreeCell
e180: 20 2a 70 42 62 6f 78 52 69 67 68 74 0a 29 7b 0a   *pBboxRight.){.
e190: 20 20 69 6e 74 20 69 4c 65 66 74 53 65 65 64 20    int iLeftSeed 
e1a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 52 69 67 68  = 0;.  int iRigh
e1b0: 74 53 65 65 64 20 3d 20 31 3b 0a 20 20 69 6e 74  tSeed = 1;.  int
e1c0: 20 2a 61 69 55 73 65 64 3b 0a 20 20 69 6e 74 20   *aiUsed;.  int 
e1d0: 69 3b 0a 0a 20 20 61 69 55 73 65 64 20 3d 20 73  i;..  aiUsed = s
e1e0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
e1f0: 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 65 6c 6c 29  zeof(int)*nCell)
e200: 3b 0a 20 20 69 66 28 20 21 61 69 55 73 65 64 20  ;.  if( !aiUsed 
e210: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e220: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
e230: 20 20 6d 65 6d 73 65 74 28 61 69 55 73 65 64 2c    memset(aiUsed,
e240: 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a   0, sizeof(int)*
e250: 6e 43 65 6c 6c 29 3b 0a 0a 20 20 50 69 63 6b 53  nCell);..  PickS
e260: 65 65 64 73 28 70 52 74 72 65 65 2c 20 61 43 65  eeds(pRtree, aCe
e270: 6c 6c 2c 20 6e 43 65 6c 6c 2c 20 26 69 4c 65 66  ll, nCell, &iLef
e280: 74 53 65 65 64 2c 20 26 69 52 69 67 68 74 53 65  tSeed, &iRightSe
e290: 65 64 29 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 70  ed);..  memcpy(p
e2a0: 42 62 6f 78 4c 65 66 74 2c 20 26 61 43 65 6c 6c  BboxLeft, &aCell
e2b0: 5b 69 4c 65 66 74 53 65 65 64 5d 2c 20 73 69 7a  [iLeftSeed], siz
e2c0: 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29 29 3b  eof(RtreeCell));
e2d0: 0a 20 20 6d 65 6d 63 70 79 28 70 42 62 6f 78 52  .  memcpy(pBboxR
e2e0: 69 67 68 74 2c 20 26 61 43 65 6c 6c 5b 69 52 69  ight, &aCell[iRi
e2f0: 67 68 74 53 65 65 64 5d 2c 20 73 69 7a 65 6f 66  ghtSeed], sizeof
e300: 28 52 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20  (RtreeCell));.  
e310: 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c 28 70  nodeInsertCell(p
e320: 52 74 72 65 65 2c 20 70 4c 65 66 74 2c 20 26 61  Rtree, pLeft, &a
e330: 43 65 6c 6c 5b 69 4c 65 66 74 53 65 65 64 5d 29  Cell[iLeftSeed])
e340: 3b 0a 20 20 6e 6f 64 65 49 6e 73 65 72 74 43 65  ;.  nodeInsertCe
e350: 6c 6c 28 70 52 74 72 65 65 2c 20 70 52 69 67 68  ll(pRtree, pRigh
e360: 74 2c 20 26 61 43 65 6c 6c 5b 69 52 69 67 68 74  t, &aCell[iRight
e370: 53 65 65 64 5d 29 3b 0a 20 20 61 69 55 73 65 64  Seed]);.  aiUsed
e380: 5b 69 4c 65 66 74 53 65 65 64 5d 20 3d 20 31 3b  [iLeftSeed] = 1;
e390: 0a 20 20 61 69 55 73 65 64 5b 69 52 69 67 68 74  .  aiUsed[iRight
e3a0: 53 65 65 64 5d 20 3d 20 31 3b 0a 0a 20 20 66 6f  Seed] = 1;..  fo
e3b0: 72 28 69 3d 6e 43 65 6c 6c 2d 32 3b 20 69 3e 30  r(i=nCell-2; i>0
e3c0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 52 74 72 65  ; i--){.    Rtre
e3d0: 65 43 65 6c 6c 20 2a 70 4e 65 78 74 3b 0a 20 20  eCell *pNext;.  
e3e0: 20 20 70 4e 65 78 74 20 3d 20 50 69 63 6b 4e 65    pNext = PickNe
e3f0: 78 74 28 70 52 74 72 65 65 2c 20 61 43 65 6c 6c  xt(pRtree, aCell
e400: 2c 20 6e 43 65 6c 6c 2c 20 70 42 62 6f 78 4c 65  , nCell, pBboxLe
e410: 66 74 2c 20 70 42 62 6f 78 52 69 67 68 74 2c 20  ft, pBboxRight, 
e420: 61 69 55 73 65 64 29 3b 0a 20 20 20 20 66 6c 6f  aiUsed);.    flo
e430: 61 74 20 64 69 66 66 20 3d 20 20 0a 20 20 20 20  at diff =  .    
e440: 20 20 63 65 6c 6c 47 72 6f 77 74 68 28 70 52 74    cellGrowth(pRt
e450: 72 65 65 2c 20 70 42 62 6f 78 4c 65 66 74 2c 20  ree, pBboxLeft, 
e460: 70 4e 65 78 74 29 20 2d 20 0a 20 20 20 20 20 20  pNext) - .      
e470: 63 65 6c 6c 47 72 6f 77 74 68 28 70 52 74 72 65  cellGrowth(pRtre
e480: 65 2c 20 70 42 62 6f 78 52 69 67 68 74 2c 20 70  e, pBboxRight, p
e490: 4e 65 78 74 29 0a 20 20 20 20 3b 0a 20 20 20 20  Next).    ;.    
e4a0: 69 66 28 20 28 52 54 52 45 45 5f 4d 49 4e 43 45  if( (RTREE_MINCE
e4b0: 4c 4c 53 28 70 52 74 72 65 65 29 2d 4e 43 45 4c  LLS(pRtree)-NCEL
e4c0: 4c 28 70 52 69 67 68 74 29 3d 3d 69 29 0a 20 20  L(pRight)==i).  
e4d0: 20 20 20 7c 7c 20 28 64 69 66 66 3e 30 2e 30 20     || (diff>0.0 
e4e0: 26 26 20 28 52 54 52 45 45 5f 4d 49 4e 43 45 4c  && (RTREE_MINCEL
e4f0: 4c 53 28 70 52 74 72 65 65 29 2d 4e 43 45 4c 4c  LS(pRtree)-NCELL
e500: 28 70 4c 65 66 74 29 21 3d 69 29 29 0a 20 20 20  (pLeft)!=i)).   
e510: 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65 49 6e   ){.      nodeIn
e520: 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65 2c  sertCell(pRtree,
e530: 20 70 52 69 67 68 74 2c 20 70 4e 65 78 74 29 3b   pRight, pNext);
e540: 0a 20 20 20 20 20 20 63 65 6c 6c 55 6e 69 6f 6e  .      cellUnion
e550: 28 70 52 74 72 65 65 2c 20 70 42 62 6f 78 52 69  (pRtree, pBboxRi
e560: 67 68 74 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20  ght, pNext);.   
e570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 6f   }else{.      no
e580: 64 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74  deInsertCell(pRt
e590: 72 65 65 2c 20 70 4c 65 66 74 2c 20 70 4e 65 78  ree, pLeft, pNex
e5a0: 74 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 55 6e  t);.      cellUn
e5b0: 69 6f 6e 28 70 52 74 72 65 65 2c 20 70 42 62 6f  ion(pRtree, pBbo
e5c0: 78 4c 65 66 74 2c 20 70 4e 65 78 74 29 3b 0a 20  xLeft, pNext);. 
e5d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
e5e0: 74 65 33 5f 66 72 65 65 28 61 69 55 73 65 64 29  te3_free(aiUsed)
e5f0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e600: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
e610: 73 74 61 74 69 63 20 69 6e 74 20 75 70 64 61 74  static int updat
e620: 65 4d 61 70 70 69 6e 67 28 0a 20 20 52 74 72 65  eMapping(.  Rtre
e630: 65 20 2a 70 52 74 72 65 65 2c 20 0a 20 20 69 36  e *pRtree, .  i6
e640: 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 52 74 72  4 iRowid, .  Rtr
e650: 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 0a  eeNode *pNode, .
e660: 20 20 69 6e 74 20 69 48 65 69 67 68 74 0a 29 7b    int iHeight.){
e670: 0a 20 20 69 6e 74 20 28 2a 78 53 65 74 4d 61 70  .  int (*xSetMap
e680: 70 69 6e 67 29 28 52 74 72 65 65 20 2a 2c 20 73  ping)(Rtree *, s
e690: 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 20 73 71  qlite3_int64, sq
e6a0: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
e6b0: 78 53 65 74 4d 61 70 70 69 6e 67 20 3d 20 28 28  xSetMapping = ((
e6c0: 69 48 65 69 67 68 74 3d 3d 30 29 3f 72 6f 77 69  iHeight==0)?rowi
e6d0: 64 57 72 69 74 65 3a 70 61 72 65 6e 74 57 72 69  dWrite:parentWri
e6e0: 74 65 29 3b 0a 20 20 69 66 28 20 69 48 65 69 67  te);.  if( iHeig
e6f0: 68 74 3e 30 20 29 7b 0a 20 20 20 20 52 74 72 65  ht>0 ){.    Rtre
e700: 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20 3d 20  eNode *pChild = 
e710: 6e 6f 64 65 48 61 73 68 4c 6f 6f 6b 75 70 28 70  nodeHashLookup(p
e720: 52 74 72 65 65 2c 20 69 52 6f 77 69 64 29 3b 0a  Rtree, iRowid);.
e730: 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 20 29      if( pChild )
e740: 7b 0a 20 20 20 20 20 20 6e 6f 64 65 52 65 6c 65  {.      nodeRele
e750: 61 73 65 28 70 52 74 72 65 65 2c 20 70 43 68 69  ase(pRtree, pChi
e760: 6c 64 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  ld->pParent);.  
e770: 20 20 20 20 6e 6f 64 65 52 65 66 65 72 65 6e 63      nodeReferenc
e780: 65 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  e(pNode);.      
e790: 70 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 20  pChild->pParent 
e7a0: 3d 20 70 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a 20  = pNode;.    }. 
e7b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 78 53 65 74   }.  return xSet
e7c0: 4d 61 70 70 69 6e 67 28 70 52 74 72 65 65 2c 20  Mapping(pRtree, 
e7d0: 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65 2d 3e 69  iRowid, pNode->i
e7e0: 4e 6f 64 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Node);.}..static
e7f0: 20 69 6e 74 20 53 70 6c 69 74 4e 6f 64 65 28 0a   int SplitNode(.
e800: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
e810: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e  .  RtreeNode *pN
e820: 6f 64 65 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c  ode,.  RtreeCell
e830: 20 2a 70 43 65 6c 6c 2c 0a 20 20 69 6e 74 20 69   *pCell,.  int i
e840: 48 65 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20  Height.){.  int 
e850: 69 3b 0a 20 20 69 6e 74 20 6e 65 77 43 65 6c 6c  i;.  int newCell
e860: 49 73 52 69 67 68 74 20 3d 20 30 3b 0a 0a 20 20  IsRight = 0;..  
e870: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e880: 4f 4b 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20  OK;.  int nCell 
e890: 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a  = NCELL(pNode);.
e8a0: 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61 43 65    RtreeCell *aCe
e8b0: 6c 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 55 73 65  ll;.  int *aiUse
e8c0: 64 3b 0a 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  d;..  RtreeNode 
e8d0: 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 52 74  *pLeft = 0;.  Rt
e8e0: 72 65 65 4e 6f 64 65 20 2a 70 52 69 67 68 74 20  reeNode *pRight 
e8f0: 3d 20 30 3b 0a 0a 20 20 52 74 72 65 65 43 65 6c  = 0;..  RtreeCel
e900: 6c 20 6c 65 66 74 62 62 6f 78 3b 0a 20 20 52 74  l leftbbox;.  Rt
e910: 72 65 65 43 65 6c 6c 20 72 69 67 68 74 62 62 6f  reeCell rightbbo
e920: 78 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  x;..  /* Allocat
e930: 65 20 61 6e 20 61 72 72 61 79 20 61 6e 64 20 70  e an array and p
e940: 6f 70 75 6c 61 74 65 20 69 74 20 77 69 74 68 20  opulate it with 
e950: 61 20 63 6f 70 79 20 6f 66 20 70 43 65 6c 6c 20  a copy of pCell 
e960: 61 6e 64 20 0a 20 20 2a 2a 20 61 6c 6c 20 63 65  and .  ** all ce
e970: 6c 6c 73 20 66 72 6f 6d 20 6e 6f 64 65 20 70 4c  lls from node pL
e980: 65 66 74 2e 20 54 68 65 6e 20 7a 65 72 6f 20 74  eft. Then zero t
e990: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6e 6f 64 65  he original node
e9a0: 2e 0a 20 20 2a 2f 0a 20 20 61 43 65 6c 6c 20 3d  ..  */.  aCell =
e9b0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
e9c0: 28 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c  (sizeof(RtreeCel
e9d0: 6c 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 2a  l)+sizeof(int))*
e9e0: 28 6e 43 65 6c 6c 2b 31 29 29 3b 0a 20 20 69 66  (nCell+1));.  if
e9f0: 28 20 21 61 43 65 6c 6c 20 29 7b 0a 20 20 20 20  ( !aCell ){.    
ea00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
ea10: 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 73 70 6c 69  M;.    goto spli
ea20: 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  tnode_out;.  }. 
ea30: 20 61 69 55 73 65 64 20 3d 20 28 69 6e 74 20 2a   aiUsed = (int *
ea40: 29 26 61 43 65 6c 6c 5b 6e 43 65 6c 6c 2b 31 5d  )&aCell[nCell+1]
ea50: 3b 0a 20 20 6d 65 6d 73 65 74 28 61 69 55 73 65  ;.  memset(aiUse
ea60: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 74  d, 0, sizeof(int
ea70: 29 2a 28 6e 43 65 6c 6c 2b 31 29 29 3b 0a 20 20  )*(nCell+1));.  
ea80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
ea90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 6f 64 65  ; i++){.    node
eaa0: 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  GetCell(pRtree, 
eab0: 70 4e 6f 64 65 2c 20 69 2c 20 26 61 43 65 6c 6c  pNode, i, &aCell
eac0: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 6f 64 65  [i]);.  }.  node
ead0: 5a 65 72 6f 28 70 52 74 72 65 65 2c 20 70 4e 6f  Zero(pRtree, pNo
eae0: 64 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61  de);.  memcpy(&a
eaf0: 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 70 43 65  Cell[nCell], pCe
eb00: 6c 6c 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65  ll, sizeof(Rtree
eb10: 43 65 6c 6c 29 29 3b 0a 20 20 6e 43 65 6c 6c 2b  Cell));.  nCell+
eb20: 2b 3b 0a 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d  +;..  if( pNode-
eb30: 3e 69 4e 6f 64 65 3d 3d 31 20 29 7b 0a 20 20 20  >iNode==1 ){.   
eb40: 20 70 52 69 67 68 74 20 3d 20 6e 6f 64 65 4e 65   pRight = nodeNe
eb50: 77 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29  w(pRtree, pNode)
eb60: 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 6e 6f  ;.    pLeft = no
eb70: 64 65 4e 65 77 28 70 52 74 72 65 65 2c 20 70 4e  deNew(pRtree, pN
eb80: 6f 64 65 29 3b 0a 20 20 20 20 70 52 74 72 65 65  ode);.    pRtree
eb90: 2d 3e 69 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20  ->iDepth++;.    
eba0: 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d  pNode->isDirty =
ebb0: 20 31 3b 0a 20 20 20 20 77 72 69 74 65 49 6e 74   1;.    writeInt
ebc0: 31 36 28 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 2c  16(pNode->zData,
ebd0: 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 29   pRtree->iDepth)
ebe0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ebf0: 4c 65 66 74 20 3d 20 70 4e 6f 64 65 3b 0a 20 20  Left = pNode;.  
ec00: 20 20 70 52 69 67 68 74 20 3d 20 6e 6f 64 65 4e    pRight = nodeN
ec10: 65 77 28 70 52 74 72 65 65 2c 20 70 4c 65 66 74  ew(pRtree, pLeft
ec20: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
ec30: 6e 6f 64 65 52 65 66 65 72 65 6e 63 65 28 70 4c  nodeReference(pL
ec40: 65 66 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  eft);.  }..  if(
ec50: 20 21 70 4c 65 66 74 20 7c 7c 20 21 70 52 69 67   !pLeft || !pRig
ec60: 68 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ht ){.    rc = S
ec70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
ec80: 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f   goto splitnode_
ec90: 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73  out;.  }..  mems
eca0: 65 74 28 70 4c 65 66 74 2d 3e 7a 44 61 74 61 2c  et(pLeft->zData,
ecb0: 20 30 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64   0, pRtree->iNod
ecc0: 65 53 69 7a 65 29 3b 0a 20 20 6d 65 6d 73 65 74  eSize);.  memset
ecd0: 28 70 52 69 67 68 74 2d 3e 7a 44 61 74 61 2c 20  (pRight->zData, 
ece0: 30 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65  0, pRtree->iNode
ecf0: 53 69 7a 65 29 3b 0a 0a 20 20 72 63 20 3d 20 41  Size);..  rc = A
ed00: 73 73 69 67 6e 43 65 6c 6c 73 28 70 52 74 72 65  ssignCells(pRtre
ed10: 65 2c 20 61 43 65 6c 6c 2c 20 6e 43 65 6c 6c 2c  e, aCell, nCell,
ed20: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
ed30: 26 6c 65 66 74 62 62 6f 78 2c 20 26 72 69 67 68  &leftbbox, &righ
ed40: 74 62 62 6f 78 29 3b 0a 20 20 69 66 28 20 72 63  tbbox);.  if( rc
ed50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ed60: 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64     goto splitnod
ed70: 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
ed80: 20 45 6e 73 75 72 65 20 62 6f 74 68 20 63 68 69   Ensure both chi
ed90: 6c 64 20 6e 6f 64 65 73 20 68 61 76 65 20 6e 6f  ld nodes have no
eda0: 64 65 20 6e 75 6d 62 65 72 73 20 61 73 73 69 67  de numbers assig
edb0: 6e 65 64 20 74 6f 20 74 68 65 6d 20 62 79 20 63  ned to them by c
edc0: 61 6c 6c 69 6e 67 0a 20 20 2a 2a 20 6e 6f 64 65  alling.  ** node
edd0: 57 72 69 74 65 28 29 2e 20 4e 6f 64 65 20 70 52  Write(). Node pR
ede0: 69 67 68 74 20 61 6c 77 61 79 73 20 6e 65 65 64  ight always need
edf0: 73 20 61 20 6e 6f 64 65 20 6e 75 6d 62 65 72 2c  s a node number,
ee00: 20 61 73 20 69 74 20 77 61 73 20 63 72 65 61 74   as it was creat
ee10: 65 64 0a 20 20 2a 2a 20 62 79 20 6e 6f 64 65 4e  ed.  ** by nodeN
ee20: 65 77 28 29 20 61 62 6f 76 65 2e 20 42 75 74 20  ew() above. But 
ee30: 6e 6f 64 65 20 70 4c 65 66 74 20 73 6f 6d 65 74  node pLeft somet
ee40: 69 6d 65 73 20 61 6c 72 65 61 64 79 20 68 61 73  imes already has
ee50: 20 61 20 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 0a   a node number..
ee60: 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
ee70: 65 20 61 76 6f 69 64 20 74 68 65 20 61 6c 6c 20  e avoid the all 
ee80: 74 6f 20 6e 6f 64 65 57 72 69 74 65 28 29 2e 0a  to nodeWrite()..
ee90: 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
eea0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 6e 6f 64 65  E_OK!=(rc = node
eeb0: 57 72 69 74 65 28 70 52 74 72 65 65 2c 20 70 52  Write(pRtree, pR
eec0: 69 67 68 74 29 29 0a 20 20 20 7c 7c 20 28 30 3d  ight)).   || (0=
eed0: 3d 70 4c 65 66 74 2d 3e 69 4e 6f 64 65 20 26 26  =pLeft->iNode &&
eee0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
eef0: 3d 20 6e 6f 64 65 57 72 69 74 65 28 70 52 74 72  = nodeWrite(pRtr
ef00: 65 65 2c 20 70 4c 65 66 74 29 29 29 0a 20 20 29  ee, pLeft))).  )
ef10: 7b 0a 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74  {.    goto split
ef20: 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  node_out;.  }.. 
ef30: 20 72 69 67 68 74 62 62 6f 78 2e 69 52 6f 77 69   rightbbox.iRowi
ef40: 64 20 3d 20 70 52 69 67 68 74 2d 3e 69 4e 6f 64  d = pRight->iNod
ef50: 65 3b 0a 20 20 6c 65 66 74 62 62 6f 78 2e 69 52  e;.  leftbbox.iR
ef60: 6f 77 69 64 20 3d 20 70 4c 65 66 74 2d 3e 69 4e  owid = pLeft->iN
ef70: 6f 64 65 3b 0a 0a 20 20 69 66 28 20 70 4e 6f 64  ode;..  if( pNod
ef80: 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29 7b 0a 20  e->iNode==1 ){. 
ef90: 20 20 20 72 63 20 3d 20 72 74 72 65 65 49 6e 73     rc = rtreeIns
efa0: 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  ertCell(pRtree, 
efb0: 70 4c 65 66 74 2d 3e 70 50 61 72 65 6e 74 2c 20  pLeft->pParent, 
efc0: 26 6c 65 66 74 62 62 6f 78 2c 20 69 48 65 69 67  &leftbbox, iHeig
efd0: 68 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 72  ht+1);.    if( r
efe0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
eff0: 20 20 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74        goto split
f000: 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  node_out;.    }.
f010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 52 74 72    }else{.    Rtr
f020: 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 20  eeNode *pParent 
f030: 3d 20 70 4c 65 66 74 2d 3e 70 50 61 72 65 6e 74  = pLeft->pParent
f040: 3b 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 3b  ;.    int iCell;
f050: 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 50 61  .    rc = nodePa
f060: 72 65 6e 74 49 6e 64 65 78 28 70 52 74 72 65 65  rentIndex(pRtree
f070: 2c 20 70 4c 65 66 74 2c 20 26 69 43 65 6c 6c 29  , pLeft, &iCell)
f080: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
f090: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f0a0: 20 6e 6f 64 65 4f 76 65 72 77 72 69 74 65 43 65   nodeOverwriteCe
f0b0: 6c 6c 28 70 52 74 72 65 65 2c 20 70 50 61 72 65  ll(pRtree, pPare
f0c0: 6e 74 2c 20 26 6c 65 66 74 62 62 6f 78 2c 20 69  nt, &leftbbox, i
f0d0: 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20  Cell);.      rc 
f0e0: 3d 20 41 64 6a 75 73 74 54 72 65 65 28 70 52 74  = AdjustTree(pRt
f0f0: 72 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 26 6c  ree, pParent, &l
f100: 65 66 74 62 62 6f 78 29 3b 0a 20 20 20 20 7d 0a  eftbbox);.    }.
f110: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f120: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
f130: 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75  oto splitnode_ou
f140: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  t;.    }.  }.  i
f150: 66 28 20 28 72 63 20 3d 20 72 74 72 65 65 49 6e  f( (rc = rtreeIn
f160: 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65 2c  sertCell(pRtree,
f170: 20 70 52 69 67 68 74 2d 3e 70 50 61 72 65 6e 74   pRight->pParent
f180: 2c 20 26 72 69 67 68 74 62 62 6f 78 2c 20 69 48  , &rightbbox, iH
f190: 65 69 67 68 74 2b 31 29 29 20 29 7b 0a 20 20 20  eight+1)) ){.   
f1a0: 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f   goto splitnode_
f1b0: 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  out;.  }..  for(
f1c0: 69 3d 30 3b 20 69 3c 4e 43 45 4c 4c 28 70 52 69  i=0; i<NCELL(pRi
f1d0: 67 68 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ght); i++){.    
f1e0: 69 36 34 20 69 52 6f 77 69 64 20 3d 20 6e 6f 64  i64 iRowid = nod
f1f0: 65 47 65 74 52 6f 77 69 64 28 70 52 74 72 65 65  eGetRowid(pRtree
f200: 2c 20 70 52 69 67 68 74 2c 20 69 29 3b 0a 20 20  , pRight, i);.  
f210: 20 20 72 63 20 3d 20 75 70 64 61 74 65 4d 61 70    rc = updateMap
f220: 70 69 6e 67 28 70 52 74 72 65 65 2c 20 69 52 6f  ping(pRtree, iRo
f230: 77 69 64 2c 20 70 52 69 67 68 74 2c 20 69 48 65  wid, pRight, iHe
f240: 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 69  ight);.    if( i
f250: 52 6f 77 69 64 3d 3d 70 43 65 6c 6c 2d 3e 69 52  Rowid==pCell->iR
f260: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 6e 65  owid ){.      ne
f270: 77 43 65 6c 6c 49 73 52 69 67 68 74 20 3d 20 31  wCellIsRight = 1
f280: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f290: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f2a0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 70 6c 69  .      goto spli
f2b0: 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  tnode_out;.    }
f2c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 6f 64 65  .  }.  if( pNode
f2d0: 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29 7b 0a 20 20  ->iNode==1 ){.  
f2e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 43 45    for(i=0; i<NCE
f2f0: 4c 4c 28 70 4c 65 66 74 29 3b 20 69 2b 2b 29 7b  LL(pLeft); i++){
f300: 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
f310: 64 20 3d 20 6e 6f 64 65 47 65 74 52 6f 77 69 64  d = nodeGetRowid
f320: 28 70 52 74 72 65 65 2c 20 70 4c 65 66 74 2c 20  (pRtree, pLeft, 
f330: 69 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 75  i);.      rc = u
f340: 70 64 61 74 65 4d 61 70 70 69 6e 67 28 70 52 74  pdateMapping(pRt
f350: 72 65 65 2c 20 69 52 6f 77 69 64 2c 20 70 4c 65  ree, iRowid, pLe
f360: 66 74 2c 20 69 48 65 69 67 68 74 29 3b 0a 20 20  ft, iHeight);.  
f370: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f380: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f390: 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f   goto splitnode_
f3a0: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
f3b0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
f3c0: 65 77 43 65 6c 6c 49 73 52 69 67 68 74 3d 3d 30  ewCellIsRight==0
f3d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 70 64   ){.    rc = upd
f3e0: 61 74 65 4d 61 70 70 69 6e 67 28 70 52 74 72 65  ateMapping(pRtre
f3f0: 65 2c 20 70 43 65 6c 6c 2d 3e 69 52 6f 77 69 64  e, pCell->iRowid
f400: 2c 20 70 4c 65 66 74 2c 20 69 48 65 69 67 68 74  , pLeft, iHeight
f410: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
f420: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f430: 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 6c 65     rc = nodeRele
f440: 61 73 65 28 70 52 74 72 65 65 2c 20 70 52 69 67  ase(pRtree, pRig
f450: 68 74 29 3b 0a 20 20 20 20 70 52 69 67 68 74 20  ht);.    pRight 
f460: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  = 0;.  }.  if( r
f470: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f480: 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 6c      rc = nodeRel
f490: 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 4c 65  ease(pRtree, pLe
f4a0: 66 74 29 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d  ft);.    pLeft =
f4b0: 20 30 3b 0a 20 20 7d 0a 0a 73 70 6c 69 74 6e 6f   0;.  }..splitno
f4c0: 64 65 5f 6f 75 74 3a 0a 20 20 6e 6f 64 65 52 65  de_out:.  nodeRe
f4d0: 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 52  lease(pRtree, pR
f4e0: 69 67 68 74 29 3b 0a 20 20 6e 6f 64 65 52 65 6c  ight);.  nodeRel
f4f0: 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 4c 65  ease(pRtree, pLe
f500: 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ft);.  sqlite3_f
f510: 72 65 65 28 61 43 65 6c 6c 29 3b 0a 20 20 72 65  ree(aCell);.  re
f520: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f530: 2a 20 49 66 20 6e 6f 64 65 20 70 4c 65 61 66 20  * If node pLeaf 
f540: 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 20  is not the root 
f550: 6f 66 20 74 68 65 20 72 2d 74 72 65 65 20 61 6e  of the r-tree an
f560: 64 20 69 74 73 20 70 50 61 72 65 6e 74 20 70 6f  d its pParent po
f570: 69 6e 74 65 72 20 69 73 20 0a 2a 2a 20 73 74 69  inter is .** sti
f580: 6c 6c 20 4e 55 4c 4c 2c 20 6c 6f 61 64 20 61 6c  ll NULL, load al
f590: 6c 20 61 6e 63 65 73 74 6f 72 20 6e 6f 64 65 73  l ancestor nodes
f5a0: 20 6f 66 20 70 4c 65 61 66 20 69 6e 74 6f 20 6d   of pLeaf into m
f5b0: 65 6d 6f 72 79 20 61 6e 64 20 70 6f 70 75 6c 61  emory and popula
f5c0: 74 65 0a 2a 2a 20 74 68 65 20 70 4c 65 61 66 2d  te.** the pLeaf-
f5d0: 3e 70 50 61 72 65 6e 74 20 63 68 61 69 6e 20 61  >pParent chain a
f5e0: 6c 6c 20 74 68 65 20 77 61 79 20 75 70 20 74 6f  ll the way up to
f5f0: 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a   the root node..
f600: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61  **.** This opera
f610: 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
f620: 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20 64   when a row is d
f630: 65 6c 65 74 65 64 20 28 6f 72 20 75 70 64 61 74  eleted (or updat
f640: 65 64 20 2d 20 61 6e 20 75 70 64 61 74 65 0a 2a  ed - an update.*
f650: 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  * is implemented
f660: 20 61 73 20 61 20 64 65 6c 65 74 65 20 66 6f 6c   as a delete fol
f670: 6c 6f 77 65 64 20 62 79 20 61 6e 20 69 6e 73 65  lowed by an inse
f680: 72 74 29 2e 20 53 51 4c 69 74 65 20 70 72 6f 76  rt). SQLite prov
f690: 69 64 65 73 20 74 68 65 0a 2a 2a 20 72 6f 77 69  ides the.** rowi
f6a0: 64 20 6f 66 20 74 68 65 20 72 6f 77 20 74 6f 20  d of the row to 
f6b0: 64 65 6c 65 74 65 2c 20 77 68 69 63 68 20 63 61  delete, which ca
f6c0: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 66 69 6e  n be used to fin
f6d0: 64 20 74 68 65 20 6c 65 61 66 20 6f 6e 20 77 68  d the leaf on wh
f6e0: 69 63 68 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79  ich.** the entry
f6f0: 20 72 65 73 69 64 65 73 20 28 61 72 67 75 6d 65   resides (argume
f700: 6e 74 20 70 4c 65 61 66 29 2e 20 4f 6e 63 65 20  nt pLeaf). Once 
f710: 74 68 65 20 6c 65 61 66 20 69 73 20 6c 6f 63 61  the leaf is loca
f720: 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75  ted, this .** fu
f730: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
f740: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 74   to determine it
f750: 73 20 61 6e 63 65 73 74 72 79 2e 0a 2a 2f 0a 73  s ancestry..*/.s
f760: 74 61 74 69 63 20 69 6e 74 20 66 69 78 4c 65 61  tatic int fixLea
f770: 66 50 61 72 65 6e 74 28 52 74 72 65 65 20 2a 70  fParent(Rtree *p
f780: 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65  Rtree, RtreeNode
f790: 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20   *pLeaf){.  int 
f7a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f7b0: 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 43 68    RtreeNode *pCh
f7c0: 69 6c 64 20 3d 20 70 4c 65 61 66 3b 0a 20 20 77  ild = pLeaf;.  w
f7d0: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
f7e0: 5f 4f 4b 20 26 26 20 70 43 68 69 6c 64 2d 3e 69  _OK && pChild->i
f7f0: 4e 6f 64 65 21 3d 31 20 26 26 20 70 43 68 69 6c  Node!=1 && pChil
f800: 64 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b  d->pParent==0 ){
f810: 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53  .    int rc2 = S
f820: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
f830: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65     /* sqlite3_re
f840: 73 65 74 28 29 20 72 65 74 75 72 6e 20 63 6f 64  set() return cod
f850: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
f860: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72  _bind_int64(pRtr
f870: 65 65 2d 3e 70 52 65 61 64 50 61 72 65 6e 74 2c  ee->pReadParent,
f880: 20 31 2c 20 70 43 68 69 6c 64 2d 3e 69 4e 6f 64   1, pChild->iNod
f890: 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
f8a0: 69 74 65 33 5f 73 74 65 70 28 70 52 74 72 65 65  ite3_step(pRtree
f8b0: 2d 3e 70 52 65 61 64 50 61 72 65 6e 74 29 3b 0a  ->pReadParent);.
f8c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f8d0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
f8e0: 52 74 72 65 65 4e 6f 64 65 20 2a 70 54 65 73 74  RtreeNode *pTest
f8f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ;           /* U
f900: 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20  sed to test for 
f910: 72 65 66 65 72 65 6e 63 65 20 6c 6f 6f 70 73 20  reference loops 
f920: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4e 6f  */.      i64 iNo
f930: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
f940: 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 6e 75 6d       /* Node num
f950: 62 65 72 20 6f 66 20 70 61 72 65 6e 74 20 6e 6f  ber of parent no
f960: 64 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  de */..      /* 
f970: 42 65 66 6f 72 65 20 73 65 74 74 69 6e 67 20 70  Before setting p
f980: 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 2c 20  Child->pParent, 
f990: 74 65 73 74 20 74 68 61 74 20 77 65 20 61 72 65  test that we are
f9a0: 20 6e 6f 74 20 63 72 65 61 74 69 6e 67 20 61 0a   not creating a.
f9b0: 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 6f 66        ** loop of
f9c0: 20 72 65 66 65 72 65 6e 63 65 73 20 28 61 73 20   references (as 
f9d0: 77 65 20 77 6f 75 6c 64 20 69 66 2c 20 73 61 79  we would if, say
f9e0: 2c 20 70 43 68 69 6c 64 3d 3d 70 50 61 72 65 6e  , pChild==pParen
f9f0: 74 29 2e 20 57 65 20 64 6f 6e 27 74 0a 20 20 20  t). We don't.   
fa00: 20 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 64 6f     ** want to do
fa10: 20 74 68 69 73 20 61 73 20 69 74 20 6c 65 61 64   this as it lead
fa20: 73 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6c 65  s to a memory le
fa30: 61 6b 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  ak when trying t
fa40: 6f 20 64 65 6c 65 74 65 0a 20 20 20 20 20 20 2a  o delete.      *
fa50: 2a 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  * the referenced
fa60: 20 63 6f 75 6e 74 65 64 20 6e 6f 64 65 20 73 74   counted node st
fa70: 72 75 63 74 75 72 65 73 2e 0a 20 20 20 20 20 20  ructures..      
fa80: 2a 2f 0a 20 20 20 20 20 20 69 4e 6f 64 65 20 3d  */.      iNode =
fa90: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
faa0: 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70 52  int64(pRtree->pR
fab0: 65 61 64 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20  eadParent, 0);. 
fac0: 20 20 20 20 20 66 6f 72 28 70 54 65 73 74 3d 70       for(pTest=p
fad0: 4c 65 61 66 3b 20 70 54 65 73 74 20 26 26 20 70  Leaf; pTest && p
fae0: 54 65 73 74 2d 3e 69 4e 6f 64 65 21 3d 69 4e 6f  Test->iNode!=iNo
faf0: 64 65 3b 20 70 54 65 73 74 3d 70 54 65 73 74 2d  de; pTest=pTest-
fb00: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20  >pParent);.     
fb10: 20 69 66 28 20 21 70 54 65 73 74 20 29 7b 0a 20   if( !pTest ){. 
fb20: 20 20 20 20 20 20 20 72 63 32 20 3d 20 6e 6f 64         rc2 = nod
fb30: 65 41 63 71 75 69 72 65 28 70 52 74 72 65 65 2c  eAcquire(pRtree,
fb40: 20 69 4e 6f 64 65 2c 20 30 2c 20 26 70 43 68 69   iNode, 0, &pChi
fb50: 6c 64 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  ld->pParent);.  
fb60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fb70: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
fb80: 65 74 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64  et(pRtree->pRead
fb90: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
fba0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
fbb0: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 69   rc = rc2;.    i
fbc0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
fbd0: 20 26 26 20 21 70 43 68 69 6c 64 2d 3e 70 50 61   && !pChild->pPa
fbe0: 72 65 6e 74 20 29 20 72 63 20 3d 20 53 51 4c 49  rent ) rc = SQLI
fbf0: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b  TE_CORRUPT_VTAB;
fc00: 0a 20 20 20 20 70 43 68 69 6c 64 20 3d 20 70 43  .    pChild = pC
fc10: 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  hild->pParent;. 
fc20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
fc30: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  }..static int de
fc40: 6c 65 74 65 43 65 6c 6c 28 52 74 72 65 65 20 2a  leteCell(Rtree *
fc50: 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 2c 20 69  , RtreeNode *, i
fc60: 6e 74 2c 20 69 6e 74 29 3b 0a 0a 73 74 61 74 69  nt, int);..stati
fc70: 63 20 69 6e 74 20 72 65 6d 6f 76 65 4e 6f 64 65  c int removeNode
fc80: 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20  (Rtree *pRtree, 
fc90: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
fca0: 2c 20 69 6e 74 20 69 48 65 69 67 68 74 29 7b 0a  , int iHeight){.
fcb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
fcc0: 72 63 32 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65  rc2;.  RtreeNode
fcd0: 20 2a 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20   *pParent = 0;. 
fce0: 20 69 6e 74 20 69 43 65 6c 6c 3b 0a 0a 20 20 61   int iCell;..  a
fcf0: 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 52  ssert( pNode->nR
fd00: 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 52  ef==1 );..  /* R
fd10: 65 6d 6f 76 65 20 74 68 65 20 65 6e 74 72 79 20  emove the entry 
fd20: 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 63 65  in the parent ce
fd30: 6c 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6e 6f  ll. */.  rc = no
fd40: 64 65 50 61 72 65 6e 74 49 6e 64 65 78 28 70 52  deParentIndex(pR
fd50: 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 26 69 43  tree, pNode, &iC
fd60: 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ell);.  if( rc==
fd70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
fd80: 20 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65   pParent = pNode
fd90: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70  ->pParent;.    p
fda0: 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Node->pParent = 
fdb0: 30 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 6c 65  0;.    rc = dele
fdc0: 74 65 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70  teCell(pRtree, p
fdd0: 50 61 72 65 6e 74 2c 20 69 43 65 6c 6c 2c 20 69  Parent, iCell, i
fde0: 48 65 69 67 68 74 2b 31 29 3b 0a 20 20 7d 0a 20  Height+1);.  }. 
fdf0: 20 72 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61   rc2 = nodeRelea
fe00: 73 65 28 70 52 74 72 65 65 2c 20 70 50 61 72 65  se(pRtree, pPare
fe10: 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nt);.  if( rc==S
fe20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fe30: 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20  rc = rc2;.  }.  
fe40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fe50: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
fe60: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  rc;.  }..  /* Re
fe70: 6d 6f 76 65 20 74 68 65 20 78 78 78 5f 6e 6f 64  move the xxx_nod
fe80: 65 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 73 71  e entry. */.  sq
fe90: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
fea0: 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65  (pRtree->pDelete
feb0: 4e 6f 64 65 2c 20 31 2c 20 70 4e 6f 64 65 2d 3e  Node, 1, pNode->
fec0: 69 4e 6f 64 65 29 3b 0a 20 20 73 71 6c 69 74 65  iNode);.  sqlite
fed0: 33 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70  3_step(pRtree->p
fee0: 44 65 6c 65 74 65 4e 6f 64 65 29 3b 0a 20 20 69  DeleteNode);.  i
fef0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
ff00: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
ff10: 74 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74  t(pRtree->pDelet
ff20: 65 4e 6f 64 65 29 29 20 29 7b 0a 20 20 20 20 72  eNode)) ){.    r
ff30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
ff40: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 78   /* Remove the x
ff50: 78 78 5f 70 61 72 65 6e 74 20 65 6e 74 72 79 2e  xx_parent entry.
ff60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 69   */.  sqlite3_bi
ff70: 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d  nd_int64(pRtree-
ff80: 3e 70 44 65 6c 65 74 65 50 61 72 65 6e 74 2c 20  >pDeleteParent, 
ff90: 31 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29  1, pNode->iNode)
ffa0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
ffb0: 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65  (pRtree->pDelete
ffc0: 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 53  Parent);.  if( S
ffd0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
ffe0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52  sqlite3_reset(pR
fff0: 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 50 61 72  tree->pDeletePar
10000 65 6e 74 29 29 20 29 7b 0a 20 20 20 20 72 65 74  ent)) ){.    ret
10010 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 0a 20  urn rc;.  }.  . 
10020 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6e   /* Remove the n
10030 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d  ode from the in-
10040 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
10050 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e  e and link it in
10060 74 6f 0a 20 20 2a 2a 20 74 68 65 20 52 74 72 65  to.  ** the Rtre
10070 65 2e 70 44 65 6c 65 74 65 64 20 6c 69 73 74 2e  e.pDeleted list.
10080 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 69   Its contents wi
10090 6c 6c 20 62 65 20 72 65 2d 69 6e 73 65 72 74 65  ll be re-inserte
100a0 64 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 2a 2f  d later on..  */
100b0 0a 20 20 6e 6f 64 65 48 61 73 68 44 65 6c 65 74  .  nodeHashDelet
100c0 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29  e(pRtree, pNode)
100d0 3b 0a 20 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65  ;.  pNode->iNode
100e0 20 3d 20 69 48 65 69 67 68 74 3b 0a 20 20 70 4e   = iHeight;.  pN
100f0 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 70 52 74  ode->pNext = pRt
10100 72 65 65 2d 3e 70 44 65 6c 65 74 65 64 3b 0a 20  ree->pDeleted;. 
10110 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a   pNode->nRef++;.
10120 20 20 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74    pRtree->pDelet
10130 65 64 20 3d 20 70 4e 6f 64 65 3b 0a 0a 20 20 72  ed = pNode;..  r
10140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10150 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
10160 69 78 42 6f 75 6e 64 69 6e 67 42 6f 78 28 52 74  ixBoundingBox(Rt
10170 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72  ree *pRtree, Rtr
10180 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a  eeNode *pNode){.
10190 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61    RtreeNode *pPa
101a0 72 65 6e 74 20 3d 20 70 4e 6f 64 65 2d 3e 70 50  rent = pNode->pP
101b0 61 72 65 6e 74 3b 0a 20 20 69 6e 74 20 72 63 20  arent;.  int rc 
101c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 20 20  = SQLITE_OK; .  
101d0 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20  if( pParent ){. 
101e0 20 20 20 69 6e 74 20 69 69 3b 20 0a 20 20 20 20     int ii; .    
101f0 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c  int nCell = NCEL
10200 4c 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 52 74  L(pNode);.    Rt
10210 72 65 65 43 65 6c 6c 20 62 6f 78 3b 20 20 20 20  reeCell box;    
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10230 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 75 6e 64          /* Bound
10240 69 6e 67 20 62 6f 78 20 66 6f 72 20 70 4e 6f 64  ing box for pNod
10250 65 20 2a 2f 0a 20 20 20 20 6e 6f 64 65 47 65 74  e */.    nodeGet
10260 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f  Cell(pRtree, pNo
10270 64 65 2c 20 30 2c 20 26 62 6f 78 29 3b 0a 20 20  de, 0, &box);.  
10280 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
10290 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Cell; ii++){.   
102a0 20 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65 6c     RtreeCell cel
102b0 6c 3b 0a 20 20 20 20 20 20 6e 6f 64 65 47 65 74  l;.      nodeGet
102c0 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f  Cell(pRtree, pNo
102d0 64 65 2c 20 69 69 2c 20 26 63 65 6c 6c 29 3b 0a  de, ii, &cell);.
102e0 20 20 20 20 20 20 63 65 6c 6c 55 6e 69 6f 6e 28        cellUnion(
102f0 70 52 74 72 65 65 2c 20 26 62 6f 78 2c 20 26 63  pRtree, &box, &c
10300 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ell);.    }.    
10310 62 6f 78 2e 69 52 6f 77 69 64 20 3d 20 70 4e 6f  box.iRowid = pNo
10320 64 65 2d 3e 69 4e 6f 64 65 3b 0a 20 20 20 20 72  de->iNode;.    r
10330 63 20 3d 20 6e 6f 64 65 50 61 72 65 6e 74 49 6e  c = nodeParentIn
10340 64 65 78 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  dex(pRtree, pNod
10350 65 2c 20 26 69 69 29 3b 0a 20 20 20 20 69 66 28  e, &ii);.    if(
10360 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10370 7b 0a 20 20 20 20 20 20 6e 6f 64 65 4f 76 65 72  {.      nodeOver
10380 77 72 69 74 65 43 65 6c 6c 28 70 52 74 72 65 65  writeCell(pRtree
10390 2c 20 70 50 61 72 65 6e 74 2c 20 26 62 6f 78 2c  , pParent, &box,
103a0 20 69 69 29 3b 0a 20 20 20 20 20 20 72 63 20 3d   ii);.      rc =
103b0 20 66 69 78 42 6f 75 6e 64 69 6e 67 42 6f 78 28   fixBoundingBox(
103c0 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74 29  pRtree, pParent)
103d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
103e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
103f0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 63 65 6c  * Delete the cel
10400 6c 20 61 74 20 69 6e 64 65 78 20 69 43 65 6c 6c  l at index iCell
10410 20 6f 66 20 6e 6f 64 65 20 70 4e 6f 64 65 2e 20   of node pNode. 
10420 41 66 74 65 72 20 72 65 6d 6f 76 69 6e 67 20 74  After removing t
10430 68 65 0a 2a 2a 20 63 65 6c 6c 2c 20 61 64 6a 75  he.** cell, adju
10440 73 74 20 74 68 65 20 72 2d 74 72 65 65 20 64 61  st the r-tree da
10450 74 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20  ta structure if 
10460 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
10470 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65 43 65  tic int deleteCe
10480 6c 6c 28 52 74 72 65 65 20 2a 70 52 74 72 65 65  ll(Rtree *pRtree
10490 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f  , RtreeNode *pNo
104a0 64 65 2c 20 69 6e 74 20 69 43 65 6c 6c 2c 20 69  de, int iCell, i
104b0 6e 74 20 69 48 65 69 67 68 74 29 7b 0a 20 20 52  nt iHeight){.  R
104c0 74 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e  treeNode *pParen
104d0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
104e0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
104f0 72 63 20 3d 20 66 69 78 4c 65 61 66 50 61 72 65  rc = fixLeafPare
10500 6e 74 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  nt(pRtree, pNode
10510 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
10520 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   rc;.  }..  /* R
10530 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20 66  emove the cell f
10540 72 6f 6d 20 74 68 65 20 6e 6f 64 65 2e 20 54 68  rom the node. Th
10550 69 73 20 63 61 6c 6c 20 6a 75 73 74 20 6d 6f 76  is call just mov
10560 65 73 20 62 79 74 65 73 20 61 72 6f 75 6e 64 0a  es bytes around.
10570 20 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f    ** the in-memo
10580 72 79 20 6e 6f 64 65 20 69 6d 61 67 65 2c 20 73  ry node image, s
10590 6f 20 69 74 20 63 61 6e 6e 6f 74 20 66 61 69 6c  o it cannot fail
105a0 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 64 65 44 65 6c  ..  */.  nodeDel
105b0 65 74 65 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  eteCell(pRtree, 
105c0 70 4e 6f 64 65 2c 20 69 43 65 6c 6c 29 3b 0a 0a  pNode, iCell);..
105d0 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 6f 64 65    /* If the node
105e0 20 69 73 20 6e 6f 74 20 74 68 65 20 74 72 65 65   is not the tree
105f0 20 72 6f 6f 74 20 61 6e 64 20 6e 6f 77 20 68 61   root and now ha
10600 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
10610 6d 69 6e 69 6d 75 6d 0a 20 20 2a 2a 20 6e 75 6d  minimum.  ** num
10620 62 65 72 20 6f 66 20 63 65 6c 6c 73 2c 20 72 65  ber of cells, re
10630 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
10640 20 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65   tree. Otherwise
10650 2c 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a  , update the.  *
10660 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  * cell in the pa
10670 72 65 6e 74 20 6e 6f 64 65 20 73 6f 20 74 68 61  rent node so tha
10680 74 20 69 74 20 74 69 67 68 74 6c 79 20 63 6f 6e  t it tightly con
10690 74 61 69 6e 73 20 74 68 65 20 75 70 64 61 74 65  tains the update
106a0 64 0a 20 20 2a 2a 20 6e 6f 64 65 2e 0a 20 20 2a  d.  ** node..  *
106b0 2f 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 4e  /.  pParent = pN
106c0 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  ode->pParent;.  
106d0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20  assert( pParent 
106e0 7c 7c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d  || pNode->iNode=
106f0 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  =1 );.  if( pPar
10700 65 6e 74 20 29 7b 0a 20 20 20 20 69 66 28 20 4e  ent ){.    if( N
10710 43 45 4c 4c 28 70 4e 6f 64 65 29 3c 52 54 52 45  CELL(pNode)<RTRE
10720 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52 74 72 65  E_MINCELLS(pRtre
10730 65 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e) ){.      rc =
10740 20 72 65 6d 6f 76 65 4e 6f 64 65 28 70 52 74 72   removeNode(pRtr
10750 65 65 2c 20 70 4e 6f 64 65 2c 20 69 48 65 69 67  ee, pNode, iHeig
10760 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ht);.    }else{.
10770 20 20 20 20 20 20 72 63 20 3d 20 66 69 78 42 6f        rc = fixBo
10780 75 6e 64 69 6e 67 42 6f 78 28 70 52 74 72 65 65  undingBox(pRtree
10790 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  , pNode);.    }.
107a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
107b0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
107c0 52 65 69 6e 73 65 72 74 28 0a 20 20 52 74 72 65  Reinsert(.  Rtre
107d0 65 20 2a 70 52 74 72 65 65 2c 20 0a 20 20 52 74  e *pRtree, .  Rt
107e0 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20  reeNode *pNode, 
107f0 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43  .  RtreeCell *pC
10800 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 69 48 65 69  ell, .  int iHei
10810 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 2a 61 4f  ght.){.  int *aO
10820 72 64 65 72 3b 0a 20 20 69 6e 74 20 2a 61 53 70  rder;.  int *aSp
10830 61 72 65 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c  are;.  RtreeCell
10840 20 2a 61 43 65 6c 6c 3b 0a 20 20 66 6c 6f 61 74   *aCell;.  float
10850 20 2a 61 44 69 73 74 61 6e 63 65 3b 0a 20 20 69   *aDistance;.  i
10860 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 66 6c 6f 61  nt nCell;.  floa
10870 74 20 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 52  t aCenterCoord[R
10880 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49  TREE_MAX_DIMENSI
10890 4f 4e 53 5d 3b 0a 20 20 69 6e 74 20 69 44 69 6d  ONS];.  int iDim
108a0 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  ;.  int ii;.  in
108b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
108c0 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 61 43 65 6e  ;..  memset(aCen
108d0 74 65 72 43 6f 6f 72 64 2c 20 30 2c 20 73 69 7a  terCoord, 0, siz
108e0 65 6f 66 28 66 6c 6f 61 74 29 2a 52 54 52 45 45  eof(float)*RTREE
108f0 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 29  _MAX_DIMENSIONS)
10900 3b 0a 0a 20 20 6e 43 65 6c 6c 20 3d 20 4e 43 45  ;..  nCell = NCE
10910 4c 4c 28 70 4e 6f 64 65 29 2b 31 3b 0a 0a 20 20  LL(pNode)+1;..  
10920 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
10930 62 75 66 66 65 72 73 20 75 73 65 64 20 62 79 20  buffers used by 
10940 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
10950 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
10960 73 0a 20 20 2a 2a 20 72 65 6c 69 6e 71 75 69 73  s.  ** relinquis
10970 68 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  hed before this 
10980 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
10990 2e 0a 20 20 2a 2f 0a 20 20 61 43 65 6c 6c 20 3d  ..  */.  aCell =
109a0 20 28 52 74 72 65 65 43 65 6c 6c 20 2a 29 73 71   (RtreeCell *)sq
109b0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 43 65  lite3_malloc(nCe
109c0 6c 6c 20 2a 20 28 0a 20 20 20 20 73 69 7a 65 6f  ll * (.    sizeo
109d0 66 28 52 74 72 65 65 43 65 6c 6c 29 20 2b 20 20  f(RtreeCell) +  
109e0 20 20 20 20 20 20 20 2f 2a 20 61 43 65 6c 6c 20         /* aCell 
109f0 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 73 69 7a  array */.    siz
10a00 65 6f 66 28 69 6e 74 29 20 20 20 20 20 20 20 2b  eof(int)       +
10a10 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4f 72 64           /* aOrd
10a20 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
10a30 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20 20 20  sizeof(int)     
10a40 20 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 61    +         /* a
10a50 53 70 61 72 65 20 61 72 72 61 79 20 2a 2f 0a 20  Spare array */. 
10a60 20 20 20 73 69 7a 65 6f 66 28 66 6c 6f 61 74 29     sizeof(float)
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10a80 2a 20 61 44 69 73 74 61 6e 63 65 20 61 72 72 61  * aDistance arra
10a90 79 20 2a 2f 0a 20 20 29 29 3b 0a 20 20 69 66 28  y */.  ));.  if(
10aa0 20 21 61 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72   !aCell ){.    r
10ab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
10ac0 45 4d 3b 0a 20 20 7d 0a 20 20 61 4f 72 64 65 72  EM;.  }.  aOrder
10ad0 20 20 20 20 3d 20 28 69 6e 74 20 2a 29 26 61 43      = (int *)&aC
10ae0 65 6c 6c 5b 6e 43 65 6c 6c 5d 3b 0a 20 20 61 53  ell[nCell];.  aS
10af0 70 61 72 65 20 20 20 20 3d 20 28 69 6e 74 20 2a  pare    = (int *
10b00 29 26 61 4f 72 64 65 72 5b 6e 43 65 6c 6c 5d 3b  )&aOrder[nCell];
10b10 0a 20 20 61 44 69 73 74 61 6e 63 65 20 3d 20 28  .  aDistance = (
10b20 66 6c 6f 61 74 20 2a 29 26 61 53 70 61 72 65 5b  float *)&aSpare[
10b30 6e 43 65 6c 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69  nCell];..  for(i
10b40 69 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69  i=0; ii<nCell; i
10b50 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 69  i++){.    if( ii
10b60 3d 3d 28 6e 43 65 6c 6c 2d 31 29 20 29 7b 0a 20  ==(nCell-1) ){. 
10b70 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 43 65       memcpy(&aCe
10b80 6c 6c 5b 69 69 5d 2c 20 70 43 65 6c 6c 2c 20 73  ll[ii], pCell, s
10b90 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29  izeof(RtreeCell)
10ba0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10bb0 20 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28      nodeGetCell(
10bc0 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69  pRtree, pNode, i
10bd0 69 2c 20 26 61 43 65 6c 6c 5b 69 69 5d 29 3b 0a  i, &aCell[ii]);.
10be0 20 20 20 20 7d 0a 20 20 20 20 61 4f 72 64 65 72      }.    aOrder
10bf0 5b 69 69 5d 20 3d 20 69 69 3b 0a 20 20 20 20 66  [ii] = ii;.    f
10c00 6f 72 28 69 44 69 6d 3d 30 3b 20 69 44 69 6d 3c  or(iDim=0; iDim<
10c10 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3b 20 69 44  pRtree->nDim; iD
10c20 69 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 43 65  im++){.      aCe
10c30 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d 20  nterCoord[iDim] 
10c40 2b 3d 20 28 66 6c 6f 61 74 29 44 43 4f 4f 52 44  += (float)DCOORD
10c50 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f 72  (aCell[ii].aCoor
10c60 64 5b 69 44 69 6d 2a 32 5d 29 3b 0a 20 20 20 20  d[iDim*2]);.    
10c70 20 20 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 69    aCenterCoord[i
10c80 44 69 6d 5d 20 2b 3d 20 28 66 6c 6f 61 74 29 44  Dim] += (float)D
10c90 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d 2e  COORD(aCell[ii].
10ca0 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 2b 31 5d  aCoord[iDim*2+1]
10cb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
10cc0 6f 72 28 69 44 69 6d 3d 30 3b 20 69 44 69 6d 3c  or(iDim=0; iDim<
10cd0 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3b 20 69 44  pRtree->nDim; iD
10ce0 69 6d 2b 2b 29 7b 0a 20 20 20 20 61 43 65 6e 74  im++){.    aCent
10cf0 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d 20 3d 20  erCoord[iDim] = 
10d00 28 66 6c 6f 61 74 29 28 61 43 65 6e 74 65 72 43  (float)(aCenterC
10d10 6f 6f 72 64 5b 69 44 69 6d 5d 2f 28 28 66 6c 6f  oord[iDim]/((flo
10d20 61 74 29 6e 43 65 6c 6c 2a 32 2e 30 29 29 3b 0a  at)nCell*2.0));.
10d30 20 20 7d 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b    }..  for(ii=0;
10d40 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29   ii<nCell; ii++)
10d50 7b 0a 20 20 20 20 61 44 69 73 74 61 6e 63 65 5b  {.    aDistance[
10d60 69 69 5d 20 3d 20 30 2e 30 3b 0a 20 20 20 20 66  ii] = 0.0;.    f
10d70 6f 72 28 69 44 69 6d 3d 30 3b 20 69 44 69 6d 3c  or(iDim=0; iDim<
10d80 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3b 20 69 44  pRtree->nDim; iD
10d90 69 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6c 6f  im++){.      flo
10da0 61 74 20 63 6f 6f 72 64 20 3d 20 28 66 6c 6f 61  at coord = (floa
10db0 74 29 28 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b  t)(DCOORD(aCell[
10dc0 69 69 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a  ii].aCoord[iDim*
10dd0 32 2b 31 5d 29 20 2d 20 0a 20 20 20 20 20 20 20  2+1]) - .       
10de0 20 20 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b     DCOORD(aCell[
10df0 69 69 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a  ii].aCoord[iDim*
10e00 32 5d 29 29 3b 0a 20 20 20 20 20 20 61 44 69 73  2]));.      aDis
10e10 74 61 6e 63 65 5b 69 69 5d 20 2b 3d 20 28 63 6f  tance[ii] += (co
10e20 6f 72 64 2d 61 43 65 6e 74 65 72 43 6f 6f 72 64  ord-aCenterCoord
10e30 5b 69 44 69 6d 5d 29 2a 28 63 6f 6f 72 64 2d 61  [iDim])*(coord-a
10e40 43 65 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d  CenterCoord[iDim
10e50 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ]);.    }.  }.. 
10e60 20 53 6f 72 74 42 79 44 69 73 74 61 6e 63 65 28   SortByDistance(
10e70 61 4f 72 64 65 72 2c 20 6e 43 65 6c 6c 2c 20 61  aOrder, nCell, a
10e80 44 69 73 74 61 6e 63 65 2c 20 61 53 70 61 72 65  Distance, aSpare
10e90 29 3b 0a 20 20 6e 6f 64 65 5a 65 72 6f 28 70 52  );.  nodeZero(pR
10ea0 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 0a 20  tree, pNode);.. 
10eb0 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
10ec0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 28  QLITE_OK && ii<(
10ed0 6e 43 65 6c 6c 2d 28 52 54 52 45 45 5f 4d 49 4e  nCell-(RTREE_MIN
10ee0 43 45 4c 4c 53 28 70 52 74 72 65 65 29 2b 31 29  CELLS(pRtree)+1)
10ef0 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74  ); ii++){.    Rt
10f00 72 65 65 43 65 6c 6c 20 2a 70 20 3d 20 26 61 43  reeCell *p = &aC
10f10 65 6c 6c 5b 61 4f 72 64 65 72 5b 69 69 5d 5d 3b  ell[aOrder[ii]];
10f20 0a 20 20 20 20 6e 6f 64 65 49 6e 73 65 72 74 43  .    nodeInsertC
10f30 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ell(pRtree, pNod
10f40 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
10f50 2d 3e 69 52 6f 77 69 64 3d 3d 70 43 65 6c 6c 2d  ->iRowid==pCell-
10f60 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
10f70 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d 30 20   if( iHeight==0 
10f80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10f90 72 6f 77 69 64 57 72 69 74 65 28 70 52 74 72 65  rowidWrite(pRtre
10fa0 65 2c 20 70 2d 3e 69 52 6f 77 69 64 2c 20 70 4e  e, p->iRowid, pN
10fb0 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20  ode->iNode);.   
10fc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10fd0 20 20 72 63 20 3d 20 70 61 72 65 6e 74 57 72 69    rc = parentWri
10fe0 74 65 28 70 52 74 72 65 65 2c 20 70 2d 3e 69 52  te(pRtree, p->iR
10ff0 6f 77 69 64 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f  owid, pNode->iNo
11000 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
11010 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
11020 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11030 20 20 72 63 20 3d 20 66 69 78 42 6f 75 6e 64 69    rc = fixBoundi
11040 6e 67 42 6f 78 28 70 52 74 72 65 65 2c 20 70 4e  ngBox(pRtree, pN
11050 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ode);.  }.  for(
11060 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
11070 26 26 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b  && ii<nCell; ii+
11080 2b 29 7b 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  +){.    /* Find 
11090 61 20 6e 6f 64 65 20 74 6f 20 73 74 6f 72 65 20  a node to store 
110a0 74 68 69 73 20 63 65 6c 6c 20 69 6e 2e 20 70 4e  this cell in. pN
110b0 6f 64 65 2d 3e 69 4e 6f 64 65 20 63 75 72 72 65  ode->iNode curre
110c0 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ntly contains.  
110d0 20 20 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20    ** the height 
110e0 6f 66 20 74 68 65 20 73 75 62 2d 74 72 65 65 20  of the sub-tree 
110f0 68 65 61 64 65 64 20 62 79 20 74 68 65 20 63 65  headed by the ce
11100 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 52  ll..    */.    R
11110 74 72 65 65 4e 6f 64 65 20 2a 70 49 6e 73 65 72  treeNode *pInser
11120 74 3b 0a 20 20 20 20 52 74 72 65 65 43 65 6c 6c  t;.    RtreeCell
11130 20 2a 70 20 3d 20 26 61 43 65 6c 6c 5b 61 4f 72   *p = &aCell[aOr
11140 64 65 72 5b 69 69 5d 5d 3b 0a 20 20 20 20 72 63  der[ii]];.    rc
11150 20 3d 20 43 68 6f 6f 73 65 4c 65 61 66 28 70 52   = ChooseLeaf(pR
11160 74 72 65 65 2c 20 70 2c 20 69 48 65 69 67 68 74  tree, p, iHeight
11170 2c 20 26 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  , &pInsert);.   
11180 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11190 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
111a0 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc2;.      rc = 
111b0 72 74 72 65 65 49 6e 73 65 72 74 43 65 6c 6c 28  rtreeInsertCell(
111c0 70 52 74 72 65 65 2c 20 70 49 6e 73 65 72 74 2c  pRtree, pInsert,
111d0 20 70 2c 20 69 48 65 69 67 68 74 29 3b 0a 20 20   p, iHeight);.  
111e0 20 20 20 20 72 63 32 20 3d 20 6e 6f 64 65 52 65      rc2 = nodeRe
111f0 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 49  lease(pRtree, pI
11200 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 69 66  nsert);.      if
11210 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11220 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
11230 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
11240 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
11250 33 5f 66 72 65 65 28 61 43 65 6c 6c 29 3b 0a 20  3_free(aCell);. 
11260 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11270 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 65 6c 6c  *.** Insert cell
11280 20 70 43 65 6c 6c 20 69 6e 74 6f 20 6e 6f 64 65   pCell into node
11290 20 70 4e 6f 64 65 2e 20 4e 6f 64 65 20 70 4e 6f   pNode. Node pNo
112a0 64 65 20 69 73 20 74 68 65 20 68 65 61 64 20 6f  de is the head o
112b0 66 20 61 20 0a 2a 2a 20 73 75 62 74 72 65 65 20  f a .** subtree 
112c0 69 48 65 69 67 68 74 20 68 69 67 68 20 28 6c 65  iHeight high (le
112d0 61 66 20 6e 6f 64 65 73 20 68 61 76 65 20 69 48  af nodes have iH
112e0 65 69 67 68 74 3d 3d 30 29 2e 0a 2a 2f 0a 73 74  eight==0)..*/.st
112f0 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 49 6e  atic int rtreeIn
11300 73 65 72 74 43 65 6c 6c 28 0a 20 20 52 74 72 65  sertCell(.  Rtre
11310 65 20 2a 70 52 74 72 65 65 2c 0a 20 20 52 74 72  e *pRtree,.  Rtr
11320 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20  eeNode *pNode,. 
11330 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c   RtreeCell *pCel
11340 6c 2c 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74  l,.  int iHeight
11350 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
11360 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
11370 69 48 65 69 67 68 74 3e 30 20 29 7b 0a 20 20 20  iHeight>0 ){.   
11380 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 43 68 69   RtreeNode *pChi
11390 6c 64 20 3d 20 6e 6f 64 65 48 61 73 68 4c 6f 6f  ld = nodeHashLoo
113a0 6b 75 70 28 70 52 74 72 65 65 2c 20 70 43 65 6c  kup(pRtree, pCel
113b0 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  l->iRowid);.    
113c0 69 66 28 20 70 43 68 69 6c 64 20 29 7b 0a 20 20  if( pChild ){.  
113d0 20 20 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28      nodeRelease(
113e0 70 52 74 72 65 65 2c 20 70 43 68 69 6c 64 2d 3e  pRtree, pChild->
113f0 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  pParent);.      
11400 6e 6f 64 65 52 65 66 65 72 65 6e 63 65 28 70 4e  nodeReference(pN
11410 6f 64 65 29 3b 0a 20 20 20 20 20 20 70 43 68 69  ode);.      pChi
11420 6c 64 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e  ld->pParent = pN
11430 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ode;.    }.  }. 
11440 20 69 66 28 20 6e 6f 64 65 49 6e 73 65 72 74 43   if( nodeInsertC
11450 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ell(pRtree, pNod
11460 65 2c 20 70 43 65 6c 6c 29 20 29 7b 0a 23 69 66  e, pCell) ){.#if
11470 20 56 41 52 49 41 4e 54 5f 52 53 54 41 52 54 52   VARIANT_RSTARTR
11480 45 45 5f 52 45 49 4e 53 45 52 54 0a 20 20 20 20  EE_REINSERT.    
11490 69 66 28 20 69 48 65 69 67 68 74 3c 3d 70 52 74  if( iHeight<=pRt
114a0 72 65 65 2d 3e 69 52 65 69 6e 73 65 72 74 48 65  ree->iReinsertHe
114b0 69 67 68 74 20 7c 7c 20 70 4e 6f 64 65 2d 3e 69  ight || pNode->i
114c0 4e 6f 64 65 3d 3d 31 29 7b 0a 20 20 20 20 20 20  Node==1){.      
114d0 72 63 20 3d 20 53 70 6c 69 74 4e 6f 64 65 28 70  rc = SplitNode(p
114e0 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 70 43  Rtree, pNode, pC
114f0 65 6c 6c 2c 20 69 48 65 69 67 68 74 29 3b 0a 20  ell, iHeight);. 
11500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11510 70 52 74 72 65 65 2d 3e 69 52 65 69 6e 73 65 72  pRtree->iReinser
11520 74 48 65 69 67 68 74 20 3d 20 69 48 65 69 67 68  tHeight = iHeigh
11530 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 52 65  t;.      rc = Re
11540 69 6e 73 65 72 74 28 70 52 74 72 65 65 2c 20 70  insert(pRtree, p
11550 4e 6f 64 65 2c 20 70 43 65 6c 6c 2c 20 69 48 65  Node, pCell, iHe
11560 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6c  ight);.    }.#el
11570 73 65 0a 20 20 20 20 72 63 20 3d 20 53 70 6c 69  se.    rc = Spli
11580 74 4e 6f 64 65 28 70 52 74 72 65 65 2c 20 70 4e  tNode(pRtree, pN
11590 6f 64 65 2c 20 70 43 65 6c 6c 2c 20 69 48 65 69  ode, pCell, iHei
115a0 67 68 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ght);.#endif.  }
115b0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 41  else{.    rc = A
115c0 64 6a 75 73 74 54 72 65 65 28 70 52 74 72 65 65  djustTree(pRtree
115d0 2c 20 70 4e 6f 64 65 2c 20 70 43 65 6c 6c 29 3b  , pNode, pCell);
115e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
115f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11600 69 66 28 20 69 48 65 69 67 68 74 3d 3d 30 20 29  if( iHeight==0 )
11610 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
11620 6f 77 69 64 57 72 69 74 65 28 70 52 74 72 65 65  owidWrite(pRtree
11630 2c 20 70 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 2c  , pCell->iRowid,
11640 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a   pNode->iNode);.
11650 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11660 20 20 20 20 20 72 63 20 3d 20 70 61 72 65 6e 74       rc = parent
11670 57 72 69 74 65 28 70 52 74 72 65 65 2c 20 70 43  Write(pRtree, pC
11680 65 6c 6c 2d 3e 69 52 6f 77 69 64 2c 20 70 4e 6f  ell->iRowid, pNo
11690 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20  de->iNode);.    
116a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
116b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
116c0 61 74 69 63 20 69 6e 74 20 72 65 69 6e 73 65 72  atic int reinser
116d0 74 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 52 74 72  tNodeContent(Rtr
116e0 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65  ee *pRtree, Rtre
116f0 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20  eNode *pNode){. 
11700 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 72   int ii;.  int r
11710 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11720 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45   int nCell = NCE
11730 4c 4c 28 70 4e 6f 64 65 29 3b 0a 0a 20 20 66 6f  LL(pNode);..  fo
11740 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
11750 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 43 65 6c  TE_OK && ii<nCel
11760 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74  l; ii++){.    Rt
11770 72 65 65 4e 6f 64 65 20 2a 70 49 6e 73 65 72 74  reeNode *pInsert
11780 3b 0a 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20  ;.    RtreeCell 
11790 63 65 6c 6c 3b 0a 20 20 20 20 6e 6f 64 65 47 65  cell;.    nodeGe
117a0 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e  tCell(pRtree, pN
117b0 6f 64 65 2c 20 69 69 2c 20 26 63 65 6c 6c 29 3b  ode, ii, &cell);
117c0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20  ..    /* Find a 
117d0 6e 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  node to store th
117e0 69 73 20 63 65 6c 6c 20 69 6e 2e 20 70 4e 6f 64  is cell in. pNod
117f0 65 2d 3e 69 4e 6f 64 65 20 63 75 72 72 65 6e 74  e->iNode current
11800 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  ly contains.    
11810 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  ** the height of
11820 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65   the sub-tree he
11830 61 64 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  aded by the cell
11840 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
11850 3d 20 43 68 6f 6f 73 65 4c 65 61 66 28 70 52 74  = ChooseLeaf(pRt
11860 72 65 65 2c 20 26 63 65 6c 6c 2c 20 28 69 6e 74  ree, &cell, (int
11870 29 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 2c 20 26  )pNode->iNode, &
11880 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 69 66  pInsert);.    if
11890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
118a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
118b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 74 72  ;.      rc = rtr
118c0 65 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74  eeInsertCell(pRt
118d0 72 65 65 2c 20 70 49 6e 73 65 72 74 2c 20 26 63  ree, pInsert, &c
118e0 65 6c 6c 2c 20 28 69 6e 74 29 70 4e 6f 64 65 2d  ell, (int)pNode-
118f0 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 72  >iNode);.      r
11900 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65  c2 = nodeRelease
11910 28 70 52 74 72 65 65 2c 20 70 49 6e 73 65 72 74  (pRtree, pInsert
11920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
11930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11940 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
11950 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11960 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11970 0a 0a 2f 2a 0a 2a 2a 20 53 65 6c 65 63 74 20 61  ../*.** Select a
11980 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 75 73 65   currently unuse
11990 64 20 72 6f 77 69 64 20 66 6f 72 20 61 20 6e 65  d rowid for a ne
119a0 77 20 72 2d 74 72 65 65 20 72 65 63 6f 72 64 2e  w r-tree record.
119b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
119c0 65 77 52 6f 77 69 64 28 52 74 72 65 65 20 2a 70  ewRowid(Rtree *p
119d0 52 74 72 65 65 2c 20 69 36 34 20 2a 70 69 52 6f  Rtree, i64 *piRo
119e0 77 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  wid){.  int rc;.
119f0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
11a00 75 6c 6c 28 70 52 74 72 65 65 2d 3e 70 57 72 69  ull(pRtree->pWri
11a10 74 65 52 6f 77 69 64 2c 20 31 29 3b 0a 20 20 73  teRowid, 1);.  s
11a20 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
11a30 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52  (pRtree->pWriteR
11a40 6f 77 69 64 2c 20 32 29 3b 0a 20 20 73 71 6c 69  owid, 2);.  sqli
11a50 74 65 33 5f 73 74 65 70 28 70 52 74 72 65 65 2d  te3_step(pRtree-
11a60 3e 70 57 72 69 74 65 52 6f 77 69 64 29 3b 0a 20  >pWriteRowid);. 
11a70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
11a80 73 65 74 28 70 52 74 72 65 65 2d 3e 70 57 72 69  set(pRtree->pWri
11a90 74 65 52 6f 77 69 64 29 3b 0a 20 20 2a 70 69 52  teRowid);.  *piR
11aa0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  owid = sqlite3_l
11ab0 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
11ac0 28 70 52 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  (pRtree->db);.  
11ad0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11ae0 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 65  .** Remove the e
11af0 6e 74 72 79 20 77 69 74 68 20 72 6f 77 69 64 3d  ntry with rowid=
11b00 69 44 65 6c 65 74 65 20 66 72 6f 6d 20 74 68 65  iDelete from the
11b10 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   r-tree structur
11b20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11b30 20 72 74 72 65 65 44 65 6c 65 74 65 52 6f 77 69   rtreeDeleteRowi
11b40 64 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  d(Rtree *pRtree,
11b50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
11b60 44 65 6c 65 74 65 29 7b 0a 20 20 69 6e 74 20 72  Delete){.  int r
11b70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
11b90 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 52  turn code */.  R
11ba0 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65 61 66 3b  treeNode *pLeaf;
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11bc0 2a 20 4c 65 61 66 20 6e 6f 64 65 20 63 6f 6e 74  * Leaf node cont
11bd0 61 69 6e 69 6e 67 20 72 65 63 6f 72 64 20 69 44  aining record iD
11be0 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  elete */.  int i
11bf0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
11c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
11c10 64 65 78 20 6f 66 20 69 44 65 6c 65 74 65 20 63  dex of iDelete c
11c20 65 6c 6c 20 69 6e 20 70 4c 65 61 66 20 2a 2f 0a  ell in pLeaf */.
11c30 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 52 6f    RtreeNode *pRo
11c40 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
11c50 20 20 2f 2a 20 52 6f 6f 74 20 6e 6f 64 65 20 6f    /* Root node o
11c60 66 20 72 74 72 65 65 20 73 74 72 75 63 74 75 72  f rtree structur
11c70 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 4f 62 74 61  e */...  /* Obta
11c80 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
11c90 6f 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20  o the root node 
11ca0 74 6f 20 69 6e 69 74 69 61 6c 69 73 65 20 52 74  to initialise Rt
11cb0 72 65 65 2e 69 44 65 70 74 68 20 2a 2f 0a 20 20  ree.iDepth */.  
11cc0 72 63 20 3d 20 6e 6f 64 65 41 63 71 75 69 72 65  rc = nodeAcquire
11cd0 28 70 52 74 72 65 65 2c 20 31 2c 20 30 2c 20 26  (pRtree, 1, 0, &
11ce0 70 52 6f 6f 74 29 3b 0a 0a 20 20 2f 2a 20 4f 62  pRoot);..  /* Ob
11cf0 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
11d00 20 74 6f 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   to the leaf nod
11d10 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
11d20 74 68 65 20 65 6e 74 72 79 20 0a 20 20 2a 2a 20  the entry .  ** 
11d30 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65  about to be dele
11d40 74 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  ted. .  */.  if(
11d50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11d60 7b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c  {.    rc = findL
11d70 65 61 66 4e 6f 64 65 28 70 52 74 72 65 65 2c 20  eafNode(pRtree, 
11d80 69 44 65 6c 65 74 65 2c 20 26 70 4c 65 61 66 29  iDelete, &pLeaf)
11d90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
11da0 74 65 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 71  te the cell in q
11db0 75 65 73 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  uestion from the
11dc0 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20   leaf node. */. 
11dd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11de0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
11df0 32 3b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65  2;.    rc = node
11e00 52 6f 77 69 64 49 6e 64 65 78 28 70 52 74 72 65  RowidIndex(pRtre
11e10 65 2c 20 70 4c 65 61 66 2c 20 69 44 65 6c 65 74  e, pLeaf, iDelet
11e20 65 2c 20 26 69 43 65 6c 6c 29 3b 0a 20 20 20 20  e, &iCell);.    
11e30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11e40 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
11e50 64 65 6c 65 74 65 43 65 6c 6c 28 70 52 74 72 65  deleteCell(pRtre
11e60 65 2c 20 70 4c 65 61 66 2c 20 69 43 65 6c 6c 2c  e, pLeaf, iCell,
11e70 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
11e80 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65  c2 = nodeRelease
11e90 28 70 52 74 72 65 65 2c 20 70 4c 65 61 66 29 3b  (pRtree, pLeaf);
11ea0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11eb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11ec0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
11ed0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
11ee0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
11ef0 6e 67 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ng entry in the 
11f00 3c 72 74 72 65 65 3e 5f 72 6f 77 69 64 20 74 61  <rtree>_rowid ta
11f10 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ble. */.  if( rc
11f20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11f30 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
11f40 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70 44  int64(pRtree->pD
11f50 65 6c 65 74 65 52 6f 77 69 64 2c 20 31 2c 20 69  eleteRowid, 1, i
11f60 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 73 71 6c  Delete);.    sql
11f70 69 74 65 33 5f 73 74 65 70 28 70 52 74 72 65 65  ite3_step(pRtree
11f80 2d 3e 70 44 65 6c 65 74 65 52 6f 77 69 64 29 3b  ->pDeleteRowid);
11f90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11fa0 33 5f 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e  3_reset(pRtree->
11fb0 70 44 65 6c 65 74 65 52 6f 77 69 64 29 3b 0a 20  pDeleteRowid);. 
11fc0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
11fd0 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20  f the root node 
11fe0 6e 6f 77 20 68 61 73 20 65 78 61 63 74 6c 79 20  now has exactly 
11ff0 6f 6e 65 20 63 68 69 6c 64 2e 20 49 66 20 73 6f  one child. If so
12000 2c 20 72 65 6d 6f 76 65 0a 20 20 2a 2a 20 69 74  , remove.  ** it
12010 2c 20 73 63 68 65 64 75 6c 65 20 74 68 65 20 63  , schedule the c
12020 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
12030 68 69 6c 64 20 66 6f 72 20 72 65 69 6e 73 65 72  hild for reinser
12040 74 69 6f 6e 20 61 6e 64 20 0a 20 20 2a 2a 20 72  tion and .  ** r
12050 65 64 75 63 65 20 74 68 65 20 74 72 65 65 20 68  educe the tree h
12060 65 69 67 68 74 20 62 79 20 6f 6e 65 2e 0a 20 20  eight by one..  
12070 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
12080 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 63 6f  equivalent to co
12090 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
120a0 74 73 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ts of the child 
120b0 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 72 6f  into.  ** the ro
120c0 6f 74 20 6e 6f 64 65 20 28 74 68 65 20 6f 70 65  ot node (the ope
120d0 72 61 74 69 6f 6e 20 74 68 61 74 20 47 75 74 6d  ration that Gutm
120e0 61 6e 27 73 20 70 61 70 65 72 20 73 61 79 73 20  an's paper says 
120f0 74 6f 20 70 65 72 66 6f 72 6d 20 0a 20 20 2a 2a  to perform .  **
12100 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
12110 6f 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  o)..  */.  if( r
12120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
12130 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 3e 30  pRtree->iDepth>0
12140 20 26 26 20 4e 43 45 4c 4c 28 70 52 6f 6f 74 29   && NCELL(pRoot)
12150 3d 3d 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ==1 ){.    int r
12160 63 32 3b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64  c2;.    RtreeNod
12170 65 20 2a 70 43 68 69 6c 64 3b 0a 20 20 20 20 69  e *pChild;.    i
12180 36 34 20 69 43 68 69 6c 64 20 3d 20 6e 6f 64 65  64 iChild = node
12190 47 65 74 52 6f 77 69 64 28 70 52 74 72 65 65 2c  GetRowid(pRtree,
121a0 20 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20   pRoot, 0);.    
121b0 72 63 20 3d 20 6e 6f 64 65 41 63 71 75 69 72 65  rc = nodeAcquire
121c0 28 70 52 74 72 65 65 2c 20 69 43 68 69 6c 64 2c  (pRtree, iChild,
121d0 20 70 52 6f 6f 74 2c 20 26 70 43 68 69 6c 64 29   pRoot, &pChild)
121e0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
121f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12200 20 72 63 20 3d 20 72 65 6d 6f 76 65 4e 6f 64 65   rc = removeNode
12210 28 70 52 74 72 65 65 2c 20 70 43 68 69 6c 64 2c  (pRtree, pChild,
12220 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 2d   pRtree->iDepth-
12230 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  1);.    }.    rc
12240 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28  2 = nodeRelease(
12250 70 52 74 72 65 65 2c 20 70 43 68 69 6c 64 29 3b  pRtree, pChild);
12260 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
12270 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
12280 32 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  2;.    if( rc==S
12290 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
122a0 20 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68    pRtree->iDepth
122b0 2d 2d 3b 0a 20 20 20 20 20 20 77 72 69 74 65 49  --;.      writeI
122c0 6e 74 31 36 28 70 52 6f 6f 74 2d 3e 7a 44 61 74  nt16(pRoot->zDat
122d0 61 2c 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74  a, pRtree->iDept
122e0 68 29 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d  h);.      pRoot-
122f0 3e 69 73 44 69 72 74 79 20 3d 20 31 3b 0a 20 20  >isDirty = 1;.  
12300 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
12310 2d 69 6e 73 65 72 74 20 74 68 65 20 63 6f 6e 74  -insert the cont
12320 65 6e 74 73 20 6f 66 20 61 6e 79 20 75 6e 64 65  ents of any unde
12330 72 66 75 6c 6c 20 6e 6f 64 65 73 20 72 65 6d 6f  rfull nodes remo
12340 76 65 64 20 66 72 6f 6d 20 74 68 65 20 74 72 65  ved from the tre
12350 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 65 61  e. */.  for(pLea
12360 66 3d 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74  f=pRtree->pDelet
12370 65 64 3b 20 70 4c 65 61 66 3b 20 70 4c 65 61 66  ed; pLeaf; pLeaf
12380 3d 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65  =pRtree->pDelete
12390 64 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d){.    if( rc==
123a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
123b0 20 20 20 72 63 20 3d 20 72 65 69 6e 73 65 72 74     rc = reinsert
123c0 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 74 72  NodeContent(pRtr
123d0 65 65 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20  ee, pLeaf);.    
123e0 7d 0a 20 20 20 20 70 52 74 72 65 65 2d 3e 70 44  }.    pRtree->pD
123f0 65 6c 65 74 65 64 20 3d 20 70 4c 65 61 66 2d 3e  eleted = pLeaf->
12400 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
12410 65 33 5f 66 72 65 65 28 70 4c 65 61 66 29 3b 0a  e3_free(pLeaf);.
12420 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73    }..  /* Releas
12430 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
12440 74 6f 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  to the root node
12450 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
12460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12470 72 63 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65  rc = nodeRelease
12480 28 70 52 74 72 65 65 2c 20 70 52 6f 6f 74 29 3b  (pRtree, pRoot);
12490 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 6f  .  }else{.    no
124a0 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65  deRelease(pRtree
124b0 2c 20 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 0a 20  , pRoot);.  }.. 
124c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
124d0 2a 0a 2a 2a 20 54 68 65 20 78 55 70 64 61 74 65  *.** The xUpdate
124e0 20 6d 65 74 68 6f 64 20 66 6f 72 20 72 74 72 65   method for rtre
124f0 65 20 6d 6f 64 75 6c 65 20 76 69 72 74 75 61 6c  e module virtual
12500 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
12510 69 63 20 69 6e 74 20 72 74 72 65 65 55 70 64 61  ic int rtreeUpda
12520 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  te(.  sqlite3_vt
12530 61 62 20 2a 70 56 74 61 62 2c 20 0a 20 20 69 6e  ab *pVtab, .  in
12540 74 20 6e 44 61 74 61 2c 20 0a 20 20 73 71 6c 69  t nData, .  sqli
12550 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 7a 44 61  te3_value **azDa
12560 74 61 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e  ta, .  sqlite_in
12570 74 36 34 20 2a 70 52 6f 77 69 64 0a 29 7b 0a 20  t64 *pRowid.){. 
12580 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d   Rtree *pRtree =
12590 20 28 52 74 72 65 65 20 2a 29 70 56 74 61 62 3b   (Rtree *)pVtab;
125a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
125b0 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 43 65  TE_OK;.  RtreeCe
125c0 6c 6c 20 63 65 6c 6c 3b 20 20 20 20 20 20 20 20  ll cell;        
125d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
125e0 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69  cell to insert i
125f0 66 20 6e 44 61 74 61 3e 31 20 2a 2f 0a 20 20 69  f nData>1 */.  i
12600 6e 74 20 62 48 61 76 65 52 6f 77 69 64 20 3d 20  nt bHaveRowid = 
12610 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
12620 2a 20 53 65 74 20 74 6f 20 31 20 61 66 74 65 72  * Set to 1 after
12630 20 6e 65 77 20 72 6f 77 69 64 20 69 73 20 64 65   new rowid is de
12640 74 65 72 6d 69 6e 65 64 20 2a 2f 0a 0a 20 20 72  termined */..  r
12650 74 72 65 65 52 65 66 65 72 65 6e 63 65 28 70 52  treeReference(pR
12660 74 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74 28  tree);.  assert(
12670 6e 44 61 74 61 3e 3d 31 29 3b 0a 0a 20 20 2f 2a  nData>=1);..  /*
12680 20 43 6f 6e 73 74 72 61 69 6e 74 20 68 61 6e 64   Constraint hand
12690 6c 69 6e 67 2e 20 41 20 77 72 69 74 65 20 6f 70  ling. A write op
126a0 65 72 61 74 69 6f 6e 20 6f 6e 20 61 6e 20 72 2d  eration on an r-
126b0 74 72 65 65 20 74 61 62 6c 65 20 6d 61 79 20 72  tree table may r
126c0 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
126d0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 66 6f 72  E_CONSTRAINT for
126e0 20 74 77 6f 20 72 65 61 73 6f 6e 73 3a 0a 20 20   two reasons:.  
126f0 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 20 64  **.  **   1. A d
12700 75 70 6c 69 63 61 74 65 20 72 6f 77 69 64 20 76  uplicate rowid v
12710 61 6c 75 65 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  alue, or.  **   
12720 32 2e 20 54 68 65 20 73 75 70 70 6c 69 65 64 20  2. The supplied 
12730 64 61 74 61 20 76 69 6f 6c 61 74 65 73 20 74 68  data violates th
12740 65 20 22 78 32 3e 3d 78 31 22 20 63 6f 6e 73 74  e "x2>=x1" const
12750 72 61 69 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  raint..  **.  **
12760 20 49 6e 20 74 68 65 20 66 69 72 73 74 20 63 61   In the first ca
12770 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c  se, if the confl
12780 69 63 74 2d 68 61 6e 64 6c 69 6e 67 20 6d 6f 64  ict-handling mod
12790 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68  e is REPLACE, th
127a0 65 6e 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e 66  en.  ** the conf
127b0 6c 69 63 74 69 6e 67 20 72 6f 77 20 63 61 6e 20  licting row can 
127c0 62 65 20 72 65 6d 6f 76 65 64 20 62 65 66 6f 72  be removed befor
127d0 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 49 6e  e proceeding. In
127e0 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a   the second.  **
127f0 20 63 61 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f   case, SQLITE_CO
12800 4e 53 54 52 41 49 4e 54 20 6d 75 73 74 20 62 65  NSTRAINT must be
12810 20 72 65 74 75 72 6e 65 64 20 72 65 67 61 72 64   returned regard
12820 6c 65 73 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  less of the.  **
12830 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 69   conflict-handli
12840 6e 67 20 6d 6f 64 65 20 73 70 65 63 69 66 69 65  ng mode specifie
12850 64 20 62 79 20 74 68 65 20 75 73 65 72 2e 0a 20  d by the user.. 
12860 20 2a 2f 0a 20 20 69 66 28 20 6e 44 61 74 61 3e   */.  if( nData>
12870 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  1 ){.    int ii;
12880 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  ..    /* Populat
12890 65 20 74 68 65 20 63 65 6c 6c 2e 61 43 6f 6f 72  e the cell.aCoor
128a0 64 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66  d[] array. The f
128b0 69 72 73 74 20 63 6f 6f 72 64 69 6e 61 74 65 20  irst coordinate 
128c0 69 73 20 61 7a 44 61 74 61 5b 33 5d 2e 20 2a 2f  is azData[3]. */
128d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 61  .    assert( nDa
128e0 74 61 3d 3d 28 70 52 74 72 65 65 2d 3e 6e 44 69  ta==(pRtree->nDi
128f0 6d 2a 32 20 2b 20 33 29 20 29 3b 0a 20 20 20 20  m*2 + 3) );.    
12900 69 66 28 20 70 52 74 72 65 65 2d 3e 65 43 6f 6f  if( pRtree->eCoo
12910 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f 43 4f  rdType==RTREE_CO
12920 4f 52 44 5f 52 45 41 4c 33 32 20 29 7b 0a 20 20  ORD_REAL32 ){.  
12930 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
12940 3c 28 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 32  <(pRtree->nDim*2
12950 29 3b 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 20  ); ii+=2){.     
12960 20 20 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69     cell.aCoord[i
12970 69 5d 2e 66 20 3d 20 28 66 6c 6f 61 74 29 73 71  i].f = (float)sq
12980 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
12990 6c 65 28 61 7a 44 61 74 61 5b 69 69 2b 33 5d 29  le(azData[ii+3])
129a0 3b 0a 20 20 20 20 20 20 20 20 63 65 6c 6c 2e 61  ;.        cell.a
129b0 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 66 20 3d 20  Coord[ii+1].f = 
129c0 28 66 6c 6f 61 74 29 73 71 6c 69 74 65 33 5f 76  (float)sqlite3_v
129d0 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 7a 44 61  alue_double(azDa
129e0 74 61 5b 69 69 2b 34 5d 29 3b 0a 20 20 20 20 20  ta[ii+4]);.     
129f0 20 20 20 69 66 28 20 63 65 6c 6c 2e 61 43 6f 6f     if( cell.aCoo
12a00 72 64 5b 69 69 5d 2e 66 3e 63 65 6c 6c 2e 61 43  rd[ii].f>cell.aC
12a10 6f 6f 72 64 5b 69 69 2b 31 5d 2e 66 20 29 7b 0a  oord[ii+1].f ){.
12a20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
12a30 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12a40 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
12a50 20 63 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20   constraint;.   
12a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12a80 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 28 70 52  for(ii=0; ii<(pR
12a90 74 72 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20 69  tree->nDim*2); i
12aa0 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 63  i+=2){.        c
12ab0 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 5d 2e 69  ell.aCoord[ii].i
12ac0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
12ad0 5f 69 6e 74 28 61 7a 44 61 74 61 5b 69 69 2b 33  _int(azData[ii+3
12ae0 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 65 6c 6c  ]);.        cell
12af0 2e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69 20  .aCoord[ii+1].i 
12b00 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
12b10 69 6e 74 28 61 7a 44 61 74 61 5b 69 69 2b 34 5d  int(azData[ii+4]
12b20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
12b30 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 5d 2e 69  ell.aCoord[ii].i
12b40 3e 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b  >cell.aCoord[ii+
12b50 31 5d 2e 69 20 29 7b 0a 20 20 20 20 20 20 20 20  1].i ){.        
12b60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
12b70 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
12b80 20 20 20 20 67 6f 74 6f 20 63 6f 6e 73 74 72 61      goto constra
12b90 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  int;.        }. 
12ba0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
12bb0 20 20 2f 2a 20 49 66 20 61 20 72 6f 77 69 64 20    /* If a rowid 
12bc0 76 61 6c 75 65 20 77 61 73 20 73 75 70 70 6c 69  value was suppli
12bd0 65 64 2c 20 63 68 65 63 6b 20 69 66 20 69 74 20  ed, check if it 
12be0 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  is already prese
12bf0 6e 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68  nt in .    ** th
12c00 65 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20  e table. If so, 
12c10 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  the constraint h
12c20 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20  as failed. */.  
12c30 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
12c40 6c 75 65 5f 74 79 70 65 28 61 7a 44 61 74 61 5b  lue_type(azData[
12c50 32 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  2])!=SQLITE_NULL
12c60 20 29 7b 0a 20 20 20 20 20 20 63 65 6c 6c 2e 69   ){.      cell.i
12c70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
12c80 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 7a 44 61  value_int64(azDa
12c90 74 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[2]);.      if
12ca0 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
12cb0 74 79 70 65 28 61 7a 44 61 74 61 5b 30 5d 29 3d  type(azData[0])=
12cc0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20  =SQLITE_NULL.   
12cd0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76      || sqlite3_v
12ce0 61 6c 75 65 5f 69 6e 74 36 34 28 61 7a 44 61 74  alue_int64(azDat
12cf0 61 5b 30 5d 29 21 3d 63 65 6c 6c 2e 69 52 6f 77  a[0])!=cell.iRow
12d00 69 64 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  id.      ){.    
12d10 20 20 20 20 69 6e 74 20 73 74 65 70 72 63 3b 0a      int steprc;.
12d20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12d30 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65  bind_int64(pRtre
12d40 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 2c 20 31  e->pReadRowid, 1
12d50 2c 20 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a  , cell.iRowid);.
12d60 20 20 20 20 20 20 20 20 73 74 65 70 72 63 20 3d          steprc =
12d70 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52   sqlite3_step(pR
12d80 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64  tree->pReadRowid
12d90 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
12da0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52  sqlite3_reset(pR
12db0 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64  tree->pReadRowid
12dc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53  );.        if( S
12dd0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 74 65 70 72  QLITE_ROW==stepr
12de0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  c ){.          i
12df0 66 28 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  f( sqlite3_vtab_
12e00 6f 6e 5f 63 6f 6e 66 6c 69 63 74 28 70 52 74 72  on_conflict(pRtr
12e10 65 65 2d 3e 64 62 29 3d 3d 53 51 4c 49 54 45 5f  ee->db)==SQLITE_
12e20 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20 20  REPLACE ){.     
12e30 20 20 20 20 20 20 20 72 63 20 3d 20 72 74 72 65         rc = rtre
12e40 65 44 65 6c 65 74 65 52 6f 77 69 64 28 70 52 74  eDeleteRowid(pRt
12e50 72 65 65 2c 20 63 65 6c 6c 2e 69 52 6f 77 69 64  ree, cell.iRowid
12e60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
12e70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
12e80 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
12e90 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
12ea0 20 20 20 20 67 6f 74 6f 20 63 6f 6e 73 74 72 61      goto constra
12eb0 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  int;.          }
12ec0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12ed0 20 7d 0a 20 20 20 20 20 20 62 48 61 76 65 52 6f   }.      bHaveRo
12ee0 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  wid = 1;.    }. 
12ef0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 7a 44 61   }..  /* If azDa
12f00 74 61 5b 30 5d 20 69 73 20 6e 6f 74 20 61 6e 20  ta[0] is not an 
12f10 53 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  SQL NULL value, 
12f20 69 74 20 69 73 20 74 68 65 20 72 6f 77 69 64 20  it is the rowid 
12f30 6f 66 20 61 0a 20 20 2a 2a 20 72 65 63 6f 72 64  of a.  ** record
12f40 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d 20   to delete from 
12f50 74 68 65 20 72 2d 74 72 65 65 20 74 61 62 6c 65  the r-tree table
12f60 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
12f70 62 6c 6f 63 6b 20 64 6f 65 73 0a 20 20 2a 2a 20  block does.  ** 
12f80 6a 75 73 74 20 74 68 61 74 2e 0a 20 20 2a 2f 0a  just that..  */.
12f90 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
12fa0 6c 75 65 5f 74 79 70 65 28 61 7a 44 61 74 61 5b  lue_type(azData[
12fb0 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])!=SQLITE_NULL
12fc0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 74 72   ){.    rc = rtr
12fd0 65 65 44 65 6c 65 74 65 52 6f 77 69 64 28 70 52  eeDeleteRowid(pR
12fe0 74 72 65 65 2c 20 73 71 6c 69 74 65 33 5f 76 61  tree, sqlite3_va
12ff0 6c 75 65 5f 69 6e 74 36 34 28 61 7a 44 61 74 61  lue_int64(azData
13000 5b 30 5d 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  [0]));.  }..  /*
13010 20 49 66 20 74 68 65 20 61 7a 44 61 74 61 5b 5d   If the azData[]
13020 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
13030 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c  more than one el
13040 65 6d 65 6e 74 2c 20 65 6c 65 6d 65 6e 74 73 0a  ement, elements.
13050 20 20 2a 2a 20 28 61 7a 44 61 74 61 5b 32 5d 2e    ** (azData[2].
13060 2e 61 7a 44 61 74 61 5b 61 72 67 63 2d 31 5d 29  .azData[argc-1])
13070 20 63 6f 6e 74 61 69 6e 20 61 20 6e 65 77 20 72   contain a new r
13080 65 63 6f 72 64 20 74 6f 20 69 6e 73 65 72 74 20  ecord to insert 
13090 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 72 2d  into.  ** the r-
130a0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
130b0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
130c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 44 61 74  QLITE_OK && nDat
130d0 61 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  a>1 ){.    /* In
130e0 73 65 72 74 20 74 68 65 20 6e 65 77 20 72 65 63  sert the new rec
130f0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 72 2d 74  ord into the r-t
13100 72 65 65 20 2a 2f 0a 20 20 20 20 52 74 72 65 65  ree */.    Rtree
13110 4e 6f 64 65 20 2a 70 4c 65 61 66 3b 0a 0a 20 20  Node *pLeaf;..  
13120 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
13130 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
13140 20 6e 65 77 20 72 6f 77 2e 20 2a 2f 0a 20 20 20   new row. */.   
13150 20 69 66 28 20 62 48 61 76 65 52 6f 77 69 64 3d   if( bHaveRowid=
13160 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
13170 20 6e 65 77 52 6f 77 69 64 28 70 52 74 72 65 65   newRowid(pRtree
13180 2c 20 26 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b  , &cell.iRowid);
13190 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 6f 77  .    }.    *pRow
131a0 69 64 20 3d 20 63 65 6c 6c 2e 69 52 6f 77 69 64  id = cell.iRowid
131b0 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
131c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
131d0 20 20 72 63 20 3d 20 43 68 6f 6f 73 65 4c 65 61    rc = ChooseLea
131e0 66 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c  f(pRtree, &cell,
131f0 20 30 2c 20 26 70 4c 65 61 66 29 3b 0a 20 20 20   0, &pLeaf);.   
13200 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
13210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13220 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20    int rc2;.     
13230 20 70 52 74 72 65 65 2d 3e 69 52 65 69 6e 73 65   pRtree->iReinse
13240 72 74 48 65 69 67 68 74 20 3d 20 2d 31 3b 0a 20  rtHeight = -1;. 
13250 20 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 49       rc = rtreeI
13260 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65  nsertCell(pRtree
13270 2c 20 70 4c 65 61 66 2c 20 26 63 65 6c 6c 2c 20  , pLeaf, &cell, 
13280 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20  0);.      rc2 = 
13290 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74 72  nodeRelease(pRtr
132a0 65 65 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20  ee, pLeaf);.    
132b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
132c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
132d0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d  c = rc2;.      }
132e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 63 6f 6e 73  .    }.  }..cons
132f0 74 72 61 69 6e 74 3a 0a 20 20 72 74 72 65 65 52  traint:.  rtreeR
13300 65 6c 65 61 73 65 28 70 52 74 72 65 65 29 3b 0a  elease(pRtree);.
13310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13320 2f 2a 0a 2a 2a 20 54 68 65 20 78 52 65 6e 61 6d  /*.** The xRenam
13330 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 72 74 72  e method for rtr
13340 65 65 20 6d 6f 64 75 6c 65 20 76 69 72 74 75 61  ee module virtua
13350 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  l tables..*/.sta
13360 74 69 63 20 69 6e 74 20 72 74 72 65 65 52 65 6e  tic int rtreeRen
13370 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ame(sqlite3_vtab
13380 20 2a 70 56 74 61 62 2c 20 63 6f 6e 73 74 20 63   *pVtab, const c
13390 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 29 7b 0a  har *zNewName){.
133a0 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 20    Rtree *pRtree 
133b0 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74 61 62  = (Rtree *)pVtab
133c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
133d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 63 68 61  ITE_NOMEM;.  cha
133e0 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  r *zSql = sqlite
133f0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 22  3_mprintf(.    "
13400 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27  ALTER TABLE %Q.'
13410 25 71 5f 6e 6f 64 65 27 20 20 20 52 45 4e 41 4d  %q_node'   RENAM
13420 45 20 54 4f 20 5c 22 25 77 5f 6e 6f 64 65 5c 22  E TO \"%w_node\"
13430 3b 22 0a 20 20 20 20 22 41 4c 54 45 52 20 54 41  ;".    "ALTER TA
13440 42 4c 45 20 25 51 2e 27 25 71 5f 70 61 72 65 6e  BLE %Q.'%q_paren
13450 74 27 20 52 45 4e 41 4d 45 20 54 4f 20 5c 22 25  t' RENAME TO \"%
13460 77 5f 70 61 72 65 6e 74 5c 22 3b 22 0a 20 20 20  w_parent\";".   
13470 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51   "ALTER TABLE %Q
13480 2e 27 25 71 5f 72 6f 77 69 64 27 20 20 52 45 4e  .'%q_rowid'  REN
13490 41 4d 45 20 54 4f 20 5c 22 25 77 5f 72 6f 77 69  AME TO \"%w_rowi
134a0 64 5c 22 3b 22 0a 20 20 20 20 2c 20 70 52 74 72  d\";".    , pRtr
134b0 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d  ee->zDb, pRtree-
134c0 3e 7a 4e 61 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65  >zName, zNewName
134d0 20 0a 20 20 20 20 2c 20 70 52 74 72 65 65 2d 3e   .    , pRtree->
134e0 7a 44 62 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61  zDb, pRtree->zNa
134f0 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65 20 0a 20 20  me, zNewName .  
13500 20 20 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c    , pRtree->zDb,
13510 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20   pRtree->zName, 
13520 7a 4e 65 77 4e 61 6d 65 0a 20 20 29 3b 0a 20 20  zNewName.  );.  
13530 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20  if( zSql ){.    
13540 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
13550 63 28 70 52 74 72 65 65 2d 3e 64 62 2c 20 7a 53  c(pRtree->db, zS
13560 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ql, 0, 0, 0);.  
13570 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13580 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Sql);.  }.  retu
13590 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
135a0 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
135b0 72 74 72 65 65 4d 6f 64 75 6c 65 20 3d 20 7b 0a  rtreeModule = {.
135c0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
135e0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 72   iVersion */.  r
135f0 74 72 65 65 43 72 65 61 74 65 2c 20 20 20 20 20  treeCreate,     
13600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
13610 72 65 61 74 65 20 2d 20 63 72 65 61 74 65 20 61  reate - create a
13620 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65   table */.  rtre
13630 65 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  eConnect,       
13640 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e          /* xConn
13650 65 63 74 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f  ect - connect to
13660 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
13670 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65 42 65 73  le */.  rtreeBes
13680 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  tIndex,         
13690 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65      /* xBestInde
136a0 78 20 2d 20 44 65 74 65 72 6d 69 6e 65 20 73 65  x - Determine se
136b0 61 72 63 68 20 73 74 72 61 74 65 67 79 20 2a 2f  arch strategy */
136c0 0a 20 20 72 74 72 65 65 44 69 73 63 6f 6e 6e 65  .  rtreeDisconne
136d0 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct,            /
136e0 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20  * xDisconnect - 
136f0 44 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20  Disconnect from 
13700 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72  a table */.  rtr
13710 65 65 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20  eeDestroy,      
13720 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73           /* xDes
13730 74 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74 61  troy - Drop a ta
13740 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65 4f 70  ble */.  rtreeOp
13750 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
13760 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
13770 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
13780 0a 20 20 72 74 72 65 65 43 6c 6f 73 65 2c 20 20  .  rtreeClose,  
13790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
137a0 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65  * xClose - close
137b0 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 72   a cursor */.  r
137c0 74 72 65 65 46 69 6c 74 65 72 2c 20 20 20 20 20  treeFilter,     
137d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
137e0 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
137f0 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
13800 74 73 20 2a 2f 0a 20 20 72 74 72 65 65 4e 65 78  ts */.  rtreeNex
13810 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
13820 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61      /* xNext - a
13830 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20  dvance a cursor 
13840 2a 2f 0a 20 20 72 74 72 65 65 45 6f 66 2c 20 20  */.  rtreeEof,  
13850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13860 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 72 74   /* xEof */.  rt
13870 72 65 65 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  reeColumn,      
13880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
13890 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61  lumn - read data
138a0 20 2a 2f 0a 20 20 72 74 72 65 65 52 6f 77 69 64   */.  rtreeRowid
138b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
138c0 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65    /* xRowid - re
138d0 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 72 74 72  ad data */.  rtr
138e0 65 65 55 70 64 61 74 65 2c 20 20 20 20 20 20 20  eeUpdate,       
138f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64           /* xUpd
13900 61 74 65 20 2d 20 77 72 69 74 65 20 64 61 74 61  ate - write data
13910 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13930 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20 62 65    /* xBegin - be
13940 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
13950 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13970 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73 79 6e 63   /* xSync - sync
13980 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
13990 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
139b0 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f 6d 6d 69   xCommit - commi
139c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  t transaction */
139d0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
139f0 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f  * xRollback - ro
13a00 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69  llback transacti
13a10 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  on */.  0,      
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a30 20 20 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63      /* xFindFunc
13a40 74 69 6f 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20  tion - function 
13a50 6f 76 65 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20  overloading */. 
13a60 20 72 74 72 65 65 52 65 6e 61 6d 65 2c 20 20 20   rtreeRename,   
13a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a80 78 52 65 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65  xRename - rename
13a90 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
13aa0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
13ac0 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30  Savepoint */.  0
13ad0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
13af0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20 20 20  elease */.  0   
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b10 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
13b20 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 73 74  backTo */.};..st
13b30 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 53 71  atic int rtreeSq
13b40 6c 49 6e 69 74 28 0a 20 20 52 74 72 65 65 20 2a  lInit(.  Rtree *
13b50 70 52 74 72 65 65 2c 20 0a 20 20 73 71 6c 69 74  pRtree, .  sqlit
13b60 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3 *db, .  const
13b70 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63   char *zDb, .  c
13b80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 66  onst char *zPref
13b90 69 78 2c 20 0a 20 20 69 6e 74 20 69 73 43 72 65  ix, .  int isCre
13ba0 61 74 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  ate.){.  int rc 
13bb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
13bc0 23 64 65 66 69 6e 65 20 4e 5f 53 54 41 54 45 4d  #define N_STATEM
13bd0 45 4e 54 20 39 0a 20 20 73 74 61 74 69 63 20 63  ENT 9.  static c
13be0 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 71 6c  onst char *azSql
13bf0 5b 4e 5f 53 54 41 54 45 4d 45 4e 54 5d 20 3d 20  [N_STATEMENT] = 
13c00 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e  {.    /* Read an
13c10 64 20 77 72 69 74 65 20 74 68 65 20 78 78 78 5f  d write the xxx_
13c20 6e 6f 64 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  node table */.  
13c30 20 20 22 53 45 4c 45 43 54 20 64 61 74 61 20 46    "SELECT data F
13c40 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 6e 6f 64  ROM '%q'.'%q_nod
13c50 65 27 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f 20  e' WHERE nodeno 
13c60 3d 20 3a 31 22 2c 0a 20 20 20 20 22 49 4e 53 45  = :1",.    "INSE
13c70 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e  RT OR REPLACE IN
13c80 54 4f 20 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65  TO '%q'.'%q_node
13c90 27 20 56 41 4c 55 45 53 28 3a 31 2c 20 3a 32 29  ' VALUES(:1, :2)
13ca0 22 2c 0a 20 20 20 20 22 44 45 4c 45 54 45 20 46  ",.    "DELETE F
13cb0 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 6e 6f 64  ROM '%q'.'%q_nod
13cc0 65 27 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f 20  e' WHERE nodeno 
13cd0 3d 20 3a 31 22 2c 0a 0a 20 20 20 20 2f 2a 20 52  = :1",..    /* R
13ce0 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 74 68  ead and write th
13cf0 65 20 78 78 78 5f 72 6f 77 69 64 20 74 61 62 6c  e xxx_rowid tabl
13d00 65 20 2a 2f 0a 20 20 20 20 22 53 45 4c 45 43 54  e */.    "SELECT
13d10 20 6e 6f 64 65 6e 6f 20 46 52 4f 4d 20 27 25 71   nodeno FROM '%q
13d20 27 2e 27 25 71 5f 72 6f 77 69 64 27 20 57 48 45  '.'%q_rowid' WHE
13d30 52 45 20 72 6f 77 69 64 20 3d 20 3a 31 22 2c 0a  RE rowid = :1",.
13d40 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 52      "INSERT OR R
13d50 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71 27  EPLACE INTO '%q'
13d60 2e 27 25 71 5f 72 6f 77 69 64 27 20 56 41 4c 55  .'%q_rowid' VALU
13d70 45 53 28 3a 31 2c 20 3a 32 29 22 2c 0a 20 20 20  ES(:1, :2)",.   
13d80 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25   "DELETE FROM '%
13d90 71 27 2e 27 25 71 5f 72 6f 77 69 64 27 20 57 48  q'.'%q_rowid' WH
13da0 45 52 45 20 72 6f 77 69 64 20 3d 20 3a 31 22 2c  ERE rowid = :1",
13db0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e  ..    /* Read an
13dc0 64 20 77 72 69 74 65 20 74 68 65 20 78 78 78 5f  d write the xxx_
13dd0 70 61 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  parent table */.
13de0 20 20 20 20 22 53 45 4c 45 43 54 20 70 61 72 65      "SELECT pare
13df0 6e 74 6e 6f 64 65 20 46 52 4f 4d 20 27 25 71 27  ntnode FROM '%q'
13e00 2e 27 25 71 5f 70 61 72 65 6e 74 27 20 57 48 45  .'%q_parent' WHE
13e10 52 45 20 6e 6f 64 65 6e 6f 20 3d 20 3a 31 22 2c  RE nodeno = :1",
13e20 0a 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20  .    "INSERT OR 
13e30 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71  REPLACE INTO '%q
13e40 27 2e 27 25 71 5f 70 61 72 65 6e 74 27 20 56 41  '.'%q_parent' VA
13e50 4c 55 45 53 28 3a 31 2c 20 3a 32 29 22 2c 0a 20  LUES(:1, :2)",. 
13e60 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
13e70 27 25 71 27 2e 27 25 71 5f 70 61 72 65 6e 74 27  '%q'.'%q_parent'
13e80 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f 20 3d 20   WHERE nodeno = 
13e90 3a 31 22 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74  :1".  };.  sqlit
13ea0 65 33 5f 73 74 6d 74 20 2a 2a 61 70 70 53 74 6d  e3_stmt **appStm
13eb0 74 5b 4e 5f 53 54 41 54 45 4d 45 4e 54 5d 3b 0a  t[N_STATEMENT];.
13ec0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 70 52 74 72    int i;..  pRtr
13ed0 65 65 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 20 20  ee->db = db;..  
13ee0 69 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a  if( isCreate ){.
13ef0 20 20 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74      char *zCreat
13f00 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
13f10 6e 74 66 28 0a 22 43 52 45 41 54 45 20 54 41 42  ntf(."CREATE TAB
13f20 4c 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 6e  LE \"%w\".\"%w_n
13f30 6f 64 65 5c 22 28 6e 6f 64 65 6e 6f 20 49 4e 54  ode\"(nodeno INT
13f40 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
13f50 2c 20 64 61 74 61 20 42 4c 4f 42 29 3b 22 0a 22  , data BLOB);"."
13f60 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25  CREATE TABLE \"%
13f70 77 5c 22 2e 5c 22 25 77 5f 72 6f 77 69 64 5c 22  w\".\"%w_rowid\"
13f80 28 72 6f 77 69 64 20 49 4e 54 45 47 45 52 20 50  (rowid INTEGER P
13f90 52 49 4d 41 52 59 20 4b 45 59 2c 20 6e 6f 64 65  RIMARY KEY, node
13fa0 6e 6f 20 49 4e 54 45 47 45 52 29 3b 22 0a 22 43  no INTEGER);"."C
13fb0 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77  REATE TABLE \"%w
13fc0 5c 22 2e 5c 22 25 77 5f 70 61 72 65 6e 74 5c 22  \".\"%w_parent\"
13fd0 28 6e 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20  (nodeno INTEGER 
13fe0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 70 61 72  PRIMARY KEY, par
13ff0 65 6e 74 6e 6f 64 65 20 49 4e 54 45 47 45 52 29  entnode INTEGER)
14000 3b 22 0a 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;"."INSERT INTO 
14010 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27 20 56  '%q'.'%q_node' V
14020 41 4c 55 45 53 28 31 2c 20 7a 65 72 6f 62 6c 6f  ALUES(1, zeroblo
14030 62 28 25 64 29 29 22 2c 0a 20 20 20 20 20 20 7a  b(%d))",.      z
14040 44 62 2c 20 7a 50 72 65 66 69 78 2c 20 7a 44 62  Db, zPrefix, zDb
14050 2c 20 7a 50 72 65 66 69 78 2c 20 7a 44 62 2c 20  , zPrefix, zDb, 
14060 7a 50 72 65 66 69 78 2c 20 7a 44 62 2c 20 7a 50  zPrefix, zDb, zP
14070 72 65 66 69 78 2c 20 70 52 74 72 65 65 2d 3e 69  refix, pRtree->i
14080 4e 6f 64 65 53 69 7a 65 0a 20 20 20 20 29 3b 0a  NodeSize.    );.
14090 20 20 20 20 69 66 28 20 21 7a 43 72 65 61 74 65      if( !zCreate
140a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
140b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
140c0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
140d0 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
140e0 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29  Create, 0, 0, 0)
140f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14100 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20 20  ee(zCreate);.   
14110 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14120 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
14130 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
14140 0a 0a 20 20 61 70 70 53 74 6d 74 5b 30 5d 20 3d  ..  appStmt[0] =
14150 20 26 70 52 74 72 65 65 2d 3e 70 52 65 61 64 4e   &pRtree->pReadN
14160 6f 64 65 3b 0a 20 20 61 70 70 53 74 6d 74 5b 31  ode;.  appStmt[1
14170 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 57 72  ] = &pRtree->pWr
14180 69 74 65 4e 6f 64 65 3b 0a 20 20 61 70 70 53 74  iteNode;.  appSt
14190 6d 74 5b 32 5d 20 3d 20 26 70 52 74 72 65 65 2d  mt[2] = &pRtree-
141a0 3e 70 44 65 6c 65 74 65 4e 6f 64 65 3b 0a 20 20  >pDeleteNode;.  
141b0 61 70 70 53 74 6d 74 5b 33 5d 20 3d 20 26 70 52  appStmt[3] = &pR
141c0 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64  tree->pReadRowid
141d0 3b 0a 20 20 61 70 70 53 74 6d 74 5b 34 5d 20 3d  ;.  appStmt[4] =
141e0 20 26 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65   &pRtree->pWrite
141f0 52 6f 77 69 64 3b 0a 20 20 61 70 70 53 74 6d 74  Rowid;.  appStmt
14200 5b 35 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e 70  [5] = &pRtree->p
14210 44 65 6c 65 74 65 52 6f 77 69 64 3b 0a 20 20 61  DeleteRowid;.  a
14220 70 70 53 74 6d 74 5b 36 5d 20 3d 20 26 70 52 74  ppStmt[6] = &pRt
14230 72 65 65 2d 3e 70 52 65 61 64 50 61 72 65 6e 74  ree->pReadParent
14240 3b 0a 20 20 61 70 70 53 74 6d 74 5b 37 5d 20 3d  ;.  appStmt[7] =
14250 20 26 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65   &pRtree->pWrite
14260 50 61 72 65 6e 74 3b 0a 20 20 61 70 70 53 74 6d  Parent;.  appStm
14270 74 5b 38 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e  t[8] = &pRtree->
14280 70 44 65 6c 65 74 65 50 61 72 65 6e 74 3b 0a 0a  pDeleteParent;..
14290 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53    for(i=0; i<N_S
142a0 54 41 54 45 4d 45 4e 54 20 26 26 20 72 63 3d 3d  TATEMENT && rc==
142b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
142c0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  .    char *zSql 
142d0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
142e0 66 28 61 7a 53 71 6c 5b 69 5d 2c 20 7a 44 62 2c  f(azSql[i], zDb,
142f0 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 69   zPrefix);.    i
14300 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  f( zSql ){.     
14310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
14320 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
14330 6c 2c 20 2d 31 2c 20 61 70 70 53 74 6d 74 5b 69  l, -1, appStmt[i
14340 5d 2c 20 30 29 3b 20 0a 20 20 20 20 7d 65 6c 73  ], 0); .    }els
14350 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
14360 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
14370 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
14380 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20  ee(zSql);.  }.. 
14390 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
143a0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
143b0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
143c0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
143d0 6e 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 61  ns the text of a
143e0 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  n SQL statement.
143f0 2a 2a 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ** that returns 
14400 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  a single integer
14410 20 76 61 6c 75 65 2e 20 54 68 65 20 73 74 61 74   value. The stat
14420 65 6d 65 6e 74 20 69 73 20 63 6f 6d 70 69 6c 65  ement is compile
14430 64 20 61 6e 64 20 65 78 65 63 75 74 65 64 0a 2a  d and executed.*
14440 2a 20 75 73 69 6e 67 20 64 61 74 61 62 61 73 65  * using database
14450 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20   connection db. 
14460 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
14470 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
14480 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 73 20   returned.** is 
14490 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 69 56 61  written to *piVa
144a0 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  l and SQLITE_OK 
144b0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
144c0 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
144d0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
144e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
144f0 20 76 61 6c 75 65 20 6f 66 20 2a 70 69 56 61 6c   value of *piVal
14500 20 61 66 74 65 72 20 72 65 74 75 72 6e 69 6e 67   after returning
14510 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e   is not defined.
14520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
14530 65 74 49 6e 74 46 72 6f 6d 53 74 6d 74 28 73 71  etIntFromStmt(sq
14540 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
14550 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 69 6e 74   char *zSql, int
14560 20 2a 70 69 56 61 6c 29 7b 0a 20 20 69 6e 74 20   *piVal){.  int 
14570 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
14580 4d 3b 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  M;.  if( zSql ){
14590 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
145a0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
145b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
145c0 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
145d0 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
145e0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
145f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14600 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
14610 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
14620 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
14630 20 20 2a 70 69 56 61 6c 20 3d 20 73 71 6c 69 74    *piVal = sqlit
14640 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
14650 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  tmt, 0);.      }
14660 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14670 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
14680 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  mt);.    }.  }. 
14690 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
146a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
146b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
146c0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78 43 6f  m within the xCo
146d0 6e 6e 65 63 74 28 29 20 6f 72 20 78 43 72 65 61  nnect() or xCrea
146e0 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 0a 2a  te() method to.*
146f0 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * determine the 
14700 6e 6f 64 65 2d 73 69 7a 65 20 75 73 65 64 20 62  node-size used b
14710 79 20 74 68 65 20 72 74 72 65 65 20 74 61 62 6c  y the rtree tabl
14720 65 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20  e being created 
14730 6f 72 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  or connected.** 
14740 74 6f 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  to. If successfu
14750 6c 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65  l, pRtree->iNode
14760 53 69 7a 65 20 69 73 20 70 6f 70 75 6c 61 74 65  Size is populate
14770 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
14780 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68  returned..** Oth
14790 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
147a0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
147b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
147c0 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
147d0 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
147e0 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 78   as part of an x
147f0 43 6f 6e 6e 65 63 74 28 29 2c 20 74 68 65 6e 20  Connect(), then 
14800 74 68 65 20 72 74 72 65 65 0a 2a 2a 20 74 61 62  the rtree.** tab
14810 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
14820 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
14830 74 68 65 20 6e 6f 64 65 2d 73 69 7a 65 20 69 73  the node-size is
14840 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 69   determined by i
14850 6e 73 70 65 63 74 69 6e 67 0a 2a 2a 20 74 68 65  nspecting.** the
14860 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68   root node of th
14870 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  e tree..**.** Ot
14880 68 65 72 77 69 73 65 2c 20 66 6f 72 20 61 6e 20  herwise, for an 
14890 78 43 72 65 61 74 65 28 29 2c 20 75 73 65 20 36  xCreate(), use 6
148a0 34 20 62 79 74 65 73 20 6c 65 73 73 20 74 68 61  4 bytes less tha
148b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  n the database p
148c0 61 67 65 2d 73 69 7a 65 2e 20 0a 2a 2a 20 54 68  age-size. .** Th
148d0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
148e0 65 61 63 68 20 6e 6f 64 65 20 69 73 20 73 74 6f  each node is sto
148f0 72 65 64 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  red on a single 
14900 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 49  database page. I
14910 66 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  f the .** databa
14920 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  se page-size is 
14930 73 6f 20 6c 61 72 67 65 20 74 68 61 74 20 6d 6f  so large that mo
14940 72 65 20 74 68 61 6e 20 52 54 52 45 45 5f 4d 41  re than RTREE_MA
14950 58 43 45 4c 4c 53 20 65 6e 74 72 69 65 73 20 0a  XCELLS entries .
14960 2a 2a 20 77 6f 75 6c 64 20 66 69 74 20 69 6e 20  ** would fit in 
14970 61 20 73 69 6e 67 6c 65 20 6e 6f 64 65 2c 20 75  a single node, u
14980 73 65 20 61 20 73 6d 61 6c 6c 65 72 20 6e 6f 64  se a smaller nod
14990 65 2d 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  e-size..*/.stati
149a0 63 20 69 6e 74 20 67 65 74 4e 6f 64 65 53 69 7a  c int getNodeSiz
149b0 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
149c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
149d0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
149e0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 52 74 72   handle */.  Rtr
149f0 65 65 20 2a 70 52 74 72 65 65 2c 20 20 20 20 20  ee *pRtree,     
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a10 52 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  Rtree handle */.
14a20 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 78 43    /* True for xC
14a50 72 65 61 74 65 2c 20 66 61 6c 73 65 20 66 6f 72  reate, false for
14a60 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 29 7b 0a   xConnect */.){.
14a70 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
14a80 20 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20 69 73   *zSql;.  if( is
14a90 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 69 6e  Create ){.    in
14aa0 74 20 69 50 61 67 65 53 69 7a 65 20 3d 20 30 3b  t iPageSize = 0;
14ab0 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
14ac0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
14ad0 47 4d 41 20 25 51 2e 70 61 67 65 5f 73 69 7a 65  GMA %Q.page_size
14ae0 22 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62 29 3b  ", pRtree->zDb);
14af0 0a 20 20 20 20 72 63 20 3d 20 67 65 74 49 6e 74  .    rc = getInt
14b00 46 72 6f 6d 53 74 6d 74 28 64 62 2c 20 7a 53 71  FromStmt(db, zSq
14b10 6c 2c 20 26 69 50 61 67 65 53 69 7a 65 29 3b 0a  l, &iPageSize);.
14b20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14b30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
14b40 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65  Rtree->iNodeSize
14b50 20 3d 20 69 50 61 67 65 53 69 7a 65 2d 36 34 3b   = iPageSize-64;
14b60 0a 20 20 20 20 20 20 69 66 28 20 28 34 2b 70 52  .      if( (4+pR
14b70 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43  tree->nBytesPerC
14b80 65 6c 6c 2a 52 54 52 45 45 5f 4d 41 58 43 45 4c  ell*RTREE_MAXCEL
14b90 4c 53 29 3c 70 52 74 72 65 65 2d 3e 69 4e 6f 64  LS)<pRtree->iNod
14ba0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
14bb0 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69   pRtree->iNodeSi
14bc0 7a 65 20 3d 20 34 2b 70 52 74 72 65 65 2d 3e 6e  ze = 4+pRtree->n
14bd0 42 79 74 65 73 50 65 72 43 65 6c 6c 2a 52 54 52  BytesPerCell*RTR
14be0 45 45 5f 4d 41 58 43 45 4c 4c 53 3b 0a 20 20 20  EE_MAXCELLS;.   
14bf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
14c00 73 65 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  se{.    zSql = s
14c10 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
14c20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
14c30 6c 65 6e 67 74 68 28 64 61 74 61 29 20 46 52 4f  length(data) FRO
14c40 4d 20 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27  M '%q'.'%q_node'
14c50 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f 20 3d 20   WHERE nodeno = 
14c60 31 22 2c 0a 20 20 20 20 20 20 20 20 70 52 74 72  1",.        pRtr
14c70 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d  ee->zDb, pRtree-
14c80 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
14c90 20 20 72 63 20 3d 20 67 65 74 49 6e 74 46 72 6f    rc = getIntFro
14ca0 6d 53 74 6d 74 28 64 62 2c 20 7a 53 71 6c 2c 20  mStmt(db, zSql, 
14cb0 26 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69  &pRtree->iNodeSi
14cc0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ze);.  }..  sqli
14cd0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
14ce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14cf0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
14d00 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70 6c  tion is the impl
14d10 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6f  ementation of bo
14d20 74 68 20 74 68 65 20 78 43 6f 6e 6e 65 63 74 20  th the xConnect 
14d30 61 6e 64 20 78 43 72 65 61 74 65 0a 2a 2a 20 6d  and xCreate.** m
14d40 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 72 2d  ethods of the r-
14d50 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61 62  tree virtual tab
14d60 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 76  le..**.**   argv
14d70 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c 65 20  [0]   -> module 
14d80 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 31  name.**   argv[1
14d90 5d 20 20 20 2d 3e 20 64 61 74 61 62 61 73 65 20  ]   -> database 
14da0 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 32  name.**   argv[2
14db0 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e 61 6d  ]   -> table nam
14dc0 65 0a 2a 2a 20 20 20 61 72 67 76 5b 2e 2e 2e 5d  e.**   argv[...]
14dd0 20 2d 3e 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   -> column names
14de0 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ....*/.static in
14df0 74 20 72 74 72 65 65 49 6e 69 74 28 0a 20 20 73  t rtreeInit(.  s
14e00 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
14e30 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76  onnection */.  v
14e40 6f 69 64 20 2a 70 41 75 78 2c 20 20 20 20 20 20  oid *pAux,      
14e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e60 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
14e70 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f 2a 20 63   RTREE_COORD_* c
14e80 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 69 6e  onstants */.  in
14e90 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
14ea0 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 20  ar *const*argv, 
14eb0 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 73 20    /* Parameters 
14ec0 74 6f 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  to CREATE TABLE 
14ed0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 73  statement */.  s
14ee0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
14ef0 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  Vtab,           
14f00 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 76     /* OUT: New v
14f10 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
14f20 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 2c 20    char **pzErr, 
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
14f50 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 69 66 20  ror message, if 
14f60 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  any */.  int isC
14f70 72 65 61 74 65 20 20 20 20 20 20 20 20 20 20 20  reate           
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14f90 54 72 75 65 20 66 6f 72 20 78 43 72 65 61 74 65  True for xCreate
14fa0 2c 20 66 61 6c 73 65 20 66 6f 72 20 78 43 6f 6e  , false for xCon
14fb0 6e 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  nect */.){.  int
14fc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14fd0 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
14fe0 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20  ;.  int nDb;    
14ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
15000 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 61 72  gth of string ar
15010 67 76 5b 31 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  gv[1] */.  int n
15020 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
15030 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
15040 72 69 6e 67 20 61 72 67 76 5b 32 5d 20 2a 2f 0a  ring argv[2] */.
15050 20 20 69 6e 74 20 65 43 6f 6f 72 64 54 79 70 65    int eCoordType
15060 20 3d 20 28 70 41 75 78 20 3f 20 52 54 52 45 45   = (pAux ? RTREE
15070 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 20 3a 20 52  _COORD_INT32 : R
15080 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33  TREE_COORD_REAL3
15090 32 29 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61  2);..  const cha
150a0 72 20 2a 61 45 72 72 4d 73 67 5b 5d 20 3d 20 7b  r *aErrMsg[] = {
150b0 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
150f0 2a 2f 0a 20 20 20 20 22 57 72 6f 6e 67 20 6e 75  */.    "Wrong nu
15100 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
15110 66 6f 72 20 61 6e 20 72 74 72 65 65 20 74 61 62  for an rtree tab
15120 6c 65 22 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  le",         /* 
15130 31 20 2a 2f 0a 20 20 20 20 22 54 6f 6f 20 66 65  1 */.    "Too fe
15140 77 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 61 6e  w columns for an
15150 20 72 74 72 65 65 20 74 61 62 6c 65 22 2c 20 20   rtree table",  
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15170 2a 20 32 20 2a 2f 0a 20 20 20 20 22 54 6f 6f 20  * 2 */.    "Too 
15180 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  many columns for
15190 20 61 6e 20 72 74 72 65 65 20 74 61 62 6c 65 22   an rtree table"
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151b0 20 2f 2a 20 33 20 2a 2f 0a 20 20 7d 3b 0a 0a 20   /* 3 */.  };.. 
151c0 20 69 6e 74 20 69 45 72 72 20 3d 20 28 61 72 67   int iErr = (arg
151d0 63 3c 36 29 20 3f 20 32 20 3a 20 61 72 67 63 3e  c<6) ? 2 : argc>
151e0 28 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e  (RTREE_MAX_DIMEN
151f0 53 49 4f 4e 53 2a 32 2b 34 29 20 3f 20 33 20 3a  SIONS*2+4) ? 3 :
15200 20 61 72 67 63 25 32 3b 0a 20 20 69 66 28 20 61   argc%2;.  if( a
15210 45 72 72 4d 73 67 5b 69 45 72 72 5d 20 29 7b 0a  ErrMsg[iErr] ){.
15220 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
15230 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
15240 22 2c 20 61 45 72 72 4d 73 67 5b 69 45 72 72 5d  ", aErrMsg[iErr]
15250 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15260 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
15270 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
15280 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54  config(db, SQLIT
15290 45 5f 56 54 41 42 5f 43 4f 4e 53 54 52 41 49 4e  E_VTAB_CONSTRAIN
152a0 54 5f 53 55 50 50 4f 52 54 2c 20 31 29 3b 0a 0a  T_SUPPORT, 1);..
152b0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
152c0 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  e sqlite3_vtab s
152d0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 6e 44  tructure */.  nD
152e0 62 20 3d 20 73 74 72 6c 65 6e 28 61 72 67 76 5b  b = strlen(argv[
152f0 31 5d 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  1]);.  nName = s
15300 74 72 6c 65 6e 28 61 72 67 76 5b 32 5d 29 3b 0a  trlen(argv[2]);.
15310 20 20 70 52 74 72 65 65 20 3d 20 28 52 74 72 65    pRtree = (Rtre
15320 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e *)sqlite3_mall
15330 6f 63 28 73 69 7a 65 6f 66 28 52 74 72 65 65 29  oc(sizeof(Rtree)
15340 2b 6e 44 62 2b 6e 4e 61 6d 65 2b 32 29 3b 0a 20  +nDb+nName+2);. 
15350 20 69 66 28 20 21 70 52 74 72 65 65 20 29 7b 0a   if( !pRtree ){.
15360 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15370 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
15380 65 6d 73 65 74 28 70 52 74 72 65 65 2c 20 30 2c  emset(pRtree, 0,
15390 20 73 69 7a 65 6f 66 28 52 74 72 65 65 29 2b 6e   sizeof(Rtree)+n
153a0 44 62 2b 6e 4e 61 6d 65 2b 32 29 3b 0a 20 20 70  Db+nName+2);.  p
153b0 52 74 72 65 65 2d 3e 6e 42 75 73 79 20 3d 20 31  Rtree->nBusy = 1
153c0 3b 0a 20 20 70 52 74 72 65 65 2d 3e 62 61 73 65  ;.  pRtree->base
153d0 2e 70 4d 6f 64 75 6c 65 20 3d 20 26 72 74 72 65  .pModule = &rtre
153e0 65 4d 6f 64 75 6c 65 3b 0a 20 20 70 52 74 72 65  eModule;.  pRtre
153f0 65 2d 3e 7a 44 62 20 3d 20 28 63 68 61 72 20 2a  e->zDb = (char *
15400 29 26 70 52 74 72 65 65 5b 31 5d 3b 0a 20 20 70  )&pRtree[1];.  p
15410 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 20 3d 20 26  Rtree->zName = &
15420 70 52 74 72 65 65 2d 3e 7a 44 62 5b 6e 44 62 2b  pRtree->zDb[nDb+
15430 31 5d 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e 44  1];.  pRtree->nD
15440 69 6d 20 3d 20 28 61 72 67 63 2d 34 29 2f 32 3b  im = (argc-4)/2;
15450 0a 20 20 70 52 74 72 65 65 2d 3e 6e 42 79 74 65  .  pRtree->nByte
15460 73 50 65 72 43 65 6c 6c 20 3d 20 38 20 2b 20 70  sPerCell = 8 + p
15470 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 34 2a 32 3b  Rtree->nDim*4*2;
15480 0a 20 20 70 52 74 72 65 65 2d 3e 65 43 6f 6f 72  .  pRtree->eCoor
15490 64 54 79 70 65 20 3d 20 65 43 6f 6f 72 64 54 79  dType = eCoordTy
154a0 70 65 3b 0a 20 20 6d 65 6d 63 70 79 28 70 52 74  pe;.  memcpy(pRt
154b0 72 65 65 2d 3e 7a 44 62 2c 20 61 72 67 76 5b 31  ree->zDb, argv[1
154c0 5d 2c 20 6e 44 62 29 3b 0a 20 20 6d 65 6d 63 70  ], nDb);.  memcp
154d0 79 28 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c  y(pRtree->zName,
154e0 20 61 72 67 76 5b 32 5d 2c 20 6e 4e 61 6d 65 29   argv[2], nName)
154f0 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
15500 75 74 20 74 68 65 20 6e 6f 64 65 20 73 69 7a 65  ut the node size
15510 20 74 6f 20 75 73 65 2e 20 2a 2f 0a 20 20 72 63   to use. */.  rc
15520 20 3d 20 67 65 74 4e 6f 64 65 53 69 7a 65 28 64   = getNodeSize(d
15530 62 2c 20 70 52 74 72 65 65 2c 20 69 73 43 72 65  b, pRtree, isCre
15540 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  ate);..  /* Crea
15550 74 65 2f 43 6f 6e 6e 65 63 74 20 74 6f 20 74 68  te/Connect to th
15560 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 72 65 6c  e underlying rel
15570 61 74 69 6f 6e 61 6c 20 64 61 74 61 62 61 73 65  ational database
15580 20 73 63 68 65 6d 61 2e 20 49 66 0a 20 20 2a 2a   schema. If.  **
15590 20 74 68 61 74 20 69 73 20 73 75 63 63 65 73 73   that is success
155a0 66 75 6c 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65  ful, call sqlite
155b0 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
155c0 20 74 6f 20 63 6f 6e 66 69 67 75 72 65 0a 20 20   to configure.  
155d0 2a 2a 20 74 68 65 20 72 2d 74 72 65 65 20 74 61  ** the r-tree ta
155e0 62 6c 65 20 73 63 68 65 6d 61 2e 0a 20 20 2a 2f  ble schema..  */
155f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15600 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
15610 28 72 63 20 3d 20 72 74 72 65 65 53 71 6c 49 6e  (rc = rtreeSqlIn
15620 69 74 28 70 52 74 72 65 65 2c 20 64 62 2c 20 61  it(pRtree, db, a
15630 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 2c  rgv[1], argv[2],
15640 20 69 73 43 72 65 61 74 65 29 29 20 29 7b 0a 20   isCreate)) ){. 
15650 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71       *pzErr = sq
15660 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
15670 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
15680 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 65 6c  sg(db));.    }el
15690 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
156a0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
156b0 70 72 69 6e 74 66 28 22 43 52 45 41 54 45 20 54  printf("CREATE T
156c0 41 42 4c 45 20 78 28 25 73 22 2c 20 61 72 67 76  ABLE x(%s", argv
156d0 5b 33 5d 29 3b 0a 20 20 20 20 20 20 63 68 61 72  [3]);.      char
156e0 20 2a 7a 54 6d 70 3b 0a 20 20 20 20 20 20 69 6e   *zTmp;.      in
156f0 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  t ii;.      for(
15700 69 69 3d 34 3b 20 7a 53 71 6c 20 26 26 20 69 69  ii=4; zSql && ii
15710 3c 61 72 67 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  <argc; ii++){.  
15720 20 20 20 20 20 20 7a 54 6d 70 20 3d 20 7a 53 71        zTmp = zSq
15730 6c 3b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  l;.        zSql 
15740 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
15750 66 28 22 25 73 2c 20 25 73 22 2c 20 7a 54 6d 70  f("%s, %s", zTmp
15760 2c 20 61 72 67 76 5b 69 69 5d 29 3b 0a 20 20 20  , argv[ii]);.   
15770 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
15780 65 28 7a 54 6d 70 29 3b 0a 20 20 20 20 20 20 7d  e(zTmp);.      }
15790 0a 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c 20  .      if( zSql 
157a0 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 6d 70 20  ){.        zTmp 
157b0 3d 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  = zSql;.        
157c0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
157d0 70 72 69 6e 74 66 28 22 25 73 29 3b 22 2c 20 7a  printf("%s);", z
157e0 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Tmp);.        sq
157f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 29  lite3_free(zTmp)
15800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15810 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20  if( !zSql ){.   
15820 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15830 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
15840 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  lse if( SQLITE_O
15850 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
15860 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62  _declare_vtab(db
15870 2c 20 7a 53 71 6c 29 29 20 29 7b 0a 20 20 20 20  , zSql)) ){.    
15880 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
15890 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
158a0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
158b0 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a  g(db));.      }.
158c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
158d0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  ee(zSql);.    }.
158e0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
158f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15900 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74  *ppVtab = (sqlit
15910 65 33 5f 76 74 61 62 20 2a 29 70 52 74 72 65 65  e3_vtab *)pRtree
15920 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
15930 74 72 65 65 52 65 6c 65 61 73 65 28 70 52 74 72  treeRelease(pRtr
15940 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
15950 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
15960 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
15970 66 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63 74  f a scalar funct
15980 69 6f 6e 20 74 68 61 74 20 64 65 63 6f 64 65 73  ion that decodes
15990 20 72 2d 74 72 65 65 20 6e 6f 64 65 73 20 74 6f   r-tree nodes to
159a0 0a 2a 2a 20 68 75 6d 61 6e 20 72 65 61 64 61 62  .** human readab
159b0 6c 65 20 73 74 72 69 6e 67 73 2e 20 54 68 69 73  le strings. This
159c0 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
159d0 20 64 65 62 75 67 67 69 6e 67 20 61 6e 64 20 61   debugging and a
159e0 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  nalysis..**.** T
159f0 68 65 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  he scalar functi
15a00 6f 6e 20 74 61 6b 65 73 20 74 77 6f 20 61 72 67  on takes two arg
15a10 75 6d 65 6e 74 73 2c 20 61 20 62 6c 6f 62 20 6f  uments, a blob o
15a20 66 20 64 61 74 61 20 63 6f 6e 74 61 69 6e 69 6e  f data containin
15a30 67 0a 2a 2a 20 61 6e 20 72 2d 74 72 65 65 20 6e  g.** an r-tree n
15a40 6f 64 65 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d  ode, and the num
15a50 62 65 72 20 6f 66 20 64 69 6d 65 6e 73 69 6f 6e  ber of dimension
15a60 73 20 74 68 65 20 72 2d 74 72 65 65 20 69 6e 64  s the r-tree ind
15a70 65 78 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 20 74  exes..** For a t
15a80 77 6f 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c 20 72  wo-dimensional r
15a90 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
15aa0 63 61 6c 6c 65 64 20 22 72 74 22 2c 20 74 6f 20  called "rt", to 
15ab0 64 65 73 65 72 69 61 6c 69 7a 65 0a 2a 2a 20 61  deserialize.** a
15ac0 6c 6c 20 6e 6f 64 65 73 2c 20 61 20 73 74 61 74  ll nodes, a stat
15ad0 65 6d 65 6e 74 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a  ement like:.**.*
15ae0 2a 20 20 20 53 45 4c 45 43 54 20 72 74 72 65 65  *   SELECT rtree
15af0 6e 6f 64 65 28 32 2c 20 64 61 74 61 29 20 46 52  node(2, data) FR
15b00 4f 4d 20 72 74 5f 6e 6f 64 65 3b 0a 2a 2a 0a 2a  OM rt_node;.**.*
15b10 2a 20 54 68 65 20 68 75 6d 61 6e 20 72 65 61 64  * The human read
15b20 61 62 6c 65 20 73 74 72 69 6e 67 20 74 61 6b 65  able string take
15b30 73 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 20  s the form of a 
15b40 54 63 6c 20 6c 69 73 74 20 77 69 74 68 20 6f 6e  Tcl list with on
15b50 65 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 65  e.** entry for e
15b60 61 63 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  ach cell in the 
15b70 72 2d 74 72 65 65 20 6e 6f 64 65 2e 20 45 61 63  r-tree node. Eac
15b80 68 20 65 6e 74 72 79 20 69 73 20 69 74 73 65 6c  h entry is itsel
15b90 66 20 61 0a 2a 2a 20 6c 69 73 74 2c 20 63 6f 6e  f a.** list, con
15ba0 74 61 69 6e 69 6e 67 20 74 68 65 20 38 2d 62 79  taining the 8-by
15bb0 74 65 20 72 6f 77 69 64 2f 70 61 67 65 6e 6f 20  te rowid/pageno 
15bc0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20  followed by the 
15bd0 0a 2a 2a 20 3c 6e 75 6d 2d 64 69 6d 65 6e 73 69  .** <num-dimensi
15be0 6f 6e 3e 2a 32 20 63 6f 6f 72 64 69 6e 61 74 65  on>*2 coordinate
15bf0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
15c00 64 20 72 74 72 65 65 6e 6f 64 65 28 73 71 6c 69  d rtreenode(sqli
15c10 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
15c20 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69  , int nArg, sqli
15c30 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
15c40 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78  g){.  char *zTex
15c50 74 20 3d 20 30 3b 0a 20 20 52 74 72 65 65 4e 6f  t = 0;.  RtreeNo
15c60 64 65 20 6e 6f 64 65 3b 0a 20 20 52 74 72 65 65  de node;.  Rtree
15c70 20 74 72 65 65 3b 0a 20 20 69 6e 74 20 69 69 3b   tree;.  int ii;
15c80 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
15c90 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 6d 65  ETER(nArg);.  me
15ca0 6d 73 65 74 28 26 6e 6f 64 65 2c 20 30 2c 20 73  mset(&node, 0, s
15cb0 69 7a 65 6f 66 28 52 74 72 65 65 4e 6f 64 65 29  izeof(RtreeNode)
15cc0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 72 65  );.  memset(&tre
15cd0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72  e, 0, sizeof(Rtr
15ce0 65 65 29 29 3b 0a 20 20 74 72 65 65 2e 6e 44 69  ee));.  tree.nDi
15cf0 6d 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  m = sqlite3_valu
15d00 65 5f 69 6e 74 28 61 70 41 72 67 5b 30 5d 29 3b  e_int(apArg[0]);
15d10 0a 20 20 74 72 65 65 2e 6e 42 79 74 65 73 50 65  .  tree.nBytesPe
15d20 72 43 65 6c 6c 20 3d 20 38 20 2b 20 38 20 2a 20  rCell = 8 + 8 * 
15d30 74 72 65 65 2e 6e 44 69 6d 3b 0a 20 20 6e 6f 64  tree.nDim;.  nod
15d40 65 2e 7a 44 61 74 61 20 3d 20 28 75 38 20 2a 29  e.zData = (u8 *)
15d50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
15d60 6f 62 28 61 70 41 72 67 5b 31 5d 29 3b 0a 0a 20  ob(apArg[1]);.. 
15d70 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 4e 43   for(ii=0; ii<NC
15d80 45 4c 4c 28 26 6e 6f 64 65 29 3b 20 69 69 2b 2b  ELL(&node); ii++
15d90 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 43 65 6c  ){.    char zCel
15da0 6c 5b 35 31 32 5d 3b 0a 20 20 20 20 69 6e 74 20  l[512];.    int 
15db0 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 52  nCell = 0;.    R
15dc0 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20  treeCell cell;. 
15dd0 20 20 20 69 6e 74 20 6a 6a 3b 0a 0a 20 20 20 20     int jj;..    
15de0 6e 6f 64 65 47 65 74 43 65 6c 6c 28 26 74 72 65  nodeGetCell(&tre
15df0 65 2c 20 26 6e 6f 64 65 2c 20 69 69 2c 20 26 63  e, &node, ii, &c
15e00 65 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ell);.    sqlite
15e10 33 5f 73 6e 70 72 69 6e 74 66 28 35 31 32 2d 6e  3_snprintf(512-n
15e20 43 65 6c 6c 2c 26 7a 43 65 6c 6c 5b 6e 43 65 6c  Cell,&zCell[nCel
15e30 6c 5d 2c 22 25 6c 6c 64 22 2c 20 63 65 6c 6c 2e  l],"%lld", cell.
15e40 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 6e 43 65  iRowid);.    nCe
15e50 6c 6c 20 3d 20 73 74 72 6c 65 6e 28 7a 43 65 6c  ll = strlen(zCel
15e60 6c 29 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 30  l);.    for(jj=0
15e70 3b 20 6a 6a 3c 74 72 65 65 2e 6e 44 69 6d 2a 32  ; jj<tree.nDim*2
15e80 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ; jj++){.      s
15e90 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
15ea0 35 31 32 2d 6e 43 65 6c 6c 2c 26 7a 43 65 6c 6c  512-nCell,&zCell
15eb0 5b 6e 43 65 6c 6c 5d 2c 22 20 25 66 22 2c 28 64  [nCell]," %f",(d
15ec0 6f 75 62 6c 65 29 63 65 6c 6c 2e 61 43 6f 6f 72  ouble)cell.aCoor
15ed0 64 5b 6a 6a 5d 2e 66 29 3b 0a 20 20 20 20 20 20  d[jj].f);.      
15ee0 6e 43 65 6c 6c 20 3d 20 73 74 72 6c 65 6e 28 7a  nCell = strlen(z
15ef0 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Cell);.    }..  
15f00 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20    if( zText ){. 
15f10 20 20 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74       char *zText
15f20 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  New = sqlite3_mp
15f30 72 69 6e 74 66 28 22 25 73 20 7b 25 73 7d 22 2c  rintf("%s {%s}",
15f40 20 7a 54 65 78 74 2c 20 7a 43 65 6c 6c 29 3b 0a   zText, zCell);.
15f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
15f60 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20 20 20  ee(zText);.     
15f70 20 7a 54 65 78 74 20 3d 20 7a 54 65 78 74 4e 65   zText = zTextNe
15f80 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  w;.    }else{.  
15f90 20 20 20 20 7a 54 65 78 74 20 3d 20 73 71 6c 69      zText = sqli
15fa0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7b 25 73  te3_mprintf("{%s
15fb0 7d 22 2c 20 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  }", zCell);.    
15fc0 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74  }.  }.  .  sqlit
15fd0 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
15fe0 74 78 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 73  tx, zText, -1, s
15ff0 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a  qlite3_free);.}.
16000 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 74 72  .static void rtr
16010 65 65 64 65 70 74 68 28 73 71 6c 69 74 65 33 5f  eedepth(sqlite3_
16020 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e  context *ctx, in
16030 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65 33 5f  t nArg, sqlite3_
16040 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 29 7b 0a  value **apArg){.
16050 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
16060 45 52 28 6e 41 72 67 29 3b 0a 20 20 69 66 28 20  ER(nArg);.  if( 
16070 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
16080 70 65 28 61 70 41 72 67 5b 30 5d 29 21 3d 53 51  pe(apArg[0])!=SQ
16090 4c 49 54 45 5f 42 4c 4f 42 20 0a 20 20 20 7c 7c  LITE_BLOB .   ||
160a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
160b0 79 74 65 73 28 61 70 41 72 67 5b 30 5d 29 3c 32  ytes(apArg[0])<2
160c0 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
160d0 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
160e0 74 78 2c 20 22 49 6e 76 61 6c 69 64 20 61 72 67  tx, "Invalid arg
160f0 75 6d 65 6e 74 20 74 6f 20 72 74 72 65 65 64 65  ument to rtreede
16100 70 74 68 28 29 22 2c 20 2d 31 29 3b 20 0a 20 20  pth()", -1); .  
16110 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 7a  }else{.    u8 *z
16120 42 6c 6f 62 20 3d 20 28 75 38 20 2a 29 73 71 6c  Blob = (u8 *)sql
16130 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
16140 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 73  apArg[0]);.    s
16150 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
16160 74 28 63 74 78 2c 20 72 65 61 64 49 6e 74 31 36  t(ctx, readInt16
16170 28 7a 42 6c 6f 62 29 29 3b 0a 20 20 7d 0a 7d 0a  (zBlob));.  }.}.
16180 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
16190 74 68 65 20 72 2d 74 72 65 65 20 6d 6f 64 75 6c  the r-tree modul
161a0 65 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20  e with database 
161b0 68 61 6e 64 6c 65 20 64 62 2e 20 54 68 69 73 20  handle db. This 
161c0 63 72 65 61 74 65 73 20 74 68 65 0a 2a 2a 20 76  creates the.** v
161d0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
161e0 75 6c 65 20 22 72 74 72 65 65 22 20 61 6e 64 20  ule "rtree" and 
161f0 74 68 65 20 64 65 62 75 67 67 69 6e 67 2f 61 6e  the debugging/an
16200 61 6c 79 73 69 73 20 73 63 61 6c 61 72 20 0a 2a  alysis scalar .*
16210 2a 20 66 75 6e 63 74 69 6f 6e 20 22 72 74 72 65  * function "rtre
16220 65 6e 6f 64 65 22 2e 0a 2a 2f 0a 69 6e 74 20 73  enode"..*/.int s
16230 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28  qlite3RtreeInit(
16240 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
16250 63 6f 6e 73 74 20 69 6e 74 20 75 74 66 38 20 3d  const int utf8 =
16260 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
16270 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
16280 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
16290 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 72 74 72  unction(db, "rtr
162a0 65 65 6e 6f 64 65 22 2c 20 32 2c 20 75 74 66 38  eenode", 2, utf8
162b0 2c 20 30 2c 20 72 74 72 65 65 6e 6f 64 65 2c 20  , 0, rtreenode, 
162c0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, 0);.  if( rc=
162d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
162e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
162f0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
16300 62 2c 20 22 72 74 72 65 65 64 65 70 74 68 22 2c  b, "rtreedepth",
16310 20 31 2c 20 75 74 66 38 2c 20 30 2c 72 74 72 65   1, utf8, 0,rtre
16320 65 64 65 70 74 68 2c 20 30 2c 20 30 29 3b 0a 20  edepth, 0, 0);. 
16330 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
16340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 6f  ITE_OK ){.    vo
16350 69 64 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29  id *c = (void *)
16360 52 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c  RTREE_COORD_REAL
16370 33 32 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  32;.    rc = sql
16380 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75  ite3_create_modu
16390 6c 65 5f 76 32 28 64 62 2c 20 22 72 74 72 65 65  le_v2(db, "rtree
163a0 22 2c 20 26 72 74 72 65 65 4d 6f 64 75 6c 65 2c  ", &rtreeModule,
163b0 20 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   c, 0);.  }.  if
163c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
163d0 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 63 20 3d  ){.    void *c =
163e0 20 28 76 6f 69 64 20 2a 29 52 54 52 45 45 5f 43   (void *)RTREE_C
163f0 4f 4f 52 44 5f 49 4e 54 33 32 3b 0a 20 20 20 20  OORD_INT32;.    
16400 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
16410 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 64 62  ate_module_v2(db
16420 2c 20 22 72 74 72 65 65 5f 69 33 32 22 2c 20 26  , "rtree_i32", &
16430 72 74 72 65 65 4d 6f 64 75 6c 65 2c 20 63 2c 20  rtreeModule, c, 
16440 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
16450 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
16460 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
16470 74 65 33 5f 66 72 65 65 28 29 20 74 68 61 74 20  te3_free() that 
16480 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
16490 20 63 61 6c 6c 62 61 63 6b 2e 20 54 68 69 73 20   callback. This 
164a0 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 77  is used.** in tw
164b0 6f 20 70 6c 61 63 65 73 20 2d 20 61 73 20 74 68  o places - as th
164c0 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
164d0 20 74 68 65 20 62 6c 6f 62 20 76 61 6c 75 65 20   the blob value 
164e0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a  returned by the.
164f0 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  ** invocation of
16500 20 61 20 67 65 6f 6d 65 74 72 79 20 66 75 6e 63   a geometry func
16510 74 69 6f 6e 2c 20 61 6e 64 20 61 73 20 74 68 65  tion, and as the
16520 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
16530 74 68 65 20 67 65 6f 6d 65 74 72 79 0a 2a 2a 20  the geometry.** 
16540 66 75 6e 63 74 69 6f 6e 73 20 74 68 65 6d 73 65  functions themse
16550 6c 76 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lves..*/.static 
16560 76 6f 69 64 20 64 6f 53 71 6c 69 74 65 33 46 72  void doSqlite3Fr
16570 65 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 73  ee(void *p){.  s
16580 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
16590 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 63 61  }../*.** Each ca
165a0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 74  ll to sqlite3_rt
165b0 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c  ree_geometry_cal
165c0 6c 62 61 63 6b 28 29 20 63 72 65 61 74 65 73 20  lback() creates 
165d0 61 6e 20 6f 72 64 69 6e 61 72 79 20 53 51 4c 69  an ordinary SQLi
165e0 74 65 0a 2a 2a 20 73 63 61 6c 61 72 20 75 73 65  te.** scalar use
165f0 72 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 69 73  r function. This
16600 20 43 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74   C function is t
16610 68 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  he callback used
16620 20 66 6f 72 20 61 6c 6c 20 73 75 63 68 0a 2a 2a   for all such.**
16630 20 72 65 67 69 73 74 65 72 65 64 20 53 51 4c 20   registered SQL 
16640 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  functions..**.**
16650 20 54 68 65 20 73 63 61 6c 61 72 20 75 73 65 72   The scalar user
16660 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
16670 6e 20 61 20 62 6c 6f 62 20 74 68 61 74 20 69 73  n a blob that is
16680 20 69 6e 74 65 72 70 72 65 74 65 64 20 62 79 20   interpreted by 
16690 72 2d 74 72 65 65 0a 2a 2a 20 74 61 62 6c 65 20  r-tree.** table 
166a0 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 73 2e  MATCH operators.
166b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
166c0 67 65 6f 6d 43 61 6c 6c 62 61 63 6b 28 73 71 6c  geomCallback(sql
166d0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
166e0 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c  x, int nArg, sql
166f0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72  ite3_value **aAr
16700 67 29 7b 0a 20 20 52 74 72 65 65 47 65 6f 6d 43  g){.  RtreeGeomC
16710 61 6c 6c 62 61 63 6b 20 2a 70 47 65 6f 6d 43 74  allback *pGeomCt
16720 78 20 3d 20 28 52 74 72 65 65 47 65 6f 6d 43 61  x = (RtreeGeomCa
16730 6c 6c 62 61 63 6b 20 2a 29 73 71 6c 69 74 65 33  llback *)sqlite3
16740 5f 75 73 65 72 5f 64 61 74 61 28 63 74 78 29 3b  _user_data(ctx);
16750 0a 20 20 52 74 72 65 65 4d 61 74 63 68 41 72 67  .  RtreeMatchArg
16760 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e   *pBlob;.  int n
16770 42 6c 6f 62 3b 0a 0a 20 20 6e 42 6c 6f 62 20 3d  Blob;..  nBlob =
16780 20 73 69 7a 65 6f 66 28 52 74 72 65 65 4d 61 74   sizeof(RtreeMat
16790 63 68 41 72 67 29 20 2b 20 28 6e 41 72 67 2d 31  chArg) + (nArg-1
167a0 29 2a 73 69 7a 65 6f 66 28 64 6f 75 62 6c 65 29  )*sizeof(double)
167b0 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 28 52 74 72  ;.  pBlob = (Rtr
167c0 65 65 4d 61 74 63 68 41 72 67 20 2a 29 73 71 6c  eeMatchArg *)sql
167d0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 6c 6f  ite3_malloc(nBlo
167e0 62 29 3b 0a 20 20 69 66 28 20 21 70 42 6c 6f 62  b);.  if( !pBlob
167f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
16800 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
16810 65 6d 28 63 74 78 29 3b 0a 20 20 7d 65 6c 73 65  em(ctx);.  }else
16820 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
16830 20 70 42 6c 6f 62 2d 3e 6d 61 67 69 63 20 3d 20   pBlob->magic = 
16840 52 54 52 45 45 5f 47 45 4f 4d 45 54 52 59 5f 4d  RTREE_GEOMETRY_M
16850 41 47 49 43 3b 0a 20 20 20 20 70 42 6c 6f 62 2d  AGIC;.    pBlob-
16860 3e 78 47 65 6f 6d 20 3d 20 70 47 65 6f 6d 43 74  >xGeom = pGeomCt
16870 78 2d 3e 78 47 65 6f 6d 3b 0a 20 20 20 20 70 42  x->xGeom;.    pB
16880 6c 6f 62 2d 3e 70 43 6f 6e 74 65 78 74 20 3d 20  lob->pContext = 
16890 70 47 65 6f 6d 43 74 78 2d 3e 70 43 6f 6e 74 65  pGeomCtx->pConte
168a0 78 74 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 6e  xt;.    pBlob->n
168b0 50 61 72 61 6d 20 3d 20 6e 41 72 67 3b 0a 20 20  Param = nArg;.  
168c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
168d0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  g; i++){.      p
168e0 42 6c 6f 62 2d 3e 61 50 61 72 61 6d 5b 69 5d 20  Blob->aParam[i] 
168f0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
16900 64 6f 75 62 6c 65 28 61 41 72 67 5b 69 5d 29 3b  double(aArg[i]);
16910 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
16920 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
16930 74 78 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  tx, pBlob, nBlob
16940 2c 20 64 6f 53 71 6c 69 74 65 33 46 72 65 65 29  , doSqlite3Free)
16950 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
16960 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 67 65  egister a new ge
16970 6f 6d 65 74 72 79 20 66 75 6e 63 74 69 6f 6e 20  ometry function 
16980 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65  for use with the
16990 20 72 2d 74 72 65 65 20 4d 41 54 43 48 20 6f 70   r-tree MATCH op
169a0 65 72 61 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  erator..*/.int s
169b0 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f  qlite3_rtree_geo
169c0 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28 0a  metry_callback(.
169d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
169e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 65   const char *zGe
169f0 6f 6d 2c 0a 20 20 69 6e 74 20 28 2a 78 47 65 6f  om,.  int (*xGeo
16a00 6d 29 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65  m)(sqlite3_rtree
16a10 5f 67 65 6f 6d 65 74 72 79 20 2a 2c 20 69 6e 74  _geometry *, int
16a20 2c 20 64 6f 75 62 6c 65 20 2a 2c 20 69 6e 74 20  , double *, int 
16a30 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  *),.  void *pCon
16a40 74 65 78 74 0a 29 7b 0a 20 20 52 74 72 65 65 47  text.){.  RtreeG
16a50 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 70 47 65  eomCallback *pGe
16a60 6f 6d 43 74 78 3b 20 20 20 20 20 20 2f 2a 20 43  omCtx;      /* C
16a70 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f  ontext object fo
16a80 72 20 6e 65 77 20 75 73 65 72 2d 66 75 6e 63 74  r new user-funct
16a90 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ion */..  /* All
16aa0 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61  ocate and popula
16ab0 74 65 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  te the context o
16ac0 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 47 65 6f  bject. */.  pGeo
16ad0 6d 43 74 78 20 3d 20 28 52 74 72 65 65 47 65 6f  mCtx = (RtreeGeo
16ae0 6d 43 61 6c 6c 62 61 63 6b 20 2a 29 73 71 6c 69  mCallback *)sqli
16af0 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
16b00 66 28 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62  f(RtreeGeomCallb
16b10 61 63 6b 29 29 3b 0a 20 20 69 66 28 20 21 70 47  ack));.  if( !pG
16b20 65 6f 6d 43 74 78 20 29 20 72 65 74 75 72 6e 20  eomCtx ) return 
16b30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
16b40 70 47 65 6f 6d 43 74 78 2d 3e 78 47 65 6f 6d 20  pGeomCtx->xGeom 
16b50 3d 20 78 47 65 6f 6d 3b 0a 20 20 70 47 65 6f 6d  = xGeom;.  pGeom
16b60 43 74 78 2d 3e 70 43 6f 6e 74 65 78 74 20 3d 20  Ctx->pContext = 
16b70 70 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  pContext;..  /* 
16b80 43 72 65 61 74 65 20 74 68 65 20 6e 65 77 20 75  Create the new u
16b90 73 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 52 65  ser-function. Re
16ba0 67 69 73 74 65 72 20 61 20 64 65 73 74 72 75 63  gister a destruc
16bb0 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  tor function to 
16bc0 64 65 6c 65 74 65 0a 20 20 2a 2a 20 74 68 65 20  delete.  ** the 
16bd0 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 77  context object w
16be0 68 65 6e 20 69 74 20 69 73 20 6e 6f 20 6c 6f 6e  hen it is no lon
16bf0 67 65 72 20 72 65 71 75 69 72 65 64 2e 20 20 2a  ger required.  *
16c00 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
16c10 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
16c20 6f 6e 5f 76 32 28 64 62 2c 20 7a 47 65 6f 6d 2c  on_v2(db, zGeom,
16c30 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c   -1, SQLITE_ANY,
16c40 20 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29   .      (void *)
16c50 70 47 65 6f 6d 43 74 78 2c 20 67 65 6f 6d 43 61  pGeomCtx, geomCa
16c60 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 2c 20 64 6f  llback, 0, 0, do
16c70 53 71 6c 69 74 65 33 46 72 65 65 0a 20 20 29 3b  Sqlite3Free.  );
16c80 0a 7d 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .}..#if !SQLITE_
16c90 43 4f 52 45 0a 69 6e 74 20 73 71 6c 69 74 65 33  CORE.int sqlite3
16ca0 5f 65 78 74 65 6e 73 69 6f 6e 5f 69 6e 69 74 28  _extension_init(
16cb0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
16cc0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
16cd0 67 2c 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  g,.  const sqlit
16ce0 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20  e3_api_routines 
16cf0 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54  *pApi.){.  SQLIT
16d00 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
16d10 32 28 70 41 70 69 29 0a 20 20 72 65 74 75 72 6e  2(pApi).  return
16d20 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69   sqlite3RtreeIni
16d30 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  t(db);.}.#endif.
16d40 0a 23 65 6e 64 69 66 0a                          .#endif.