/ Hex Artifact Content
Login

Artifact e957a603a98871dcf005c1e96ae791cfe74eb7f6:


0000: 2f 2a 0a 2a 2a 20 32 30 31 30 20 41 75 67 75 73  /*.** 2010 Augus
0010: 74 20 32 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 28.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   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 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20  ***.** Code for 
0180: 74 65 73 74 69 6e 67 20 61 6c 6c 20 73 6f 72 74  testing all sort
0190: 73 20 6f 66 20 53 51 4c 69 74 65 20 69 6e 74 65  s of SQLite inte
01a0: 72 66 61 63 65 73 2e 20 54 68 69 73 20 63 6f 64  rfaces. This cod
01b0: 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 63 6c  e.** is not incl
01c0: 75 64 65 64 20 69 6e 20 74 68 65 20 53 51 4c 69  uded in the SQLi
01d0: 74 65 20 6c 69 62 72 61 72 79 2e 20 0a 2a 2f 0a  te library. .*/.
01e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 71 6c 69 74  .#include <sqlit
01f0: 65 33 2e 68 3e 0a 0a 2f 2a 20 53 6f 6c 65 6c 79  e3.h>../* Solely
0200: 20 66 6f 72 20 74 68 65 20 55 4e 55 53 45 44 5f   for the UNUSED_
0210: 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72  PARAMETER() macr
0220: 6f 2e 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  o. */.#include "
0230: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
0240: 20 0a 2a 2a 20 54 79 70 65 20 75 73 65 64 20 74   .** Type used t
0250: 6f 20 63 61 63 68 65 20 70 61 72 61 6d 65 74 65  o cache paramete
0260: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  r information fo
0270: 72 20 74 68 65 20 22 63 69 72 63 6c 65 22 20 72  r the "circle" r
0280: 2d 74 72 65 65 20 67 65 6f 6d 65 74 72 79 0a 2a  -tree geometry.*
0290: 2a 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 74  * callback..*/.t
02a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 69  ypedef struct Ci
02b0: 72 63 6c 65 20 43 69 72 63 6c 65 3b 0a 73 74 72  rcle Circle;.str
02c0: 75 63 74 20 43 69 72 63 6c 65 20 7b 0a 20 20 73  uct Circle {.  s
02d0: 74 72 75 63 74 20 42 6f 78 20 7b 0a 20 20 20 20  truct Box {.    
02e0: 64 6f 75 62 6c 65 20 78 6d 69 6e 3b 0a 20 20 20  double xmin;.   
02f0: 20 64 6f 75 62 6c 65 20 78 6d 61 78 3b 0a 20 20   double xmax;.  
0300: 20 20 64 6f 75 62 6c 65 20 79 6d 69 6e 3b 0a 20    double ymin;. 
0310: 20 20 20 64 6f 75 62 6c 65 20 79 6d 61 78 3b 0a     double ymax;.
0320: 20 20 7d 20 61 42 6f 78 5b 32 5d 3b 0a 20 20 64    } aBox[2];.  d
0330: 6f 75 62 6c 65 20 63 65 6e 74 65 72 78 3b 0a 20  ouble centerx;. 
0340: 20 64 6f 75 62 6c 65 20 63 65 6e 74 65 72 79 3b   double centery;
0350: 0a 20 20 64 6f 75 62 6c 65 20 72 61 64 69 75 73  .  double radius
0360: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74  ;.};../*.** Dest
0370: 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ructor function 
0380: 66 6f 72 20 43 69 72 63 6c 65 20 6f 62 6a 65 63  for Circle objec
0390: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ts allocated by 
03a0: 63 69 72 63 6c 65 5f 67 65 6f 6d 28 29 2e 0a 2a  circle_geom()..*
03b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 69  /.static void ci
03c0: 72 63 6c 65 5f 64 65 6c 28 76 6f 69 64 20 2a 70  rcle_del(void *p
03d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
03e0: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e(p);.}../*.** I
03f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
0400: 20 22 63 69 72 63 6c 65 22 20 72 2d 74 72 65 65   "circle" r-tree
0410: 20 67 65 6f 6d 65 74 72 79 20 63 61 6c 6c 62 61   geometry callba
0420: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
0430: 74 20 63 69 72 63 6c 65 5f 67 65 6f 6d 28 0a 20  t circle_geom(. 
0440: 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67   sqlite3_rtree_g
0450: 65 6f 6d 65 74 72 79 20 2a 70 2c 0a 20 20 69 6e  eometry *p,.  in
0460: 74 20 6e 43 6f 6f 72 64 2c 20 0a 20 20 64 6f 75  t nCoord, .  dou
0470: 62 6c 65 20 2a 61 43 6f 6f 72 64 2c 20 0a 20 20  ble *aCoord, .  
0480: 69 6e 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69  int *pRes.){.  i
0490: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
04a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
04b0: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
04c0: 62 6c 65 20 2a 2f 0a 20 20 43 69 72 63 6c 65 20  ble */.  Circle 
04d0: 2a 70 43 69 72 63 6c 65 3b 20 20 20 20 20 20 20  *pCircle;       
04e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75           /* Stru
04f0: 63 74 75 72 65 20 64 65 66 69 6e 69 6e 67 20 63  cture defining c
0500: 69 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 20 2a  ircular region *
0510: 2f 0a 20 20 64 6f 75 62 6c 65 20 78 6d 69 6e 2c  /.  double xmin,
0520: 20 78 6d 61 78 3b 20 20 20 20 20 20 20 20 20 20   xmax;          
0530: 20 20 20 20 2f 2a 20 58 20 64 69 6d 65 6e 73 69      /* X dimensi
0540: 6f 6e 73 20 6f 66 20 62 6f 78 20 62 65 69 6e 67  ons of box being
0550: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 64 6f 75   tested */.  dou
0560: 62 6c 65 20 79 6d 69 6e 2c 20 79 6d 61 78 3b 20  ble ymin, ymax; 
0570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0580: 58 20 64 69 6d 65 6e 73 69 6f 6e 73 20 6f 66 20  X dimensions of 
0590: 62 6f 78 20 62 65 69 6e 67 20 74 65 73 74 65 64  box being tested
05a0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55   */..  if( p->pU
05b0: 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ser==0 ){.    /*
05c0: 20 49 66 20 70 55 73 65 72 20 69 73 20 73 74 69   If pUser is sti
05d0: 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20 70  ll 0, then the p
05e0: 61 72 61 6d 65 74 65 72 20 76 61 6c 75 65 73 20  arameter values 
05f0: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 74 65  have not been te
0600: 73 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20  sted.    ** for 
0610: 63 6f 72 72 65 63 74 6e 65 73 73 20 6f 72 20 73  correctness or s
0620: 74 6f 72 65 64 20 69 6e 74 6f 20 61 20 43 69 72  tored into a Cir
0630: 63 6c 65 20 73 74 72 75 63 74 75 72 65 20 79 65  cle structure ye
0640: 74 2e 20 44 6f 20 74 68 69 73 20 6e 6f 77 2e 20  t. Do this now. 
0650: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  */..    /* This 
0660: 67 65 6f 6d 65 74 72 79 20 63 61 6c 6c 62 61 63  geometry callbac
0670: 6b 20 69 73 20 66 6f 72 20 75 73 65 20 77 69 74  k is for use wit
0680: 68 20 61 20 32 2d 64 69 6d 65 6e 73 69 6f 6e 61  h a 2-dimensiona
0690: 6c 20 72 2d 74 72 65 65 20 74 61 62 6c 65 2e 0a  l r-tree table..
06a0: 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e      ** Return an
06b0: 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 74 61   error if the ta
06c0: 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ble does not hav
06d0: 65 20 65 78 61 63 74 6c 79 20 32 20 64 69 6d 65  e exactly 2 dime
06e0: 6e 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  nsions. */.    i
06f0: 66 28 20 6e 43 6f 6f 72 64 21 3d 34 20 29 20 72  f( nCoord!=4 ) r
0700: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
0710: 4f 52 3b 0a 0a 20 20 20 20 2f 2a 20 54 65 73 74  OR;..    /* Test
0720: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
0730: 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 72 61  t number of para
0740: 6d 65 74 65 72 73 20 28 33 29 20 68 61 76 65 20  meters (3) have 
0750: 62 65 65 6e 20 73 75 70 70 6c 69 65 64 2c 0a 20  been supplied,. 
0760: 20 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 74     ** and that t
0770: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  he parameters ar
0780: 65 20 69 6e 20 72 61 6e 67 65 20 28 74 68 61 74  e in range (that
0790: 20 74 68 65 20 72 61 64 69 75 73 20 6f 66 20 74   the radius of t
07a0: 68 65 20 63 69 72 63 6c 65 20 0a 20 20 20 20 2a  he circle .    *
07b0: 2a 20 72 61 64 69 75 73 20 69 73 20 67 72 65 61  * radius is grea
07c0: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 29 2e 20  ter than zero). 
07d0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  */.    if( p->nP
07e0: 61 72 61 6d 21 3d 33 20 7c 7c 20 70 2d 3e 61 50  aram!=3 || p->aP
07f0: 61 72 61 6d 5b 32 5d 3c 30 2e 30 20 29 20 72 65  aram[2]<0.0 ) re
0800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
0810: 52 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  R;..    /* Alloc
0820: 61 74 65 20 61 20 73 74 72 75 63 74 75 72 65 20  ate a structure 
0830: 74 6f 20 63 61 63 68 65 20 70 61 72 61 6d 65 74  to cache paramet
0840: 65 72 20 64 61 74 61 20 69 6e 2e 20 52 65 74 75  er data in. Retu
0850: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
0860: 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c      ** if the al
0870: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20  location fails. 
0880: 2a 2f 0a 20 20 20 20 70 43 69 72 63 6c 65 20 3d  */.    pCircle =
0890: 20 28 43 69 72 63 6c 65 20 2a 29 28 70 2d 3e 70   (Circle *)(p->p
08a0: 55 73 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  User = sqlite3_m
08b0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43 69 72  alloc(sizeof(Cir
08c0: 63 6c 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20  cle)));.    if( 
08d0: 21 70 43 69 72 63 6c 65 20 29 20 72 65 74 75 72  !pCircle ) retur
08e0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
08f0: 20 20 20 20 70 2d 3e 78 44 65 6c 55 73 65 72 20      p->xDelUser 
0900: 3d 20 63 69 72 63 6c 65 5f 64 65 6c 3b 0a 0a 20  = circle_del;.. 
0910: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65     /* Record the
0920: 20 63 65 6e 74 65 72 20 61 6e 64 20 72 61 64 69   center and radi
0930: 75 73 20 6f 66 20 74 68 65 20 63 69 72 63 75 6c  us of the circul
0940: 61 72 20 72 65 67 69 6f 6e 2e 20 4f 6e 65 20 77  ar region. One w
0950: 61 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ay that.    ** t
0960: 65 73 74 65 64 20 62 6f 75 6e 64 69 6e 67 20 62  ested bounding b
0970: 6f 78 65 73 20 74 68 61 74 20 69 6e 74 65 72 73  oxes that inters
0980: 65 63 74 20 74 68 65 20 63 69 72 63 75 6c 61 72  ect the circular
0990: 20 72 65 67 69 6f 6e 20 61 72 65 20 64 65 74 65   region are dete
09a0: 63 74 65 64 0a 20 20 20 20 2a 2a 20 69 73 20 62  cted.    ** is b
09b0: 79 20 74 65 73 74 69 6e 67 20 69 66 20 65 61 63  y testing if eac
09c0: 68 20 63 6f 72 6e 65 72 20 6f 66 20 74 68 65 20  h corner of the 
09d0: 62 6f 75 6e 64 69 6e 67 20 62 6f 78 20 6c 69 6b  bounding box lik
09e0: 65 73 20 77 69 74 68 69 6e 20 72 61 64 69 75 73  es within radius
09f0: 0a 20 20 20 20 2a 2a 20 75 6e 69 74 73 20 6f 66  .    ** units of
0a00: 20 74 68 65 20 63 65 6e 74 65 72 20 6f 66 20 74   the center of t
0a10: 68 65 20 63 69 72 63 6c 65 2e 20 2a 2f 0a 20 20  he circle. */.  
0a20: 20 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65    pCircle->cente
0a30: 72 78 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 30  rx = p->aParam[0
0a40: 5d 3b 0a 20 20 20 20 70 43 69 72 63 6c 65 2d 3e  ];.    pCircle->
0a50: 63 65 6e 74 65 72 79 20 3d 20 70 2d 3e 61 50 61  centery = p->aPa
0a60: 72 61 6d 5b 31 5d 3b 0a 20 20 20 20 70 43 69 72  ram[1];.    pCir
0a70: 63 6c 65 2d 3e 72 61 64 69 75 73 20 3d 20 70 2d  cle->radius = p-
0a80: 3e 61 50 61 72 61 6d 5b 32 5d 3b 0a 0a 20 20 20  >aParam[2];..   
0a90: 20 2f 2a 20 44 65 66 69 6e 65 20 74 77 6f 20 62   /* Define two b
0aa0: 6f 75 6e 64 69 6e 67 20 62 6f 78 20 72 65 67 69  ounding box regi
0ab0: 6f 6e 73 2e 20 54 68 65 20 66 69 72 73 74 2c 20  ons. The first, 
0ac0: 61 42 6f 78 5b 30 5d 2c 20 65 78 74 65 6e 64 73  aBox[0], extends
0ad0: 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 66 69 6e   to.    ** infin
0ae0: 69 74 79 20 69 6e 20 74 68 65 20 58 20 64 69 6d  ity in the X dim
0af0: 65 6e 73 69 6f 6e 2e 20 49 74 20 63 6f 76 65 72  ension. It cover
0b00: 73 20 74 68 65 20 73 61 6d 65 20 72 61 6e 67 65  s the same range
0b10: 20 6f 66 20 74 68 65 20 59 20 64 69 6d 65 6e 73   of the Y dimens
0b20: 69 6f 6e 0a 20 20 20 20 2a 2a 20 61 73 20 74 68  ion.    ** as th
0b30: 65 20 63 69 72 63 75 6c 61 72 20 72 65 67 69 6f  e circular regio
0b40: 6e 2e 20 54 68 65 20 73 65 63 6f 6e 64 2c 20 61  n. The second, a
0b50: 42 6f 78 5b 31 5d 2c 20 65 78 74 65 6e 64 73 20  Box[1], extends 
0b60: 74 6f 20 69 6e 66 69 6e 69 74 79 20 69 6e 0a 20  to infinity in. 
0b70: 20 20 20 2a 2a 20 74 68 65 20 59 20 64 69 6d 65     ** the Y dime
0b80: 6e 73 69 6f 6e 20 61 6e 64 20 69 73 20 63 6f 6e  nsion and is con
0b90: 73 74 72 61 69 6e 65 64 20 74 6f 20 74 68 65 20  strained to the 
0ba0: 72 61 6e 67 65 20 6f 66 20 74 68 65 20 63 69 72  range of the cir
0bb0: 63 6c 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  cle in the.    *
0bc0: 2a 20 58 20 64 69 6d 65 6e 73 69 6f 6e 2e 0a 20  * X dimension.. 
0bd0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
0be0: 6e 20 69 6d 61 67 69 6e 65 20 65 61 63 68 20 62  n imagine each b
0bf0: 6f 78 20 69 73 20 73 70 6c 69 74 20 69 6e 20 68  ox is split in h
0c00: 61 6c 66 20 61 6c 6f 6e 67 20 69 74 73 20 73 68  alf along its sh
0c10: 6f 72 74 20 61 78 69 73 20 62 79 20 61 20 6c 69  ort axis by a li
0c20: 6e 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  ne.    ** that i
0c30: 6e 74 65 72 73 65 63 74 73 20 74 68 65 20 63 65  ntersects the ce
0c40: 6e 74 65 72 20 6f 66 20 74 68 65 20 63 69 72 63  nter of the circ
0c50: 75 6c 61 72 20 72 65 67 69 6f 6e 2e 20 41 20 62  ular region. A b
0c60: 6f 75 6e 64 69 6e 67 20 62 6f 78 0a 20 20 20 20  ounding box.    
0c70: 2a 2a 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  ** being tested 
0c80: 63 61 6e 20 62 65 20 73 61 69 64 20 74 6f 20 69  can be said to i
0c90: 6e 74 65 72 73 65 63 74 20 74 68 65 20 63 69 72  ntersect the cir
0ca0: 63 75 6c 61 72 20 72 65 67 69 6f 6e 20 69 66 20  cular region if 
0cb0: 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
0cc0: 2a 2a 20 70 6f 69 6e 74 73 20 66 72 6f 6d 20 65  ** points from e
0cd0: 61 63 68 20 68 61 6c 66 20 6f 66 20 65 69 74 68  ach half of eith
0ce0: 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 69 6e  er of the two in
0cf0: 66 69 6e 69 74 65 20 62 6f 75 6e 64 69 6e 67 20  finite bounding 
0d00: 62 6f 78 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  boxes..    */.  
0d10: 20 20 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b    pCircle->aBox[
0d20: 30 5d 2e 78 6d 69 6e 20 3d 20 70 43 69 72 63 6c  0].xmin = pCircl
0d30: 65 2d 3e 63 65 6e 74 65 72 78 3b 0a 20 20 20 20  e->centerx;.    
0d40: 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 30 5d  pCircle->aBox[0]
0d50: 2e 78 6d 61 78 20 3d 20 70 43 69 72 63 6c 65 2d  .xmax = pCircle-
0d60: 3e 63 65 6e 74 65 72 78 3b 0a 20 20 20 20 70 43  >centerx;.    pC
0d70: 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 30 5d 2e 79  ircle->aBox[0].y
0d80: 6d 69 6e 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63  min = pCircle->c
0d90: 65 6e 74 65 72 79 20 2b 20 70 43 69 72 63 6c 65  entery + pCircle
0da0: 2d 3e 72 61 64 69 75 73 3b 0a 20 20 20 20 70 43  ->radius;.    pC
0db0: 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 30 5d 2e 79  ircle->aBox[0].y
0dc0: 6d 61 78 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63  max = pCircle->c
0dd0: 65 6e 74 65 72 79 20 2d 20 70 43 69 72 63 6c 65  entery - pCircle
0de0: 2d 3e 72 61 64 69 75 73 3b 0a 20 20 20 20 70 43  ->radius;.    pC
0df0: 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 31 5d 2e 78  ircle->aBox[1].x
0e00: 6d 69 6e 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63  min = pCircle->c
0e10: 65 6e 74 65 72 78 20 2b 20 70 43 69 72 63 6c 65  enterx + pCircle
0e20: 2d 3e 72 61 64 69 75 73 3b 0a 20 20 20 20 70 43  ->radius;.    pC
0e30: 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 31 5d 2e 78  ircle->aBox[1].x
0e40: 6d 61 78 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63  max = pCircle->c
0e50: 65 6e 74 65 72 78 20 2d 20 70 43 69 72 63 6c 65  enterx - pCircle
0e60: 2d 3e 72 61 64 69 75 73 3b 0a 20 20 20 20 70 43  ->radius;.    pC
0e70: 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 31 5d 2e 79  ircle->aBox[1].y
0e80: 6d 69 6e 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63  min = pCircle->c
0e90: 65 6e 74 65 72 79 3b 0a 20 20 20 20 70 43 69 72  entery;.    pCir
0ea0: 63 6c 65 2d 3e 61 42 6f 78 5b 31 5d 2e 79 6d 61  cle->aBox[1].yma
0eb0: 78 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e  x = pCircle->cen
0ec0: 74 65 72 79 3b 0a 20 20 7d 0a 0a 20 20 70 43 69  tery;.  }..  pCi
0ed0: 72 63 6c 65 20 3d 20 28 43 69 72 63 6c 65 20 2a  rcle = (Circle *
0ee0: 29 70 2d 3e 70 55 73 65 72 3b 0a 20 20 78 6d 69  )p->pUser;.  xmi
0ef0: 6e 20 3d 20 61 43 6f 6f 72 64 5b 30 5d 3b 0a 20  n = aCoord[0];. 
0f00: 20 78 6d 61 78 20 3d 20 61 43 6f 6f 72 64 5b 31   xmax = aCoord[1
0f10: 5d 3b 0a 20 20 79 6d 69 6e 20 3d 20 61 43 6f 6f  ];.  ymin = aCoo
0f20: 72 64 5b 32 5d 3b 0a 20 20 79 6d 61 78 20 3d 20  rd[2];.  ymax = 
0f30: 61 43 6f 6f 72 64 5b 33 5d 3b 0a 0a 20 20 2f 2a  aCoord[3];..  /*
0f40: 20 43 68 65 63 6b 20 69 66 20 61 6e 79 20 6f 66   Check if any of
0f50: 20 74 68 65 20 34 20 63 6f 72 6e 65 72 73 20 6f   the 4 corners o
0f60: 66 20 74 68 65 20 62 6f 75 6e 64 69 6e 67 2d 62  f the bounding-b
0f70: 6f 78 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  ox being tested 
0f80: 6c 69 65 20 0a 20 20 2a 2a 20 69 6e 73 69 64 65  lie .  ** inside
0f90: 20 74 68 65 20 63 69 72 63 75 6c 61 72 20 72 65   the circular re
0fa0: 67 69 6f 6e 2e 20 49 66 20 74 68 65 79 20 64 6f  gion. If they do
0fb0: 2c 20 74 68 65 6e 20 74 68 65 20 62 6f 75 6e 64  , then the bound
0fc0: 69 6e 67 2d 62 6f 78 20 64 6f 65 73 0a 20 20 2a  ing-box does.  *
0fd0: 2a 20 69 6e 74 65 72 73 65 63 74 20 74 68 65 20  * intersect the 
0fe0: 72 65 67 69 6f 6e 20 6f 66 20 69 6e 74 65 72 65  region of intere
0ff0: 73 74 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70  st. Set the outp
1000: 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ut variable to t
1010: 72 75 65 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  rue and.  ** ret
1020: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6e  urn SQLITE_OK in
1030: 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20   this case. */. 
1040: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69   for(i=0; i<4; i
1050: 2b 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ++){.    double 
1060: 78 20 3d 20 28 69 26 30 78 30 31 29 20 3f 20 78  x = (i&0x01) ? x
1070: 6d 61 78 20 3a 20 78 6d 69 6e 3b 0a 20 20 20 20  max : xmin;.    
1080: 64 6f 75 62 6c 65 20 79 20 3d 20 28 69 26 30 78  double y = (i&0x
1090: 30 32 29 20 3f 20 79 6d 61 78 20 3a 20 79 6d 69  02) ? ymax : ymi
10a0: 6e 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 64 32  n;.    double d2
10b0: 3b 0a 20 20 20 20 0a 20 20 20 20 64 32 20 20 3d  ;.    .    d2  =
10c0: 20 28 78 2d 70 43 69 72 63 6c 65 2d 3e 63 65 6e   (x-pCircle->cen
10d0: 74 65 72 78 29 2a 28 78 2d 70 43 69 72 63 6c 65  terx)*(x-pCircle
10e0: 2d 3e 63 65 6e 74 65 72 78 29 3b 0a 20 20 20 20  ->centerx);.    
10f0: 64 32 20 2b 3d 20 28 79 2d 70 43 69 72 63 6c 65  d2 += (y-pCircle
1100: 2d 3e 63 65 6e 74 65 72 79 29 2a 28 79 2d 70 43  ->centery)*(y-pC
1110: 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72 79 29 3b  ircle->centery);
1120: 0a 20 20 20 20 69 66 28 20 64 32 3c 28 70 43 69  .    if( d2<(pCi
1130: 72 63 6c 65 2d 3e 72 61 64 69 75 73 2a 70 43 69  rcle->radius*pCi
1140: 72 63 6c 65 2d 3e 72 61 64 69 75 73 29 20 29 7b  rcle->radius) ){
1150: 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
1160: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1170: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1180: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1190: 69 66 20 74 68 65 20 62 6f 75 6e 64 69 6e 67 20  if the bounding 
11a0: 62 6f 78 20 63 6f 76 65 72 73 20 61 6e 79 20 6f  box covers any o
11b0: 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68 65  ther part of the
11c0: 20 63 69 72 63 75 6c 61 72 20 72 65 67 69 6f 6e   circular region
11d0: 2e 0a 20 20 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  ..  ** See comme
11e0: 6e 74 73 20 61 62 6f 76 65 20 66 6f 72 20 61 20  nts above for a 
11f0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 68  description of h
1200: 6f 77 20 74 68 69 73 20 74 65 73 74 20 77 6f 72  ow this test wor
1210: 6b 73 2e 20 49 66 20 69 74 20 64 6f 65 73 0a 20  ks. If it does. 
1220: 20 2a 2a 20 63 6f 76 65 72 20 70 61 72 74 20 6f   ** cover part o
1230: 66 20 74 68 65 20 63 69 72 63 75 6c 61 72 20 72  f the circular r
1240: 65 67 69 6f 6e 2c 20 73 65 74 20 74 68 65 20 6f  egion, set the o
1250: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
1260: 6f 20 74 72 75 65 0a 20 20 2a 2a 20 61 6e 64 20  o true.  ** and 
1270: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1280: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
1290: 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<2; i++){.    i
12a0: 66 28 20 78 6d 69 6e 3c 3d 70 43 69 72 63 6c 65  f( xmin<=pCircle
12b0: 2d 3e 61 42 6f 78 5b 69 5d 2e 78 6d 69 6e 20 0a  ->aBox[i].xmin .
12c0: 20 20 20 20 20 26 26 20 78 6d 61 78 3e 3d 70 43       && xmax>=pC
12d0: 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 69 5d 2e 78  ircle->aBox[i].x
12e0: 6d 61 78 20 0a 20 20 20 20 20 26 26 20 79 6d 69  max .     && ymi
12f0: 6e 3c 3d 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78  n<=pCircle->aBox
1300: 5b 69 5d 2e 79 6d 69 6e 20 0a 20 20 20 20 20 26  [i].ymin .     &
1310: 26 20 79 6d 61 78 3e 3d 70 43 69 72 63 6c 65 2d  & ymax>=pCircle-
1320: 3e 61 42 6f 78 5b 69 5d 2e 79 6d 61 78 20 0a 20  >aBox[i].ymax . 
1330: 20 20 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65     ){.      *pRe
1340: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
1350: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1360: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
1370: 68 65 20 73 70 65 63 69 66 69 65 64 20 62 6f 75  he specified bou
1380: 6e 64 69 6e 67 20 62 6f 78 20 64 6f 65 73 20 6e  nding box does n
1390: 6f 74 20 69 6e 74 65 72 73 65 63 74 20 74 68 65  ot intersect the
13a0: 20 63 69 72 63 75 6c 61 72 20 72 65 67 69 6f 6e   circular region
13b0: 2e 20 53 65 74 0a 20 20 2a 2a 20 74 68 65 20 6f  . Set.  ** the o
13c0: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
13d0: 6f 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  o zero and retur
13e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a  n SQLITE_OK. */.
13f0: 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
1400: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1410: 0a 7d 0a 0a 2f 2a 20 45 4e 44 20 6f 66 20 69 6d  .}../* END of im
1420: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1430: 22 63 69 72 63 6c 65 22 20 67 65 6f 6d 65 74 72  "circle" geometr
1440: 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 2a 2a  y callback..****
1450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1490: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
14a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e0: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  /..#include <ass
14f0: 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ert.h>.#include 
1500: 22 74 63 6c 2e 68 22 0a 0a 74 79 70 65 64 65 66  "tcl.h"..typedef
1510: 20 73 74 72 75 63 74 20 43 75 62 65 20 43 75 62   struct Cube Cub
1520: 65 3b 0a 73 74 72 75 63 74 20 43 75 62 65 20 7b  e;.struct Cube {
1530: 0a 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 64  .  double x;.  d
1540: 6f 75 62 6c 65 20 79 3b 0a 20 20 64 6f 75 62 6c  ouble y;.  doubl
1550: 65 20 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 77 69  e z;.  double wi
1560: 64 74 68 3b 0a 20 20 64 6f 75 62 6c 65 20 68 65  dth;.  double he
1570: 69 67 68 74 3b 0a 20 20 64 6f 75 62 6c 65 20 64  ight;.  double d
1580: 65 70 74 68 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63  epth;.};..static
1590: 20 76 6f 69 64 20 63 75 62 65 5f 63 6f 6e 74 65   void cube_conte
15a0: 78 74 5f 66 72 65 65 28 76 6f 69 64 20 2a 70 29  xt_free(void *p)
15b0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
15c0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
15d0: 65 20 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65  e context pointe
15e0: 72 20 72 65 67 69 73 74 65 72 65 64 20 61 6c 6f  r registered alo
15f0: 6e 67 20 77 69 74 68 20 74 68 65 20 27 63 75 62  ng with the 'cub
1600: 65 27 20 63 61 6c 6c 62 61 63 6b 20 69 73 0a 2a  e' callback is.*
1610: 2a 20 61 6c 77 61 79 73 20 28 28 76 6f 69 64 20  * always ((void 
1620: 2a 29 26 67 48 65 72 65 29 2e 20 54 68 69 73 20  *)&gHere). This 
1630: 69 73 20 6a 75 73 74 20 74 6f 20 66 61 63 69 6c  is just to facil
1640: 69 74 61 74 65 20 74 65 73 74 69 6e 67 2c 20 69  itate testing, i
1650: 74 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 63 74 75  t is not.** actu
1660: 61 6c 6c 79 20 75 73 65 64 20 66 6f 72 20 61 6e  ally used for an
1670: 79 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ything..*/.stati
1680: 63 20 69 6e 74 20 67 48 65 72 65 20 3d 20 34 32  c int gHere = 42
1690: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
16a0: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 73 69 6d  ntation of a sim
16b0: 70 6c 65 20 72 2d 74 72 65 65 20 67 65 6f 6d 20  ple r-tree geom 
16c0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 74 65 73 74  callback to test
16d0: 20 66 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f   for intersectio
16e0: 6e 0a 2a 2a 20 6f 66 20 72 2d 74 72 65 65 20 72  n.** of r-tree r
16f0: 6f 77 73 20 77 69 74 68 20 61 20 22 63 75 62 65  ows with a "cube
1700: 22 20 73 68 61 70 65 2e 20 43 75 62 65 73 20 61  " shape. Cubes a
1710: 72 65 20 64 65 66 69 6e 65 64 20 62 79 20 73 69  re defined by si
1720: 78 20 73 63 61 6c 61 72 0a 2a 2a 20 63 6f 6f 72  x scalar.** coor
1730: 64 69 6e 61 74 65 73 20 61 73 20 66 6f 6c 6c 6f  dinates as follo
1740: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 63 75 62 65  ws:.**.**   cube
1750: 28 78 2c 20 79 2c 20 7a 2c 20 77 69 64 74 68 2c  (x, y, z, width,
1760: 20 68 65 69 67 68 74 2c 20 64 65 70 74 68 29 0a   height, depth).
1770: 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 64 74 68 2c  **.** The width,
1780: 20 68 65 69 67 68 74 20 61 6e 64 20 64 65 70 74   height and dept
1790: 68 20 70 61 72 61 6d 65 74 65 72 73 20 6d 75 73  h parameters mus
17a0: 74 20 61 6c 6c 20 62 65 20 67 72 65 61 74 65 72  t all be greater
17b0: 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73   than zero..*/.s
17c0: 74 61 74 69 63 20 69 6e 74 20 63 75 62 65 5f 67  tatic int cube_g
17d0: 65 6f 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 72  eom(.  sqlite3_r
17e0: 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 20 2a 70  tree_geometry *p
17f0: 2c 0a 20 20 69 6e 74 20 6e 43 6f 6f 72 64 2c 20  ,.  int nCoord, 
1800: 0a 20 20 64 6f 75 62 6c 65 20 2a 61 43 6f 6f 72  .  double *aCoor
1810: 64 2c 20 0a 20 20 69 6e 74 20 2a 70 69 52 65 73  d, .  int *piRes
1820: 0a 29 7b 0a 20 20 43 75 62 65 20 2a 70 43 75 62  .){.  Cube *pCub
1830: 65 20 3d 20 28 43 75 62 65 20 2a 29 70 2d 3e 70  e = (Cube *)p->p
1840: 55 73 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  User;..  assert(
1850: 20 70 2d 3e 70 43 6f 6e 74 65 78 74 3d 3d 28 76   p->pContext==(v
1860: 6f 69 64 20 2a 29 26 67 48 65 72 65 20 29 3b 0a  oid *)&gHere );.
1870: 0a 20 20 69 66 28 20 70 43 75 62 65 3d 3d 30 20  .  if( pCube==0 
1880: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  ){.    if( p->nP
1890: 61 72 61 6d 21 3d 36 20 7c 7c 20 6e 43 6f 6f 72  aram!=6 || nCoor
18a0: 64 21 3d 36 0a 20 20 20 20 20 7c 7c 20 70 2d 3e  d!=6.     || p->
18b0: 61 50 61 72 61 6d 5b 33 5d 3c 3d 30 2e 30 20 7c  aParam[3]<=0.0 |
18c0: 7c 20 70 2d 3e 61 50 61 72 61 6d 5b 34 5d 3c 3d  | p->aParam[4]<=
18d0: 30 2e 30 20 7c 7c 20 70 2d 3e 61 50 61 72 61 6d  0.0 || p->aParam
18e0: 5b 35 5d 3c 3d 30 2e 30 0a 20 20 20 20 29 7b 0a  [5]<=0.0.    ){.
18f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1900: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
1910: 0a 20 20 20 20 70 43 75 62 65 20 3d 20 28 43 75  .    pCube = (Cu
1920: 62 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  be *)sqlite3_mal
1930: 6c 6f 63 28 73 69 7a 65 6f 66 28 43 75 62 65 29  loc(sizeof(Cube)
1940: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 75 62  );.    if( !pCub
1950: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
1960: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1970: 20 20 20 20 7d 0a 20 20 20 20 70 43 75 62 65 2d      }.    pCube-
1980: 3e 78 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 30  >x = p->aParam[0
1990: 5d 3b 0a 20 20 20 20 70 43 75 62 65 2d 3e 79 20  ];.    pCube->y 
19a0: 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 31 5d 3b 0a  = p->aParam[1];.
19b0: 20 20 20 20 70 43 75 62 65 2d 3e 7a 20 3d 20 70      pCube->z = p
19c0: 2d 3e 61 50 61 72 61 6d 5b 32 5d 3b 0a 20 20 20  ->aParam[2];.   
19d0: 20 70 43 75 62 65 2d 3e 77 69 64 74 68 20 3d 20   pCube->width = 
19e0: 70 2d 3e 61 50 61 72 61 6d 5b 33 5d 3b 0a 20 20  p->aParam[3];.  
19f0: 20 20 70 43 75 62 65 2d 3e 68 65 69 67 68 74 20    pCube->height 
1a00: 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 34 5d 3b 0a  = p->aParam[4];.
1a10: 20 20 20 20 70 43 75 62 65 2d 3e 64 65 70 74 68      pCube->depth
1a20: 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 35 5d 3b   = p->aParam[5];
1a30: 0a 0a 20 20 20 20 70 2d 3e 70 55 73 65 72 20 3d  ..    p->pUser =
1a40: 20 28 76 6f 69 64 20 2a 29 70 43 75 62 65 3b 0a   (void *)pCube;.
1a50: 20 20 20 20 70 2d 3e 78 44 65 6c 55 73 65 72 20      p->xDelUser 
1a60: 3d 20 63 75 62 65 5f 63 6f 6e 74 65 78 74 5f 66  = cube_context_f
1a70: 72 65 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ree;.  }..  asse
1a80: 72 74 28 20 6e 43 6f 6f 72 64 3d 3d 36 20 29 3b  rt( nCoord==6 );
1a90: 0a 20 20 2a 70 69 52 65 73 20 3d 20 30 3b 0a 20  .  *piRes = 0;. 
1aa0: 20 69 66 28 20 61 43 6f 6f 72 64 5b 30 5d 3c 3d   if( aCoord[0]<=
1ab0: 28 70 43 75 62 65 2d 3e 78 2b 70 43 75 62 65 2d  (pCube->x+pCube-
1ac0: 3e 77 69 64 74 68 29 0a 20 20 20 26 26 20 61 43  >width).   && aC
1ad0: 6f 6f 72 64 5b 31 5d 3e 3d 70 43 75 62 65 2d 3e  oord[1]>=pCube->
1ae0: 78 0a 20 20 20 26 26 20 61 43 6f 6f 72 64 5b 32  x.   && aCoord[2
1af0: 5d 3c 3d 28 70 43 75 62 65 2d 3e 79 2b 70 43 75  ]<=(pCube->y+pCu
1b00: 62 65 2d 3e 68 65 69 67 68 74 29 0a 20 20 20 26  be->height).   &
1b10: 26 20 61 43 6f 6f 72 64 5b 33 5d 3e 3d 70 43 75  & aCoord[3]>=pCu
1b20: 62 65 2d 3e 79 0a 20 20 20 26 26 20 61 43 6f 6f  be->y.   && aCoo
1b30: 72 64 5b 34 5d 3c 3d 28 70 43 75 62 65 2d 3e 7a  rd[4]<=(pCube->z
1b40: 2b 70 43 75 62 65 2d 3e 64 65 70 74 68 29 0a 20  +pCube->depth). 
1b50: 20 20 26 26 20 61 43 6f 6f 72 64 5b 35 5d 3e 3d    && aCoord[5]>=
1b60: 70 43 75 62 65 2d 3e 7a 0a 20 20 29 7b 0a 20 20  pCube->z.  ){.  
1b70: 20 20 2a 70 69 52 65 73 20 3d 20 31 3b 0a 20 20    *piRes = 1;.  
1b80: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1b90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
1ba0: 20 69 6e 74 20 72 65 67 69 73 74 65 72 5f 63 75   int register_cu
1bb0: 62 65 5f 67 65 6f 6d 28 0a 20 20 76 6f 69 64 20  be_geom(.  void 
1bc0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1bd0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1be0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1bf0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1c00: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
1c10: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1c20: 5f 52 54 52 45 45 0a 20 20 55 4e 55 53 45 44 5f  _RTREE.  UNUSED_
1c30: 50 41 52 41 4d 45 54 45 52 28 63 6c 69 65 6e 74  PARAMETER(client
1c40: 44 61 74 61 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Data);.  UNUSED_
1c50: 50 41 52 41 4d 45 54 45 52 28 69 6e 74 65 72 70  PARAMETER(interp
1c60: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1c70: 4d 45 54 45 52 28 6f 62 6a 63 29 3b 0a 20 20 55  METER(objc);.  U
1c80: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1c90: 6f 62 6a 76 29 3b 0a 23 65 6c 73 65 0a 20 20 65  objv);.#else.  e
1ca0: 78 74 65 72 6e 20 69 6e 74 20 67 65 74 44 62 50  xtern int getDbP
1cb0: 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65 72  ointer(Tcl_Inter
1cc0: 70 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  p*, const char*,
1cd0: 20 73 71 6c 69 74 65 33 2a 2a 29 3b 0a 20 20 65   sqlite3**);.  e
1ce0: 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68 61 72  xtern const char
1cf0: 20 2a 73 71 6c 69 74 65 33 54 65 73 74 45 72 72   *sqlite3TestErr
1d00: 6f 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 20 20 73  orName(int);.  s
1d10: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
1d20: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
1d30: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1d40: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1d50: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
1d60: 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  B");.    return 
1d70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1d80: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1d90: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1da0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1db0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1dc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1dd0: 3d 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f  = sqlite3_rtree_
1de0: 67 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63  geometry_callbac
1df0: 6b 28 64 62 2c 20 22 63 75 62 65 22 2c 20 63 75  k(db, "cube", cu
1e00: 62 65 5f 67 65 6f 6d 2c 20 28 76 6f 69 64 20 2a  be_geom, (void *
1e10: 29 26 67 48 65 72 65 29 3b 0a 20 20 54 63 6c 5f  )&gHere);.  Tcl_
1e20: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1e30: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
1e40: 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72  3TestErrorName(r
1e50: 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
1e60: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1e70: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   TCL_OK;.}..stat
1e80: 69 63 20 69 6e 74 20 72 65 67 69 73 74 65 72 5f  ic int register_
1e90: 63 69 72 63 6c 65 5f 67 65 6f 6d 28 0a 20 20 76  circle_geom(.  v
1ea0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1eb0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1ec0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1ed0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1ee0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
1ef0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
1f00: 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 55 4e 55  ABLE_RTREE.  UNU
1f10: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 63 6c  SED_PARAMETER(cl
1f20: 69 65 6e 74 44 61 74 61 29 3b 0a 20 20 55 4e 55  ientData);.  UNU
1f30: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 6e  SED_PARAMETER(in
1f40: 74 65 72 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f  terp);.  UNUSED_
1f50: 50 41 52 41 4d 45 54 45 52 28 6f 62 6a 63 29 3b  PARAMETER(objc);
1f60: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1f70: 54 45 52 28 6f 62 6a 76 29 3b 0a 23 65 6c 73 65  TER(objv);.#else
1f80: 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 67 65  .  extern int ge
1f90: 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49  tDbPointer(Tcl_I
1fa0: 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74 20 63 68  nterp*, const ch
1fb0: 61 72 2a 2c 20 73 71 6c 69 74 65 33 2a 2a 29 3b  ar*, sqlite3**);
1fc0: 0a 20 20 65 78 74 65 72 6e 20 63 6f 6e 73 74 20  .  extern const 
1fd0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 54 65 73  char *sqlite3Tes
1fe0: 74 45 72 72 6f 72 4e 61 6d 65 28 69 6e 74 29 3b  tErrorName(int);
1ff0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2000: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2010: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2020: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2030: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2040: 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74  , "DB");.    ret
2050: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2060: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2070: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2080: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2090: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
20a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
20b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 74   rc = sqlite3_rt
20c0: 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c  ree_geometry_cal
20d0: 6c 62 61 63 6b 28 64 62 2c 20 22 63 69 72 63 6c  lback(db, "circl
20e0: 65 22 2c 20 63 69 72 63 6c 65 5f 67 65 6f 6d 2c  e", circle_geom,
20f0: 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65   0);.  Tcl_SetRe
2100: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
2110: 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74  ar *)sqlite3Test
2120: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
2130: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64  CL_STATIC);.#end
2140: 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
2150: 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 53 71 6c 69 74  OK;.}..int Sqlit
2160: 65 74 65 73 74 72 74 72 65 65 5f 49 6e 69 74 28  etestrtree_Init(
2170: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2180: 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74  rp){.  Tcl_Creat
2190: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
21a0: 72 70 2c 20 22 72 65 67 69 73 74 65 72 5f 63 75  rp, "register_cu
21b0: 62 65 5f 67 65 6f 6d 22 2c 20 72 65 67 69 73 74  be_geom", regist
21c0: 65 72 5f 63 75 62 65 5f 67 65 6f 6d 2c 20 30 2c  er_cube_geom, 0,
21d0: 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
21e0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
21f0: 72 70 2c 20 22 72 65 67 69 73 74 65 72 5f 63 69  rp, "register_ci
2200: 72 63 6c 65 5f 67 65 6f 6d 22 2c 72 65 67 69 73  rcle_geom",regis
2210: 74 65 72 5f 63 69 72 63 6c 65 5f 67 65 6f 6d 2c  ter_circle_geom,
2220: 30 2c 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  0,0);.  return T
2230: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a                    CL_OK;.}..