/ Hex Artifact Content
Login

Artifact 0f1fda44b4515d2ab388f997593ac5030ff2023c6ae36fef3ca01b5bf7769e90:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 2d 30 35 2d 32 35  /*.** 2018-05-25
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0190: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 52  an alternative R
01a0: 2d 54 72 65 65 20 76 69 72 74 75 61 6c 20 74 61  -Tree virtual ta
01b0: 62 6c 65 20 74 68 61 74 0a 2a 2a 20 75 73 65 73  ble that.** uses
01c0: 20 70 6f 6c 79 67 6f 6e 73 20 74 6f 20 65 78 70   polygons to exp
01d0: 72 65 73 73 20 74 68 65 20 62 6f 75 6e 64 61 72  ress the boundar
01e0: 69 65 73 20 6f 66 20 32 2d 64 69 6d 65 6e 73 69  ies of 2-dimensi
01f0: 6f 6e 61 6c 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a  onal objects..**
0200: 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69 73  .** This file is
0210: 20 23 69 6e 63 6c 75 64 65 2d 65 64 20 6f 6e 74   #include-ed ont
0220: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 22 72 74  o the end of "rt
0230: 72 65 65 2e 63 22 20 73 6f 20 74 68 61 74 20 69  ree.c" so that i
0240: 74 20 68 61 73 0a 2a 2a 20 61 63 63 65 73 73 20  t has.** access 
0250: 74 6f 20 61 6c 6c 20 6f 66 20 74 68 65 20 52 2d  to all of the R-
0260: 54 72 65 65 20 69 6e 74 65 72 6e 61 6c 73 2e 0a  Tree internals..
0270: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  */.#include <std
0280: 6c 69 62 2e 68 3e 0a 0a 2f 2a 20 45 6e 61 62 6c  lib.h>../* Enabl
0290: 65 20 2d 44 47 45 4f 50 4f 4c 59 5f 45 4e 41 42  e -DGEOPOLY_ENAB
02a0: 4c 45 5f 44 45 42 55 47 20 66 6f 72 20 64 65 62  LE_DEBUG for deb
02b0: 75 67 67 69 6e 67 20 66 61 63 69 6c 69 74 69 65  ugging facilitie
02c0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 47 45 4f 50  s */.#ifdef GEOP
02d0: 4f 4c 59 5f 45 4e 41 42 4c 45 5f 44 45 42 55 47  OLY_ENABLE_DEBUG
02e0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 67 65  .  static int ge
02f0: 6f 5f 64 65 62 75 67 20 3d 20 30 3b 0a 23 20 64  o_debug = 0;.# d
0300: 65 66 69 6e 65 20 47 45 4f 44 45 42 55 47 28 58  efine GEODEBUG(X
0310: 29 20 69 66 28 67 65 6f 5f 64 65 62 75 67 29 70  ) if(geo_debug)p
0320: 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20  rintf X.#else.# 
0330: 64 65 66 69 6e 65 20 47 45 4f 44 45 42 55 47 28  define GEODEBUG(
0340: 58 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  X).#endif..#ifnd
0350: 65 66 20 4a 53 4f 4e 5f 4e 55 4c 4c 20 20 20 2f  ef JSON_NULL   /
0360: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0370: 73 74 75 66 66 20 72 65 70 65 61 74 73 20 74 68  stuff repeats th
0380: 69 6e 67 73 20 66 6f 75 6e 64 20 69 6e 20 6a 73  ings found in js
0390: 6f 6e 31 20 2a 2f 0a 2f 2a 0a 2a 2a 20 56 65 72  on1 */./*.** Ver
03a0: 73 69 6f 6e 73 20 6f 66 20 69 73 73 70 61 63 65  sions of isspace
03b0: 28 29 2c 20 69 73 61 6c 6e 75 6d 28 29 20 61 6e  (), isalnum() an
03c0: 64 20 69 73 64 69 67 69 74 28 29 20 74 6f 20 77  d isdigit() to w
03d0: 68 69 63 68 20 69 74 20 69 73 20 73 61 66 65 0a  hich it is safe.
03e0: 2a 2a 20 74 6f 20 70 61 73 73 20 73 69 67 6e 65  ** to pass signe
03f0: 64 20 63 68 61 72 20 76 61 6c 75 65 73 2e 0a 2a  d char values..*
0400: 2f 0a 23 69 66 64 65 66 20 73 71 6c 69 74 65 33  /.#ifdef sqlite3
0410: 49 73 64 69 67 69 74 0a 20 20 20 2f 2a 20 55 73  Isdigit.   /* Us
0420: 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  e the SQLite cor
0430: 65 20 76 65 72 73 69 6f 6e 73 20 69 66 20 74 68  e versions if th
0440: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
0450: 72 74 20 6f 66 20 74 68 65 0a 20 20 20 2a 2a 20  rt of the.   ** 
0460: 53 51 4c 69 74 65 20 61 6d 61 6c 67 61 6d 61 74  SQLite amalgamat
0470: 69 6f 6e 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65  ion */.#  define
0480: 20 73 61 66 65 5f 69 73 64 69 67 69 74 28 78 29   safe_isdigit(x)
0490: 20 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74    sqlite3Isdigit
04a0: 28 78 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61  (x).#  define sa
04b0: 66 65 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 73  fe_isalnum(x)  s
04c0: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 78 29  qlite3Isalnum(x)
04d0: 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66 65 5f  .#  define safe_
04e0: 69 73 78 64 69 67 69 74 28 78 29 20 73 71 6c 69  isxdigit(x) sqli
04f0: 74 65 33 49 73 78 64 69 67 69 74 28 78 29 0a 23  te3Isxdigit(x).#
0500: 65 6c 73 65 0a 20 20 20 2f 2a 20 55 73 65 20 74  else.   /* Use t
0510: 68 65 20 73 74 61 6e 64 61 72 64 20 6c 69 62 72  he standard libr
0520: 61 72 79 20 66 6f 72 20 73 65 70 61 72 61 74 65  ary for separate
0530: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 2a 2f 0a   compilation */.
0540: 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e  #include <ctype.
0550: 68 3e 20 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74  h>  /* amalgamat
0560: 6f 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 20 20 64  or: keep */.#  d
0570: 65 66 69 6e 65 20 73 61 66 65 5f 69 73 64 69 67  efine safe_isdig
0580: 69 74 28 78 29 20 20 69 73 64 69 67 69 74 28 28  it(x)  isdigit((
0590: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78  unsigned char)(x
05a0: 29 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66  )).#  define saf
05b0: 65 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 69 73  e_isalnum(x)  is
05c0: 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20  alnum((unsigned 
05d0: 63 68 61 72 29 28 78 29 29 0a 23 20 20 64 65 66  char)(x)).#  def
05e0: 69 6e 65 20 73 61 66 65 5f 69 73 78 64 69 67 69  ine safe_isxdigi
05f0: 74 28 78 29 20 69 73 78 64 69 67 69 74 28 28 75  t(x) isxdigit((u
0600: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29  nsigned char)(x)
0610: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
0620: 47 72 6f 77 69 6e 67 20 6f 75 72 20 6f 77 6e 20  Growing our own 
0630: 69 73 73 70 61 63 65 28 29 20 72 6f 75 74 69 6e  isspace() routin
0640: 65 20 74 68 69 73 20 77 61 79 20 69 73 20 74 77  e this way is tw
0650: 69 63 65 20 61 73 20 66 61 73 74 20 61 73 0a 2a  ice as fast as.*
0660: 2a 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73  * the library is
0670: 73 70 61 63 65 28 29 20 66 75 6e 63 74 69 6f 6e  space() function
0680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
0690: 74 20 63 68 61 72 20 67 65 6f 70 6f 6c 79 49 73  t char geopolyIs
06a0: 53 70 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 30 2c  Space[] = {.  0,
06b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
06c0: 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 31 2c 20  0, 0,     0, 1, 
06d0: 31 2c 20 30 2c 20 30 2c 20 31 2c 20 30 2c 20 30  1, 0, 0, 1, 0, 0
06e0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
06f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20  0, 0, 0, 0,     
0700: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0710: 2c 20 30 2c 20 30 2c 0a 20 20 31 2c 20 30 2c 20  , 0, 0,.  1, 0, 
0720: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0730: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,     0, 0, 0, 0
0740: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
0750: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0760: 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30  , 0, 0,     0, 0
0770: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0780: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
0790: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
07a0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
07b0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
07c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
07d0: 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c   0,     0, 0, 0,
07e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
07f0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
0800: 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c   0, 0, 0,     0,
0810: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0820: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
0830: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0840: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
0850: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
0860: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0870: 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20  0, 0,     0, 0, 
0880: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0890: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
08a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20  0, 0, 0, 0,     
08b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
08c0: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
08d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
08e0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,     0, 0, 0, 0
08f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
0900: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0910: 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30  , 0, 0,     0, 0
0920: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0930: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
0940: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
0950: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
0960: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
0970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0980: 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c   0,     0, 0, 0,
0990: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
09a0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
09b0: 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c   0, 0, 0,     0,
09c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09d0: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
09e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09f0: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
0a00: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 7d 3b 0a 23  0, 0, 0, 0,.};.#
0a10: 64 65 66 69 6e 65 20 73 61 66 65 5f 69 73 73 70  define safe_issp
0a20: 61 63 65 28 78 29 20 28 67 65 6f 70 6f 6c 79 49  ace(x) (geopolyI
0a30: 73 53 70 61 63 65 5b 28 75 6e 73 69 67 6e 65 64  sSpace[(unsigned
0a40: 20 63 68 61 72 29 78 5d 29 0a 23 65 6e 64 69 66   char)x]).#endif
0a50: 20 2f 2a 20 4a 53 4f 4e 20 4e 55 4c 4c 20 2d 20   /* JSON NULL - 
0a60: 62 61 63 6b 20 74 6f 20 6f 72 69 67 69 6e 61 6c  back to original
0a70: 20 63 6f 64 65 20 2a 2f 0a 0a 2f 2a 20 43 6f 6d   code */../* Com
0a80: 70 69 6c 65 72 20 61 6e 64 20 76 65 72 73 69 6f  piler and versio
0a90: 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 47 43 43  n */.#ifndef GCC
0aa0: 5f 56 45 52 53 49 4f 4e 0a 23 69 66 20 64 65 66  _VERSION.#if def
0ab0: 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 26  ined(__GNUC__) &
0ac0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
0ad0: 45 5f 44 49 53 41 42 4c 45 5f 49 4e 54 52 49 4e  E_DISABLE_INTRIN
0ae0: 53 49 43 29 0a 23 20 64 65 66 69 6e 65 20 47 43  SIC).# define GC
0af0: 43 5f 56 45 52 53 49 4f 4e 20 28 5f 5f 47 4e 55  C_VERSION (__GNU
0b00: 43 5f 5f 2a 31 30 30 30 30 30 30 2b 5f 5f 47 4e  C__*1000000+__GN
0b10: 55 43 5f 4d 49 4e 4f 52 5f 5f 2a 31 30 30 30 2b  UC_MINOR__*1000+
0b20: 5f 5f 47 4e 55 43 5f 50 41 54 43 48 4c 45 56 45  __GNUC_PATCHLEVE
0b30: 4c 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  L__).#else.# def
0b40: 69 6e 65 20 47 43 43 5f 56 45 52 53 49 4f 4e 20  ine GCC_VERSION 
0b50: 30 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  0.#endif.#endif.
0b60: 23 69 66 6e 64 65 66 20 4d 53 56 43 5f 56 45 52  #ifndef MSVC_VER
0b70: 53 49 4f 4e 0a 23 69 66 20 64 65 66 69 6e 65 64  SION.#if defined
0b80: 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 21 64  (_MSC_VER) && !d
0b90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49  efined(SQLITE_DI
0ba0: 53 41 42 4c 45 5f 49 4e 54 52 49 4e 53 49 43 29  SABLE_INTRINSIC)
0bb0: 0a 23 20 64 65 66 69 6e 65 20 4d 53 56 43 5f 56  .# define MSVC_V
0bc0: 45 52 53 49 4f 4e 20 5f 4d 53 43 5f 56 45 52 0a  ERSION _MSC_VER.
0bd0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
0be0: 53 56 43 5f 56 45 52 53 49 4f 4e 20 30 0a 23 65  SVC_VERSION 0.#e
0bf0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  ndif.#endif../* 
0c00: 44 61 74 61 74 79 70 65 20 66 6f 72 20 63 6f 6f  Datatype for coo
0c10: 72 64 69 6e 61 74 65 73 0a 2a 2f 0a 74 79 70 65  rdinates.*/.type
0c20: 64 65 66 20 66 6c 6f 61 74 20 47 65 6f 43 6f 6f  def float GeoCoo
0c30: 72 64 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  rd;../*.** Inter
0c40: 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69  nal representati
0c50: 6f 6e 20 6f 66 20 61 20 70 6f 6c 79 67 6f 6e 2e  on of a polygon.
0c60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 6c 79 67  .**.** The polyg
0c70: 6f 6e 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  on consists of a
0c80: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 76 65 72   sequence of ver
0c90: 74 65 78 65 73 2e 20 20 54 68 65 72 65 20 69 73  texes.  There is
0ca0: 20 61 20 6c 69 6e 65 0a 2a 2a 20 73 65 67 6d 65   a line.** segme
0cb0: 6e 74 20 62 65 74 77 65 65 6e 20 65 61 63 68 20  nt between each 
0cc0: 70 61 69 72 20 6f 66 20 76 65 72 74 65 78 65 73  pair of vertexes
0cd0: 2c 20 61 6e 64 20 6f 6e 65 20 66 69 6e 61 6c 20  , and one final 
0ce0: 73 65 67 6d 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20  segment from.** 
0cf0: 74 68 65 20 6c 61 73 74 20 76 65 72 74 65 78 20  the last vertex 
0d00: 62 61 63 6b 20 74 6f 20 74 68 65 20 66 69 72 73  back to the firs
0d10: 74 2e 20 20 28 54 68 69 73 20 64 69 66 66 65 72  t.  (This differ
0d20: 73 20 66 72 6f 6d 20 74 68 65 20 47 65 6f 4a 53  s from the GeoJS
0d30: 4f 4e 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  ON.** standard i
0d40: 6e 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  n which the fina
0d50: 6c 20 76 65 72 74 65 78 20 69 73 20 61 20 72 65  l vertex is a re
0d60: 70 65 61 74 20 6f 66 20 74 68 65 20 66 69 72 73  peat of the firs
0d70: 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  t.).**.** The po
0d80: 6c 79 67 6f 6e 20 66 6f 6c 6c 6f 77 73 20 74 68  lygon follows th
0d90: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 72 75 6c  e right-hand rul
0da0: 65 2e 20 20 54 68 65 20 61 72 65 61 20 74 6f 20  e.  The area to 
0db0: 74 68 65 20 72 69 67 68 74 20 6f 66 0a 2a 2a 20  the right of.** 
0dc0: 65 61 63 68 20 73 65 67 6d 65 6e 74 20 69 73 20  each segment is 
0dd0: 22 6f 75 74 73 69 64 65 22 20 61 6e 64 20 74 68  "outside" and th
0de0: 65 20 61 72 65 61 20 74 6f 20 74 68 65 20 6c 65  e area to the le
0df0: 66 74 20 69 73 20 22 69 6e 73 69 64 65 22 2e 0a  ft is "inside"..
0e00: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 2d 64 69 73  **.** The on-dis
0e10: 6b 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  k representation
0e20: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
0e30: 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 6f 6c  -byte header fol
0e40: 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  lowed by.** the 
0e50: 76 61 6c 75 65 73 2e 20 20 54 68 65 20 34 2d 62  values.  The 4-b
0e60: 79 74 65 20 68 65 61 64 65 72 20 69 73 3a 0a 2a  yte header is:.*
0e70: 2a 0a 2a 2a 20 20 20 20 20 20 65 6e 63 6f 64 69  *.**      encodi
0e80: 6e 67 20 20 20 20 28 31 20 62 79 74 65 29 20 20  ng    (1 byte)  
0e90: 20 30 3d 62 69 67 2d 65 6e 64 69 61 6e 2c 20 31   0=big-endian, 1
0ea0: 3d 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 0a 2a  =little-endian.*
0eb0: 2a 20 20 20 20 20 20 6e 76 65 72 74 65 78 20 20  *      nvertex  
0ec0: 20 20 20 28 33 20 62 79 74 65 73 29 20 20 4e 75     (3 bytes)  Nu
0ed0: 6d 62 65 72 20 6f 66 20 76 65 72 74 65 78 65 73  mber of vertexes
0ee0: 20 61 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   as a big-endian
0ef0: 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 74 79 70 65   integer.*/.type
0f00: 64 65 66 20 73 74 72 75 63 74 20 47 65 6f 50 6f  def struct GeoPo
0f10: 6c 79 20 47 65 6f 50 6f 6c 79 3b 0a 73 74 72 75  ly GeoPoly;.stru
0f20: 63 74 20 47 65 6f 50 6f 6c 79 20 7b 0a 20 20 69  ct GeoPoly {.  i
0f30: 6e 74 20 6e 56 65 72 74 65 78 3b 20 20 20 20 20  nt nVertex;     
0f40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0f50: 66 20 76 65 72 74 65 78 65 73 20 2a 2f 0a 20 20  f vertexes */.  
0f60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 68 64  unsigned char hd
0f70: 72 5b 34 5d 3b 20 2f 2a 20 48 65 61 64 65 72 20  r[4]; /* Header 
0f80: 66 6f 72 20 6f 6e 2d 64 69 73 6b 20 72 65 70 72  for on-disk repr
0f90: 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  esentation */.  
0fa0: 47 65 6f 43 6f 6f 72 64 20 61 5b 32 5d 3b 20 20  GeoCoord a[2];  
0fb0: 20 20 2f 2a 20 32 2a 6e 56 65 72 74 65 78 20 76    /* 2*nVertex v
0fc0: 61 6c 75 65 73 2e 20 58 20 28 6c 6f 6e 67 69 74  alues. X (longit
0fd0: 75 64 65 29 20 66 69 72 73 74 2c 20 74 68 65 6e  ude) first, then
0fe0: 20 59 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20   Y */.};../*.** 
0ff0: 53 74 61 74 65 20 6f 66 20 61 20 70 61 72 73 65  State of a parse
1000: 20 6f 66 20 61 20 47 65 6f 4a 53 4f 4e 20 69 6e   of a GeoJSON in
1010: 70 75 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  put..*/.typedef 
1020: 73 74 72 75 63 74 20 47 65 6f 50 61 72 73 65 20  struct GeoParse 
1030: 47 65 6f 50 61 72 73 65 3b 0a 73 74 72 75 63 74  GeoParse;.struct
1040: 20 47 65 6f 50 61 72 73 65 20 7b 0a 20 20 63 6f   GeoParse {.  co
1050: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1060: 72 20 2a 7a 3b 20 20 20 2f 2a 20 55 6e 70 61 72  r *z;   /* Unpar
1070: 73 65 64 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69  sed input */.  i
1080: 6e 74 20 6e 56 65 72 74 65 78 3b 20 20 20 20 20  nt nVertex;     
1090: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10a0: 65 72 20 6f 66 20 76 65 72 74 65 78 65 73 20 69  er of vertexes i
10b0: 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  n a[] */.  int n
10c0: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
10d0: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
10e0: 6c 6f 63 61 74 65 64 20 74 6f 20 61 5b 5d 20 2a  located to a[] *
10f0: 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20  /.  int nErr;   
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1110: 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
1120: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  s encountered */
1130: 0a 20 20 47 65 6f 43 6f 6f 72 64 20 2a 61 3b 20  .  GeoCoord *a; 
1140: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
1150: 79 20 6f 66 20 76 65 72 74 65 78 65 73 2e 20 20  y of vertexes.  
1160: 46 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  From sqlite3_mal
1170: 6c 6f 63 36 34 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f  loc64() */.};../
1180: 2a 20 44 6f 20 61 20 34 2d 62 79 74 65 20 62 79  * Do a 4-byte by
1190: 74 65 20 73 77 61 70 20 2a 2f 0a 73 74 61 74 69  te swap */.stati
11a0: 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 53 77  c void geopolySw
11b0: 61 62 33 32 28 75 6e 73 69 67 6e 65 64 20 63 68  ab32(unsigned ch
11c0: 61 72 20 2a 61 29 7b 0a 20 20 75 6e 73 69 67 6e  ar *a){.  unsign
11d0: 65 64 20 63 68 61 72 20 74 20 3d 20 61 5b 30 5d  ed char t = a[0]
11e0: 3b 0a 20 20 61 5b 30 5d 20 3d 20 61 5b 33 5d 3b  ;.  a[0] = a[3];
11f0: 0a 20 20 61 5b 33 5d 20 3d 20 74 3b 0a 20 20 74  .  a[3] = t;.  t
1200: 20 3d 20 61 5b 31 5d 3b 0a 20 20 61 5b 31 5d 20   = a[1];.  a[1] 
1210: 3d 20 61 5b 32 5d 3b 0a 20 20 61 5b 32 5d 20 3d  = a[2];.  a[2] =
1220: 20 74 3b 0a 7d 0a 0a 2f 2a 20 53 6b 69 70 20 77   t;.}../* Skip w
1230: 68 69 74 65 73 70 61 63 65 2e 20 20 52 65 74 75  hitespace.  Retu
1240: 72 6e 20 74 68 65 20 6e 65 78 74 20 6e 6f 6e 2d  rn the next non-
1250: 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72 61  whitespace chara
1260: 63 74 65 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20  cter. */.static 
1270: 63 68 61 72 20 67 65 6f 70 6f 6c 79 53 6b 69 70  char geopolySkip
1280: 53 70 61 63 65 28 47 65 6f 50 61 72 73 65 20 2a  Space(GeoParse *
1290: 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  p){.  while( p->
12a0: 7a 5b 30 5d 20 26 26 20 73 61 66 65 5f 69 73 73  z[0] && safe_iss
12b0: 70 61 63 65 28 70 2d 3e 7a 5b 30 5d 29 20 29 20  pace(p->z[0]) ) 
12c0: 70 2d 3e 7a 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  p->z++;.  return
12d0: 20 70 2d 3e 7a 5b 30 5d 3b 0a 7d 0a 0a 2f 2a 20   p->z[0];.}../* 
12e0: 50 61 72 73 65 20 6f 75 74 20 61 20 6e 75 6d 62  Parse out a numb
12f0: 65 72 2e 20 20 57 72 69 74 65 20 74 68 65 20 76  er.  Write the v
1300: 61 6c 75 65 20 69 6e 74 6f 20 2a 70 56 61 6c 20  alue into *pVal 
1310: 69 66 20 70 56 61 6c 21 3d 30 2e 0a 2a 2a 20 72  if pVal!=0..** r
1320: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
1330: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 7a 65  n success and ze
1340: 72 6f 20 69 66 20 74 68 65 20 6e 65 78 74 20 74  ro if the next t
1350: 6f 6b 65 6e 20 69 73 20 6e 6f 74 20 61 20 6e 75  oken is not a nu
1360: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
1370: 69 6e 74 20 67 65 6f 70 6f 6c 79 50 61 72 73 65  int geopolyParse
1380: 4e 75 6d 62 65 72 28 47 65 6f 50 61 72 73 65 20  Number(GeoParse 
1390: 2a 70 2c 20 47 65 6f 43 6f 6f 72 64 20 2a 70 56  *p, GeoCoord *pV
13a0: 61 6c 29 7b 0a 20 20 63 68 61 72 20 63 20 3d 20  al){.  char c = 
13b0: 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70 61 63 65  geopolySkipSpace
13c0: 28 70 29 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  (p);.  const uns
13d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20  igned char *z = 
13e0: 70 2d 3e 7a 3b 0a 20 20 69 6e 74 20 6a 20 3d 20  p->z;.  int j = 
13f0: 30 3b 0a 20 20 69 6e 74 20 73 65 65 6e 44 50 20  0;.  int seenDP 
1400: 3d 20 30 3b 0a 20 20 69 6e 74 20 73 65 65 6e 45  = 0;.  int seenE
1410: 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 3d 3d 27   = 0;.  if( c=='
1420: 2d 27 20 29 7b 0a 20 20 20 20 6a 20 3d 20 31 3b  -' ){.    j = 1;
1430: 0a 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20  .    c = z[j];. 
1440: 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 30 27 20   }.  if( c=='0' 
1450: 26 26 20 7a 5b 6a 2b 31 5d 3e 3d 27 30 27 20 26  && z[j+1]>='0' &
1460: 26 20 7a 5b 6a 2b 31 5d 3c 3d 27 39 27 20 29 20  & z[j+1]<='9' ) 
1470: 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
1480: 3b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 63 20 3d  ;; j++){.    c =
1490: 20 7a 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 63   z[j];.    if( c
14a0: 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20  >='0' && c<='9' 
14b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14c0: 69 66 28 20 63 3d 3d 27 2e 27 20 29 7b 0a 20 20  if( c=='.' ){.  
14d0: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d      if( z[j-1]==
14e0: 27 2d 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  '-' ) return 0;.
14f0: 20 20 20 20 20 20 69 66 28 20 73 65 65 6e 44 50        if( seenDP
1500: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1510: 20 20 20 73 65 65 6e 44 50 20 3d 20 31 3b 0a 20     seenDP = 1;. 
1520: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1530: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d     }.    if( c==
1540: 27 65 27 20 7c 7c 20 63 3d 3d 27 45 27 20 29 7b  'e' || c=='E' ){
1550: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31  .      if( z[j-1
1560: 5d 3c 27 30 27 20 29 20 72 65 74 75 72 6e 20 30  ]<'0' ) return 0
1570: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 65 6e  ;.      if( seen
1580: 45 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  E ) return -1;. 
1590: 20 20 20 20 20 73 65 65 6e 44 50 20 3d 20 73 65       seenDP = se
15a0: 65 6e 45 20 3d 20 31 3b 0a 20 20 20 20 20 20 63  enE = 1;.      c
15b0: 20 3d 20 7a 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20   = z[j+1];.     
15c0: 20 69 66 28 20 63 3d 3d 27 2b 27 20 7c 7c 20 63   if( c=='+' || c
15d0: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
15e0: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 20   j++;.        c 
15f0: 3d 20 7a 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20  = z[j+1];.      
1600: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 27 30  }.      if( c<'0
1610: 27 20 7c 7c 20 63 3e 27 39 27 20 29 20 72 65 74  ' || c>'9' ) ret
1620: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  urn 0;.      con
1630: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1640: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
1650: 28 20 7a 5b 6a 2d 31 5d 3c 27 30 27 20 29 20 72  ( z[j-1]<'0' ) r
1660: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1670: 56 61 6c 20 29 20 2a 70 56 61 6c 20 3d 20 61 74  Val ) *pVal = at
1680: 6f 66 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  of((const char*)
1690: 70 2d 3e 7a 29 3b 0a 20 20 70 2d 3e 7a 20 2b 3d  p->z);.  p->z +=
16a0: 20 6a 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   j;.  return 1;.
16b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
16c0: 69 6e 70 75 74 20 69 73 20 61 20 77 65 6c 6c 2d  input is a well-
16d0: 66 6f 72 6d 65 64 20 4a 53 4f 4e 20 61 72 72 61  formed JSON arra
16e0: 79 20 6f 66 20 63 6f 6f 72 64 69 6e 61 74 65 73  y of coordinates
16f0: 20 77 69 74 68 20 61 74 20 6c 65 61 73 74 0a 2a   with at least.*
1700: 2a 20 66 6f 75 72 20 63 6f 6f 72 64 69 6e 61 74  * four coordinat
1710: 65 73 20 61 6e 64 20 77 68 65 72 65 20 65 61 63  es and where eac
1720: 68 20 63 6f 6f 72 64 69 6e 61 74 65 20 69 73 20  h coordinate is 
1730: 69 74 73 65 6c 66 20 61 20 74 77 6f 2d 76 61 6c  itself a two-val
1740: 75 65 20 61 72 72 61 79 2c 0a 2a 2a 20 74 68 65  ue array,.** the
1750: 6e 20 63 6f 6e 76 65 72 74 20 74 68 65 20 4a 53  n convert the JS
1760: 4f 4e 20 69 6e 74 6f 20 61 20 47 65 6f 50 6f 6c  ON into a GeoPol
1770: 79 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  y object and ret
1780: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1790: 0a 2a 2a 20 74 68 61 74 20 6f 62 6a 65 63 74 2e  .** that object.
17a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 65 72  .**.** If any er
17b0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
17c0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
17d0: 69 63 20 47 65 6f 50 6f 6c 79 20 2a 67 65 6f 70  ic GeoPoly *geop
17e0: 6f 6c 79 50 61 72 73 65 4a 73 6f 6e 28 63 6f 6e  olyParseJson(con
17f0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1800: 20 2a 7a 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a   *z, int *pRc){.
1810: 20 20 47 65 6f 50 61 72 73 65 20 73 3b 0a 20 20    GeoParse s;.  
1820: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1830: 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c  OK;.  memset(&s,
1840: 20 30 2c 20 73 69 7a 65 6f 66 28 73 29 29 3b 0a   0, sizeof(s));.
1850: 20 20 73 2e 7a 20 3d 20 7a 3b 0a 20 20 69 66 28    s.z = z;.  if(
1860: 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70 61 63   geopolySkipSpac
1870: 65 28 26 73 29 3d 3d 27 5b 27 20 29 7b 0a 20 20  e(&s)=='[' ){.  
1880: 20 20 73 2e 7a 2b 2b 3b 0a 20 20 20 20 77 68 69    s.z++;.    whi
1890: 6c 65 28 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53  le( geopolySkipS
18a0: 70 61 63 65 28 26 73 29 3d 3d 27 5b 27 20 29 7b  pace(&s)=='[' ){
18b0: 0a 20 20 20 20 20 20 69 6e 74 20 69 69 20 3d 20  .      int ii = 
18c0: 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b  0;.      char c;
18d0: 0a 20 20 20 20 20 20 73 2e 7a 2b 2b 3b 0a 20 20  .      s.z++;.  
18e0: 20 20 20 20 69 66 28 20 73 2e 6e 56 65 72 74 65      if( s.nVerte
18f0: 78 3c 3d 73 2e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  x<=s.nAlloc ){. 
1900: 20 20 20 20 20 20 20 47 65 6f 43 6f 6f 72 64 20         GeoCoord 
1910: 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73  *aNew;.        s
1920: 2e 6e 41 6c 6c 6f 63 20 3d 20 73 2e 6e 41 6c 6c  .nAlloc = s.nAll
1930: 6f 63 2a 32 20 2b 20 31 36 3b 0a 20 20 20 20 20  oc*2 + 16;.     
1940: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
1950: 33 5f 72 65 61 6c 6c 6f 63 36 34 28 73 2e 61 2c  3_realloc64(s.a,
1960: 20 73 2e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66   s.nAlloc*sizeof
1970: 28 47 65 6f 43 6f 6f 72 64 29 2a 32 20 29 3b 0a  (GeoCoord)*2 );.
1980: 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77          if( aNew
1990: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
19a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
19b0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 2e  EM;.          s.
19c0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
19d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19e0: 20 7d 0a 20 20 20 20 20 20 20 20 73 2e 61 20 3d   }.        s.a =
19f0: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   aNew;.      }. 
1a00: 20 20 20 20 20 77 68 69 6c 65 28 20 67 65 6f 70       while( geop
1a10: 6f 6c 79 50 61 72 73 65 4e 75 6d 62 65 72 28 26  olyParseNumber(&
1a20: 73 2c 20 69 69 3c 3d 31 20 3f 20 26 73 2e 61 5b  s, ii<=1 ? &s.a[
1a30: 73 2e 6e 56 65 72 74 65 78 2a 32 2b 69 69 5d 20  s.nVertex*2+ii] 
1a40: 3a 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  : 0) ){.        
1a50: 69 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66  ii++;.        if
1a60: 28 20 69 69 3d 3d 32 20 29 20 73 2e 6e 56 65 72  ( ii==2 ) s.nVer
1a70: 74 65 78 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  tex++;.        c
1a80: 20 3d 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70   = geopolySkipSp
1a90: 61 63 65 28 26 73 29 3b 0a 20 20 20 20 20 20 20  ace(&s);.       
1aa0: 20 73 2e 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20   s.z++;.        
1ab0: 69 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 6f 6e  if( c==',' ) con
1ac0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
1ad0: 66 28 20 63 3d 3d 27 5d 27 20 26 26 20 69 69 3e  f( c==']' && ii>
1ae0: 3d 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =2 ) break;.    
1af0: 20 20 20 20 73 2e 6e 45 72 72 2b 2b 3b 0a 20 20      s.nErr++;.  
1b00: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b10: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
1b20: 20 67 6f 74 6f 20 70 61 72 73 65 5f 6a 73 6f 6e   goto parse_json
1b30: 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
1b40: 20 20 20 20 69 66 28 20 67 65 6f 70 6f 6c 79 53      if( geopolyS
1b50: 6b 69 70 53 70 61 63 65 28 26 73 29 3d 3d 27 2c  kipSpace(&s)==',
1b60: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73 2e 7a  ' ){.        s.z
1b70: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ++;.        cont
1b80: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
1b90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ba0: 0a 20 20 20 20 69 66 28 20 67 65 6f 70 6f 6c 79  .    if( geopoly
1bb0: 53 6b 69 70 53 70 61 63 65 28 26 73 29 3d 3d 27  SkipSpace(&s)=='
1bc0: 5d 27 0a 20 20 20 20 20 26 26 20 73 2e 6e 56 65  ]'.     && s.nVe
1bd0: 72 74 65 78 3e 3d 34 0a 20 20 20 20 20 26 26 20  rtex>=4.     && 
1be0: 73 2e 61 5b 30 5d 3d 3d 73 2e 61 5b 73 2e 6e 56  s.a[0]==s.a[s.nV
1bf0: 65 72 74 65 78 2a 32 2d 32 5d 0a 20 20 20 20 20  ertex*2-2].     
1c00: 26 26 20 73 2e 61 5b 31 5d 3d 3d 73 2e 61 5b 73  && s.a[1]==s.a[s
1c10: 2e 6e 56 65 72 74 65 78 2a 32 2d 31 5d 0a 20 20  .nVertex*2-1].  
1c20: 20 20 20 26 26 20 28 73 2e 7a 2b 2b 2c 20 67 65     && (s.z++, ge
1c30: 6f 70 6f 6c 79 53 6b 69 70 53 70 61 63 65 28 26  opolySkipSpace(&
1c40: 73 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  s)==0).    ){.  
1c50: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20      int nByte;. 
1c60: 20 20 20 20 20 47 65 6f 50 6f 6c 79 20 2a 70 4f       GeoPoly *pO
1c70: 75 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  ut;.      int x 
1c80: 3d 20 31 3b 0a 20 20 20 20 20 20 73 2e 6e 56 65  = 1;.      s.nVe
1c90: 72 74 65 78 2d 2d 3b 20 20 2f 2a 20 52 65 6d 6f  rtex--;  /* Remo
1ca0: 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74  ve the redundant
1cb0: 20 76 65 72 74 65 78 20 61 74 20 74 68 65 20 65   vertex at the e
1cc0: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 6e 42 79 74  nd */.      nByt
1cd0: 65 20 3d 20 73 69 7a 65 6f 66 28 47 65 6f 50 6f  e = sizeof(GeoPo
1ce0: 6c 79 29 20 2a 20 73 2e 6e 56 65 72 74 65 78 2a  ly) * s.nVertex*
1cf0: 32 2a 73 69 7a 65 6f 66 28 47 65 6f 43 6f 6f 72  2*sizeof(GeoCoor
1d00: 64 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d  d);.      pOut =
1d10: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1d20: 34 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20  4( nByte );.    
1d30: 20 20 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 69    x = 1;.      i
1d40: 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 67 6f 74  f( pOut==0 ) got
1d50: 6f 20 70 61 72 73 65 5f 6a 73 6f 6e 5f 65 72 72  o parse_json_err
1d60: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e 56  ;.      pOut->nV
1d70: 65 72 74 65 78 20 3d 20 73 2e 6e 56 65 72 74 65  ertex = s.nVerte
1d80: 78 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  x;.      memcpy(
1d90: 70 4f 75 74 2d 3e 61 2c 20 73 2e 61 2c 20 73 2e  pOut->a, s.a, s.
1da0: 6e 56 65 72 74 65 78 2a 32 2a 73 69 7a 65 6f 66  nVertex*2*sizeof
1db0: 28 47 65 6f 43 6f 6f 72 64 29 29 3b 0a 20 20 20  (GeoCoord));.   
1dc0: 20 20 20 70 4f 75 74 2d 3e 68 64 72 5b 30 5d 20     pOut->hdr[0] 
1dd0: 3d 20 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  = *(unsigned cha
1de0: 72 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4f 75  r*)&x;.      pOu
1df0: 74 2d 3e 68 64 72 5b 31 5d 20 3d 20 28 73 2e 6e  t->hdr[1] = (s.n
1e00: 56 65 72 74 65 78 3e 3e 31 36 29 26 30 78 66 66  Vertex>>16)&0xff
1e10: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 68 64  ;.      pOut->hd
1e20: 72 5b 32 5d 20 3d 20 28 73 2e 6e 56 65 72 74 65  r[2] = (s.nVerte
1e30: 78 3e 3e 38 29 26 30 78 66 66 3b 0a 20 20 20 20  x>>8)&0xff;.    
1e40: 20 20 70 4f 75 74 2d 3e 68 64 72 5b 33 5d 20 3d    pOut->hdr[3] =
1e50: 20 73 2e 6e 56 65 72 74 65 78 26 30 78 66 66 3b   s.nVertex&0xff;
1e60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1e70: 72 65 65 28 73 2e 61 29 3b 0a 20 20 20 20 20 20  ree(s.a);.      
1e80: 69 66 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d  if( pRc ) *pRc =
1e90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ea0: 20 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 20    return pOut;. 
1eb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ec0: 73 2e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  s.nErr++;.      
1ed0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1ee0: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 70 61 72  R;.    }.  }.par
1ef0: 73 65 5f 6a 73 6f 6e 5f 65 72 72 3a 0a 20 20 69  se_json_err:.  i
1f00: 66 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20  f( pRc ) *pRc = 
1f10: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  rc;.  sqlite3_fr
1f20: 65 65 28 73 2e 61 29 3b 0a 20 20 72 65 74 75 72  ee(s.a);.  retur
1f30: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n 0;.}../*.** Gi
1f40: 76 65 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ven a function p
1f50: 61 72 61 6d 65 74 65 72 2c 20 74 72 79 20 74 6f  arameter, try to
1f60: 20 69 6e 74 65 72 70 72 65 74 20 69 74 20 61 73   interpret it as
1f70: 20 61 20 70 6f 6c 79 67 6f 6e 2c 20 65 69 74 68   a polygon, eith
1f80: 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 62 69 6e  er.** in the bin
1f90: 61 72 79 20 66 6f 72 6d 61 74 20 6f 72 20 4a 53  ary format or JS
1fa0: 4f 4e 20 74 65 78 74 2e 20 20 43 6f 6d 70 75 74  ON text.  Comput
1fb0: 65 20 61 20 47 65 6f 50 6f 6c 79 20 6f 62 6a 65  e a GeoPoly obje
1fc0: 63 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ct and.** return
1fd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1fe0: 61 74 20 6f 62 6a 65 63 74 2e 20 20 4f 72 20 69  at object.  Or i
1ff0: 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6e  f the input is n
2000: 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
2010: 0a 2a 2a 20 70 6f 6c 79 67 6f 6e 2c 20 70 75 74  .** polygon, put
2020: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2030: 65 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e  e in sqlite3_con
2040: 74 65 78 74 20 61 6e 64 20 72 65 74 75 72 6e 20  text and return 
2050: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
2060: 47 65 6f 50 6f 6c 79 20 2a 67 65 6f 70 6f 6c 79  GeoPoly *geopoly
2070: 46 75 6e 63 50 61 72 61 6d 28 0a 20 20 73 71 6c  FuncParam(.  sql
2080: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2090: 74 78 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  tx,      /* Cont
20a0: 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  ext for error me
20b0: 73 73 61 67 65 73 20 2a 2f 0a 20 20 73 71 6c 69  ssages */.  sqli
20c0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c  te3_value *pVal,
20d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
20e0: 61 6c 75 65 20 74 6f 20 64 65 63 6f 64 65 20 2a  alue to decode *
20f0: 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20  /.  int *pRc    
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 2f 2a 20 57 72 69 74 65 20 65 72 72 6f 72 20 68  /* Write error h
2120: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 47 65 6f 50  ere */.){.  GeoP
2130: 6f 6c 79 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  oly *p = 0;.  in
2140: 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 73  t nByte;.  if( s
2150: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2160: 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f  e(pVal)==SQLITE_
2170: 42 4c 4f 42 0a 20 20 20 26 26 20 28 6e 42 79 74  BLOB.   && (nByt
2180: 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
2190: 65 5f 62 79 74 65 73 28 70 56 61 6c 29 29 3e 3d  e_bytes(pVal))>=
21a0: 28 34 2b 36 2a 73 69 7a 65 6f 66 28 47 65 6f 43  (4+6*sizeof(GeoC
21b0: 6f 6f 72 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  oord)).  ){.    
21c0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
21d0: 68 61 72 20 2a 61 20 3d 20 73 71 6c 69 74 65 33  har *a = sqlite3
21e0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c  _value_blob(pVal
21f0: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 56 65 72 74  );.    int nVert
2200: 65 78 3b 0a 20 20 20 20 6e 56 65 72 74 65 78 20  ex;.    nVertex 
2210: 3d 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28  = (a[1]<<16) + (
2220: 61 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b  a[2]<<8) + a[3];
2230: 0a 20 20 20 20 69 66 28 20 28 61 5b 30 5d 3d 3d  .    if( (a[0]==
2240: 30 20 7c 7c 20 61 5b 30 5d 3d 3d 31 29 0a 20 20  0 || a[0]==1).  
2250: 20 20 20 26 26 20 28 6e 56 65 72 74 65 78 2a 32     && (nVertex*2
2260: 2a 73 69 7a 65 6f 66 28 47 65 6f 43 6f 6f 72 64  *sizeof(GeoCoord
2270: 29 20 2b 20 34 29 3d 3d 6e 42 79 74 65 0a 20 20  ) + 4)==nByte.  
2280: 20 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 73    ){.      p = s
2290: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
22a0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 6e   sizeof(*p) + (n
22b0: 56 65 72 74 65 78 2d 31 29 2a 32 2a 73 69 7a 65  Vertex-1)*2*size
22c0: 6f 66 28 47 65 6f 43 6f 6f 72 64 29 20 29 3b 0a  of(GeoCoord) );.
22d0: 20 20 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29        if( p==0 )
22e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52  {.        if( pR
22f0: 63 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49 54  c ) *pRc = SQLIT
2300: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
2310: 20 69 66 28 20 70 43 74 78 20 29 20 73 71 6c 69   if( pCtx ) sqli
2320: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2330: 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20  _nomem(pCtx);.  
2340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2350: 20 20 20 69 6e 74 20 78 20 3d 20 31 3b 0a 20 20     int x = 1;.  
2360: 20 20 20 20 20 20 70 2d 3e 6e 56 65 72 74 65 78        p->nVertex
2370: 20 3d 20 6e 56 65 72 74 65 78 3b 0a 20 20 20 20   = nVertex;.    
2380: 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 68 64      memcpy(p->hd
2390: 72 2c 20 61 2c 20 6e 42 79 74 65 29 3b 0a 20 20  r, a, nByte);.  
23a0: 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 20 21        if( a[0] !
23b0: 3d 20 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  = *(unsigned cha
23c0: 72 2a 29 26 78 20 29 7b 0a 20 20 20 20 20 20 20  r*)&x ){.       
23d0: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
23e0: 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
23f0: 69 3c 6e 56 65 72 74 65 78 2a 32 3b 20 69 69 2b  i<nVertex*2; ii+
2400: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2410: 67 65 6f 70 6f 6c 79 53 77 61 62 33 32 28 28 75  geopolySwab32((u
2420: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70  nsigned char*)&p
2430: 2d 3e 61 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20  ->a[ii]);.      
2440: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2450: 70 2d 3e 68 64 72 5b 30 5d 20 5e 3d 20 31 3b 0a  p->hdr[0] ^= 1;.
2460: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2470: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2480: 70 52 63 20 29 20 2a 70 52 63 20 3d 20 53 51 4c  pRc ) *pRc = SQL
2490: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 74 75  ITE_OK;.    retu
24a0: 72 6e 20 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rn p;.  }else if
24b0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
24c0: 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49  type(pVal)==SQLI
24d0: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 63  TE_TEXT ){.    c
24e0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
24f0: 61 72 20 2a 7a 4a 73 6f 6e 20 3d 20 73 71 6c 69  ar *zJson = sqli
2500: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
2510: 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4a  Val);.    if( zJ
2520: 73 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  son==0 ){.      
2530: 69 66 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d  if( pRc ) *pRc =
2540: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2550: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2560: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2570: 67 65 6f 70 6f 6c 79 50 61 72 73 65 4a 73 6f 6e  geopolyParseJson
2580: 28 7a 4a 73 6f 6e 2c 20 70 52 63 29 3b 0a 20 20  (zJson, pRc);.  
2590: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
25a0: 52 63 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49  Rc ) *pRc = SQLI
25b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65  TE_ERROR;.    re
25c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
25d0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
25e0: 69 6f 6e 20 6f 66 20 74 68 65 20 67 65 6f 70 6f  ion of the geopo
25f0: 6c 79 5f 62 6c 6f 62 28 58 29 20 66 75 6e 63 74  ly_blob(X) funct
2600: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
2610: 65 20 69 6e 70 75 74 20 69 73 20 61 20 77 65 6c  e input is a wel
2620: 6c 2d 66 6f 72 6d 65 64 20 47 65 6f 70 6f 6c 79  l-formed Geopoly
2630: 20 42 4c 4f 42 20 6f 72 20 4a 53 4f 4e 20 73 74   BLOB or JSON st
2640: 72 69 6e 67 0a 2a 2a 20 74 68 65 6e 20 72 65 74  ring.** then ret
2650: 75 72 6e 20 74 68 65 20 42 4c 4f 42 20 72 65 70  urn the BLOB rep
2660: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
2670: 68 65 20 70 6f 6c 79 67 6f 6e 2e 20 20 4f 74 68  he polygon.  Oth
2680: 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e  erwise.** return
2690: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
26a0: 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 42 6c 6f   void geopolyBlo
26b0: 62 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  bFunc(.  sqlite3
26c0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
26d0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
26e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
26f0: 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50 6f  *argv.){.  GeoPo
2700: 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79 46  ly *p = geopolyF
2710: 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78 74  uncParam(context
2720: 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20  , argv[0], 0);. 
2730: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
2740: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
2750: 62 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 68 64  b(context, p->hd
2760: 72 2c 20 0a 20 20 20 20 20 20 20 34 2b 38 2a 70  r, .       4+8*p
2770: 2d 3e 6e 56 65 72 74 65 78 2c 20 53 51 4c 49 54  ->nVertex, SQLIT
2780: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
2790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
27b0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20  SQL function:   
27c0: 20 20 67 65 6f 70 6f 6c 79 5f 6a 73 6f 6e 28 58    geopoly_json(X
27d0: 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ).**.** Interpre
27e0: 74 20 58 20 61 73 20 61 20 70 6f 6c 79 67 6f 6e  t X as a polygon
27f0: 20 61 6e 64 20 72 65 6e 64 65 72 20 69 74 20 61   and render it a
2800: 73 20 61 20 4a 53 4f 4e 20 61 72 72 61 79 0a 2a  s a JSON array.*
2810: 2a 20 6f 66 20 63 6f 6f 72 64 69 6e 61 74 65 73  * of coordinates
2820: 2e 20 20 4f 72 2c 20 69 66 20 58 20 69 73 20 6e  .  Or, if X is n
2830: 6f 74 20 61 20 76 61 6c 69 64 20 70 6f 6c 79 67  ot a valid polyg
2840: 6f 6e 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  on, return NULL.
2850: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2860: 67 65 6f 70 6f 6c 79 4a 73 6f 6e 46 75 6e 63 28  geopolyJsonFunc(
2870: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2880: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
2890: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
28a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
28b0: 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20  ){.  GeoPoly *p 
28c0: 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72  = geopolyFuncPar
28d0: 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  am(context, argv
28e0: 5b 30 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  [0], 0);.  if( p
28f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
2900: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
2910: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
2920: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 73 71  context);.    sq
2930: 6c 69 74 65 33 5f 73 74 72 20 2a 78 20 3d 20 73  lite3_str *x = s
2940: 71 6c 69 74 65 33 5f 73 74 72 5f 6e 65 77 28 64  qlite3_str_new(d
2950: 62 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  b);.    int i;. 
2960: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
2970: 70 70 65 6e 64 28 78 2c 20 22 5b 22 2c 20 31 29  ppend(x, "[", 1)
2980: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2990: 3c 70 2d 3e 6e 56 65 72 74 65 78 3b 20 69 2b 2b  <p->nVertex; i++
29a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29b0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 78 2c 20  _str_appendf(x, 
29c0: 22 5b 25 21 67 2c 25 21 67 5d 2c 22 2c 20 70 2d  "[%!g,%!g],", p-
29d0: 3e 61 5b 69 2a 32 5d 2c 20 70 2d 3e 61 5b 69 2a  >a[i*2], p->a[i*
29e0: 32 2b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  2+1]);.    }.   
29f0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
2a00: 65 6e 64 66 28 78 2c 20 22 5b 25 21 67 2c 25 21  endf(x, "[%!g,%!
2a10: 67 5d 5d 22 2c 20 70 2d 3e 61 5b 30 5d 2c 20 70  g]]", p->a[0], p
2a20: 2d 3e 61 5b 31 5d 29 3b 0a 20 20 20 20 73 71 6c  ->a[1]);.    sql
2a30: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
2a40: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
2a50: 33 5f 73 74 72 5f 66 69 6e 69 73 68 28 78 29 2c  3_str_finish(x),
2a60: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
2a70: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
2a80: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
2a90: 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  /*.** SQL functi
2aa0: 6f 6e 3a 20 20 20 20 20 67 65 6f 70 6f 6c 79 5f  on:     geopoly_
2ab0: 73 76 67 28 58 2c 20 2e 2e 2e 2e 29 0a 2a 2a 0a  svg(X, ....).**.
2ac0: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 58 20 61  ** Interpret X a
2ad0: 73 20 61 20 70 6f 6c 79 67 6f 6e 20 61 6e 64 20  s a polygon and 
2ae0: 72 65 6e 64 65 72 20 69 74 20 61 73 20 61 20 53  render it as a S
2af0: 56 47 20 3c 70 6f 6c 79 6c 69 6e 65 3e 2e 0a 2a  VG <polyline>..*
2b00: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 61 72 67  * Additional arg
2b10: 75 6d 65 6e 74 73 20 61 72 65 20 61 64 64 65 64  uments are added
2b20: 20 61 73 20 61 74 74 72 69 62 75 74 65 73 20 74   as attributes t
2b30: 6f 20 74 68 65 20 3c 70 6f 6c 79 6c 69 6e 65 3e  o the <polyline>
2b40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2b50: 20 67 65 6f 70 6f 6c 79 53 76 67 46 75 6e 63 28   geopolySvgFunc(
2b60: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2b70: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
2b80: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
2b90: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
2ba0: 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20  ){.  GeoPoly *p 
2bb0: 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72  = geopolyFuncPar
2bc0: 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  am(context, argv
2bd0: 5b 30 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  [0], 0);.  if( p
2be0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
2bf0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
2c00: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
2c10: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 73 71  context);.    sq
2c20: 6c 69 74 65 33 5f 73 74 72 20 2a 78 20 3d 20 73  lite3_str *x = s
2c30: 71 6c 69 74 65 33 5f 73 74 72 5f 6e 65 77 28 64  qlite3_str_new(d
2c40: 62 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  b);.    int i;. 
2c50: 20 20 20 63 68 61 72 20 63 53 65 70 20 3d 20 27     char cSep = '
2c60: 5c 27 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  \'';.    sqlite3
2c70: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 78 2c 20  _str_appendf(x, 
2c80: 22 3c 70 6f 6c 79 6c 69 6e 65 20 70 6f 69 6e 74  "<polyline point
2c90: 73 3d 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  s=");.    for(i=
2ca0: 30 3b 20 69 3c 70 2d 3e 6e 56 65 72 74 65 78 3b  0; i<p->nVertex;
2cb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
2cc0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
2cd0: 28 78 2c 20 22 25 63 25 67 2c 25 67 22 2c 20 63  (x, "%c%g,%g", c
2ce0: 53 65 70 2c 20 70 2d 3e 61 5b 69 2a 32 5d 2c 20  Sep, p->a[i*2], 
2cf0: 70 2d 3e 61 5b 69 2a 32 2b 31 5d 29 3b 0a 20 20  p->a[i*2+1]);.  
2d00: 20 20 20 20 63 53 65 70 20 3d 20 27 20 27 3b 0a      cSep = ' ';.
2d10: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2d20: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 78 2c  3_str_appendf(x,
2d30: 20 22 20 25 67 2c 25 67 27 22 2c 20 70 2d 3e 61   " %g,%g'", p->a
2d40: 5b 30 5d 2c 20 70 2d 3e 61 5b 31 5d 29 3b 0a 20  [0], p->a[1]);. 
2d50: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72     for(i=1; i<ar
2d60: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gc; i++){.      
2d70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
2d80: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
2d90: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
2da0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
2db0: 69 66 28 20 7a 20 26 26 20 7a 5b 30 5d 20 29 7b  if( z && z[0] ){
2dc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2dd0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 78 2c 20  _str_appendf(x, 
2de0: 22 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  " %s", z);.     
2df0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
2e00: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
2e10: 28 78 2c 20 22 3e 3c 2f 70 6f 6c 79 6c 69 6e 65  (x, "></polyline
2e20: 3e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >");.    sqlite3
2e30: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
2e40: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 73 74  text, sqlite3_st
2e50: 72 5f 66 69 6e 69 73 68 28 78 29 2c 20 2d 31 2c  r_finish(x), -1,
2e60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
2e70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e80: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
2e90: 2a 20 53 51 4c 20 46 75 6e 63 74 69 6f 6e 3a 20  * SQL Function: 
2ea0: 20 20 20 20 20 67 65 6f 70 6f 6c 79 5f 78 66 6f       geopoly_xfo
2eb0: 72 6d 28 70 6f 6c 79 2c 20 41 2c 20 42 2c 20 43  rm(poly, A, B, C
2ec0: 2c 20 44 2c 20 45 2c 20 46 29 0a 2a 2a 0a 2a 2a  , D, E, F).**.**
2ed0: 20 54 72 61 6e 73 66 6f 72 6d 20 61 6e 64 2f 6f   Transform and/o
2ee0: 72 20 74 72 61 6e 73 6c 61 74 65 20 61 20 70 6f  r translate a po
2ef0: 6c 79 67 6f 6e 20 61 73 20 66 6f 6c 6c 6f 77 73  lygon as follows
2f00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 31 20  :.**.**      x1 
2f10: 3d 20 41 2a 78 30 20 2b 20 42 2a 79 30 20 2b 20  = A*x0 + B*y0 + 
2f20: 45 0a 2a 2a 20 20 20 20 20 20 79 31 20 3d 20 43  E.**      y1 = C
2f30: 2a 78 30 20 2b 20 44 2a 79 30 20 2b 20 46 0a 2a  *x0 + D*y0 + F.*
2f40: 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 72 61 6e 73  *.** For a trans
2f50: 6c 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  lation:.**.**   
2f60: 20 20 20 67 65 6f 70 6f 6c 79 5f 78 66 6f 72 6d     geopoly_xform
2f70: 28 70 6f 6c 79 2c 20 31 2c 20 30 2c 20 30 2c 20  (poly, 1, 0, 0, 
2f80: 31 2c 20 78 2d 6f 66 66 73 65 74 2c 20 79 2d 6f  1, x-offset, y-o
2f90: 66 66 73 65 74 29 0a 2a 2a 0a 2a 2a 20 52 6f 74  ffset).**.** Rot
2fa0: 61 74 65 20 62 79 20 52 20 61 72 6f 75 6e 64 20  ate by R around 
2fb0: 74 68 65 20 70 6f 69 6e 74 20 28 30 2c 30 29 3a  the point (0,0):
2fc0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 67 65 6f 70  .**.**      geop
2fd0: 6f 6c 79 5f 78 66 6f 72 6d 28 70 6f 6c 79 2c 20  oly_xform(poly, 
2fe0: 63 6f 73 28 52 29 2c 20 73 69 6e 28 52 29 2c 20  cos(R), sin(R), 
2ff0: 2d 73 69 6e 28 52 29 2c 20 63 6f 73 28 52 29 2c  -sin(R), cos(R),
3000: 20 30 2c 20 30 29 0a 2a 2f 0a 73 74 61 74 69 63   0, 0).*/.static
3010: 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 58 66 6f   void geopolyXfo
3020: 72 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  rmFunc(.  sqlite
3030: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
3040: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
3050: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3060: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50  **argv.){.  GeoP
3070: 6f 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79  oly *p = geopoly
3080: 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78  FuncParam(contex
3090: 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a  t, argv[0], 0);.
30a0: 20 20 64 6f 75 62 6c 65 20 41 20 3d 20 73 71 6c    double A = sql
30b0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
30c0: 65 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 64 6f  e(argv[1]);.  do
30d0: 75 62 6c 65 20 42 20 3d 20 73 71 6c 69 74 65 33  uble B = sqlite3
30e0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
30f0: 67 76 5b 32 5d 29 3b 0a 20 20 64 6f 75 62 6c 65  gv[2]);.  double
3100: 20 43 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   C = sqlite3_val
3110: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 33  ue_double(argv[3
3120: 5d 29 3b 0a 20 20 64 6f 75 62 6c 65 20 44 20 3d  ]);.  double D =
3130: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
3140: 6f 75 62 6c 65 28 61 72 67 76 5b 34 5d 29 3b 0a  ouble(argv[4]);.
3150: 20 20 64 6f 75 62 6c 65 20 45 20 3d 20 73 71 6c    double E = sql
3160: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
3170: 65 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20 64 6f  e(argv[5]);.  do
3180: 75 62 6c 65 20 46 20 3d 20 73 71 6c 69 74 65 33  uble F = sqlite3
3190: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
31a0: 67 76 5b 36 5d 29 3b 0a 20 20 47 65 6f 43 6f 6f  gv[6]);.  GeoCoo
31b0: 72 64 20 78 31 2c 20 79 31 2c 20 78 30 2c 20 79  rd x1, y1, x0, y
31c0: 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  0;.  int ii;.  i
31d0: 66 28 20 70 20 29 7b 0a 20 20 20 20 66 6f 72 28  f( p ){.    for(
31e0: 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 6e 56 65 72  ii=0; ii<p->nVer
31f0: 74 65 78 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  tex; ii++){.    
3200: 20 20 78 30 20 3d 20 70 2d 3e 61 5b 69 69 2a 32    x0 = p->a[ii*2
3210: 5d 3b 0a 20 20 20 20 20 20 79 30 20 3d 20 70 2d  ];.      y0 = p-
3220: 3e 61 5b 69 69 2a 32 2b 31 5d 3b 0a 20 20 20 20  >a[ii*2+1];.    
3230: 20 20 78 31 20 3d 20 41 2a 78 30 20 2b 20 42 2a    x1 = A*x0 + B*
3240: 79 30 20 2b 20 45 3b 0a 20 20 20 20 20 20 79 31  y0 + E;.      y1
3250: 20 3d 20 43 2a 78 30 20 2b 20 44 2a 79 30 20 2b   = C*x0 + D*y0 +
3260: 20 46 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69   F;.      p->a[i
3270: 69 2a 32 5d 20 3d 20 78 31 3b 0a 20 20 20 20 20  i*2] = x1;.     
3280: 20 70 2d 3e 61 5b 69 69 2a 32 2b 31 5d 20 3d 20   p->a[ii*2+1] = 
3290: 79 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  y1;.    }.    sq
32a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
32b0: 62 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 68 64  b(context, p->hd
32c0: 72 2c 20 0a 20 20 20 20 20 20 20 34 2b 38 2a 70  r, .       4+8*p
32d0: 2d 3e 6e 56 65 72 74 65 78 2c 20 53 51 4c 49 54  ->nVertex, SQLIT
32e0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
32f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3300: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3310: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
3320: 66 20 74 68 65 20 67 65 6f 70 6f 6c 79 5f 61 72  f the geopoly_ar
3330: 65 61 28 58 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ea(X) function..
3340: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  **.** If the inp
3350: 75 74 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72  ut is a well-for
3360: 6d 65 64 20 47 65 6f 70 6f 6c 79 20 42 4c 4f 42  med Geopoly BLOB
3370: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
3380: 20 61 72 65 61 0a 2a 2a 20 65 6e 63 6c 6f 73 65   area.** enclose
3390: 64 20 62 79 20 74 68 65 20 70 6f 6c 79 67 6f 6e  d by the polygon
33a0: 2e 20 20 49 66 20 74 68 65 20 70 6f 6c 79 67 6f  .  If the polygo
33b0: 6e 20 63 69 72 63 75 6c 61 74 65 73 20 63 6c 6f  n circulates clo
33c0: 63 6b 77 69 73 65 20 69 6e 73 74 65 61 64 0a 2a  ckwise instead.*
33d0: 2a 20 6f 66 20 63 6f 75 6e 74 65 72 63 6c 6f 63  * of countercloc
33e0: 6b 77 69 73 65 20 28 61 73 20 69 74 20 73 68 6f  kwise (as it sho
33f0: 75 6c 64 29 20 74 68 65 6e 20 72 65 74 75 72 6e  uld) then return
3400: 20 74 68 65 20 6e 65 67 61 74 69 76 65 20 6f 66   the negative of
3410: 20 74 68 65 0a 2a 2a 20 65 6e 63 6c 6f 73 65 64   the.** enclosed
3420: 20 61 72 65 61 2e 20 20 4f 74 68 65 72 77 69 73   area.  Otherwis
3430: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  e return NULL..*
3440: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
3450: 6f 70 6f 6c 79 41 72 65 61 46 75 6e 63 28 0a 20  opolyAreaFunc(. 
3460: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3470: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
3480: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
3490: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
34a0: 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20 3d 20  .  GeoPoly *p = 
34b0: 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d  geopolyFuncParam
34c0: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30  (context, argv[0
34d0: 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29  ], 0);.  if( p )
34e0: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 41 72  {.    double rAr
34f0: 65 61 20 3d 20 30 2e 30 3b 0a 20 20 20 20 69 6e  ea = 0.0;.    in
3500: 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
3510: 3d 30 3b 20 69 69 3c 70 2d 3e 6e 56 65 72 74 65  =0; ii<p->nVerte
3520: 78 2d 31 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  x-1; ii++){.    
3530: 20 20 72 41 72 65 61 20 2b 3d 20 28 70 2d 3e 61    rArea += (p->a
3540: 5b 69 69 2a 32 5d 20 2d 20 70 2d 3e 61 5b 69 69  [ii*2] - p->a[ii
3550: 2a 32 2b 32 5d 29 20 20 20 20 20 20 20 20 20 20  *2+2])          
3560: 20 2f 2a 20 28 78 30 20 2d 20 78 31 29 20 2a 2f   /* (x0 - x1) */
3570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3580: 20 2a 20 28 70 2d 3e 61 5b 69 69 2a 32 2b 31 5d   * (p->a[ii*2+1]
3590: 20 2b 20 70 2d 3e 61 5b 69 69 2a 32 2b 33 5d 29   + p->a[ii*2+3])
35a0: 20 20 20 20 20 20 2f 2a 20 28 79 30 20 2b 20 79        /* (y0 + y
35b0: 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  1) */.          
35c0: 20 20 20 20 20 20 2a 20 30 2e 35 3b 0a 20 20 20        * 0.5;.   
35d0: 20 7d 0a 20 20 20 20 72 41 72 65 61 20 2b 3d 20   }.    rArea += 
35e0: 28 70 2d 3e 61 5b 69 69 2a 32 5d 20 2d 20 70 2d  (p->a[ii*2] - p-
35f0: 3e 61 5b 30 5d 29 20 20 20 20 20 20 20 20 20 20  >a[0])          
3600: 20 20 20 20 20 20 20 20 2f 2a 20 28 78 4e 20 2d          /* (xN -
3610: 20 78 30 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   x0) */.        
3620: 20 20 20 20 20 2a 20 28 70 2d 3e 61 5b 69 69 2a       * (p->a[ii*
3630: 32 2b 31 5d 20 2b 20 70 2d 3e 61 5b 31 5d 29 20  2+1] + p->a[1]) 
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3650: 28 79 4e 20 2b 20 79 30 29 20 2a 2f 0a 20 20 20  (yN + y0) */.   
3660: 20 20 20 20 20 20 20 20 20 20 2a 20 30 2e 35 3b            * 0.5;
3670: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
3680: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
3690: 78 74 2c 20 72 41 72 65 61 29 3b 0a 20 20 20 20  xt, rArea);.    
36a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
36b0: 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  .  }            
36c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 50 6f  .}../*.** If pPo
36d0: 6c 79 20 69 73 20 61 20 70 6f 6c 79 67 6f 6e 2c  ly is a polygon,
36e0: 20 63 6f 6d 70 75 74 65 20 69 74 73 20 62 6f 75   compute its bou
36f0: 6e 64 69 6e 67 20 62 6f 78 2e 20 54 68 65 6e 3a  nding box. Then:
3700: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 69 66  .**.**    (1) if
3710: 20 61 43 6f 6f 72 64 21 3d 30 20 73 74 6f 72 65   aCoord!=0 store
3720: 20 74 68 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f   the bounding bo
3730: 78 20 69 6e 20 61 43 6f 6f 72 64 2c 20 72 65 74  x in aCoord, ret
3740: 75 72 6e 69 6e 67 20 4e 55 4c 4c 0a 2a 2a 20 20  urning NULL.**  
3750: 20 20 28 32 29 20 6f 74 68 65 72 77 69 73 65 2c    (2) otherwise,
3760: 20 63 6f 6d 70 75 74 65 20 61 20 47 65 6f 50 6f   compute a GeoPo
3770: 6c 79 20 66 6f 72 20 74 68 65 20 62 6f 75 6e 64  ly for the bound
3780: 69 6e 67 20 62 6f 78 20 61 6e 64 20 72 65 74 75  ing box and retu
3790: 72 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  rn the.**       
37a0: 20 6e 65 77 20 47 65 6f 50 6f 6c 79 0a 2a 2a 0a   new GeoPoly.**.
37b0: 2a 2a 20 49 66 20 70 50 6f 6c 79 20 69 73 20 4e  ** If pPoly is N
37c0: 55 4c 4c 20 62 75 74 20 61 43 6f 6f 72 64 20 69  ULL but aCoord i
37d0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
37e0: 20 63 6f 6d 70 75 74 65 20 61 20 6e 65 77 20 47   compute a new G
37f0: 65 6f 50 6f 6c 79 20 66 72 6f 6d 0a 2a 2a 20 74  eoPoly from.** t
3800: 68 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 20  he bounding box 
3810: 69 6e 20 61 43 6f 6f 72 64 20 61 6e 64 20 72 65  in aCoord and re
3820: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
3830: 6f 20 74 68 61 74 20 47 65 6f 50 6f 6c 79 2e 0a  o that GeoPoly..
3840: 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f 50 6f 6c  */.static GeoPol
3850: 79 20 2a 67 65 6f 70 6f 6c 79 42 42 6f 78 28 0a  y *geopolyBBox(.
3860: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
3870: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 20 20 2f 2a  t *context,   /*
3880: 20 46 6f 72 20 72 65 63 6f 72 64 69 6e 67 20 74   For recording t
3890: 68 65 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71  he error */.  sq
38a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 50 6f  lite3_value *pPo
38b0: 6c 79 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ly,       /* The
38c0: 20 70 6f 6c 79 67 6f 6e 20 2a 2f 0a 20 20 52 74   polygon */.  Rt
38d0: 72 65 65 43 6f 6f 72 64 20 2a 61 43 6f 6f 72 64  reeCoord *aCoord
38e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ,         /* Res
38f0: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ults here */.  i
3900: 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20  nt *pRc         
3910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
3920: 72 6f 72 20 63 6f 64 65 20 68 65 72 65 20 2a 2f  ror code here */
3930: 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70  .){.  GeoPoly *p
3940: 4f 75 74 20 3d 20 30 3b 0a 20 20 47 65 6f 50 6f  Out = 0;.  GeoPo
3950: 6c 79 20 2a 70 3b 0a 20 20 66 6c 6f 61 74 20 6d  ly *p;.  float m
3960: 6e 58 2c 20 6d 78 58 2c 20 6d 6e 59 2c 20 6d 78  nX, mxX, mnY, mx
3970: 59 3b 0a 20 20 69 66 28 20 70 50 6f 6c 79 3d 3d  Y;.  if( pPoly==
3980: 30 20 26 26 20 61 43 6f 6f 72 64 21 3d 30 20 29  0 && aCoord!=0 )
3990: 7b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20  {.    p = 0;.   
39a0: 20 6d 6e 58 20 3d 20 61 43 6f 6f 72 64 5b 30 5d   mnX = aCoord[0]
39b0: 2e 66 3b 0a 20 20 20 20 6d 78 58 20 3d 20 61 43  .f;.    mxX = aC
39c0: 6f 6f 72 64 5b 31 5d 2e 66 3b 0a 20 20 20 20 6d  oord[1].f;.    m
39d0: 6e 59 20 3d 20 61 43 6f 6f 72 64 5b 32 5d 2e 66  nY = aCoord[2].f
39e0: 3b 0a 20 20 20 20 6d 78 59 20 3d 20 61 43 6f 6f  ;.    mxY = aCoo
39f0: 72 64 5b 33 5d 2e 66 3b 0a 20 20 20 20 67 6f 74  rd[3].f;.    got
3a00: 6f 20 67 65 6f 70 6f 6c 79 42 62 6f 78 46 69 6c  o geopolyBboxFil
3a10: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
3a20: 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50  p = geopolyFuncP
3a30: 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 70 50  aram(context, pP
3a40: 6f 6c 79 2c 20 70 52 63 29 3b 0a 20 20 7d 0a 20  oly, pRc);.  }. 
3a50: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
3a60: 74 20 69 69 3b 0a 20 20 20 20 6d 6e 58 20 3d 20  t ii;.    mnX = 
3a70: 6d 78 58 20 3d 20 70 2d 3e 61 5b 30 5d 3b 0a 20  mxX = p->a[0];. 
3a80: 20 20 20 6d 6e 59 20 3d 20 6d 78 59 20 3d 20 70     mnY = mxY = p
3a90: 2d 3e 61 5b 31 5d 3b 0a 20 20 20 20 66 6f 72 28  ->a[1];.    for(
3aa0: 69 69 3d 31 3b 20 69 69 3c 70 2d 3e 6e 56 65 72  ii=1; ii<p->nVer
3ab0: 74 65 78 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  tex; ii++){.    
3ac0: 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 70 2d 3e    double r = p->
3ad0: 61 5b 69 69 2a 32 5d 3b 0a 20 20 20 20 20 20 69  a[ii*2];.      i
3ae0: 66 28 20 72 3c 6d 6e 58 20 29 20 6d 6e 58 20 3d  f( r<mnX ) mnX =
3af0: 20 72 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 69   r;.      else i
3b00: 66 28 20 72 3e 6d 78 58 20 29 20 6d 78 58 20 3d  f( r>mxX ) mxX =
3b10: 20 72 3b 0a 20 20 20 20 20 20 72 20 3d 20 70 2d   r;.      r = p-
3b20: 3e 61 5b 69 69 2a 32 2b 31 5d 3b 0a 20 20 20 20  >a[ii*2+1];.    
3b30: 20 20 69 66 28 20 72 3c 6d 6e 59 20 29 20 6d 6e    if( r<mnY ) mn
3b40: 59 20 3d 20 72 3b 0a 20 20 20 20 20 20 65 6c 73  Y = r;.      els
3b50: 65 20 69 66 28 20 72 3e 6d 78 59 20 29 20 6d 78  e if( r>mxY ) mx
3b60: 59 20 3d 20 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Y = r;.    }.   
3b70: 20 69 66 28 20 70 52 63 20 29 20 2a 70 52 63 20   if( pRc ) *pRc 
3b80: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
3b90: 20 69 66 28 20 61 43 6f 6f 72 64 3d 3d 30 20 29   if( aCoord==0 )
3ba0: 7b 0a 20 20 20 20 20 20 67 65 6f 70 6f 6c 79 42  {.      geopolyB
3bb0: 62 6f 78 46 69 6c 6c 3a 0a 20 20 20 20 20 20 70  boxFill:.      p
3bc0: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  Out = sqlite3_re
3bd0: 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
3be0: 47 65 6f 50 6f 6c 79 29 2b 73 69 7a 65 6f 66 28  GeoPoly)+sizeof(
3bf0: 47 65 6f 43 6f 6f 72 64 29 2a 36 29 3b 0a 20 20  GeoCoord)*6);.  
3c00: 20 20 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20      if( pOut==0 
3c10: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3c20: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
3c30: 20 20 20 20 69 66 28 20 63 6f 6e 74 65 78 74 20      if( context 
3c40: 29 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ) sqlite3_result
3c50: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
3c60: 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 69  text);.        i
3c70: 66 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20  f( pRc ) *pRc = 
3c80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
3c90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
3ca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
3cb0: 75 74 2d 3e 6e 56 65 72 74 65 78 20 3d 20 34 3b  ut->nVertex = 4;
3cc0: 0a 20 20 20 20 20 20 69 69 20 3d 20 31 3b 0a 20  .      ii = 1;. 
3cd0: 20 20 20 20 20 70 4f 75 74 2d 3e 68 64 72 5b 30       pOut->hdr[0
3ce0: 5d 20 3d 20 2a 28 75 6e 73 69 67 6e 65 64 20 63  ] = *(unsigned c
3cf0: 68 61 72 2a 29 26 69 69 3b 0a 20 20 20 20 20 20  har*)&ii;.      
3d00: 70 4f 75 74 2d 3e 68 64 72 5b 31 5d 20 3d 20 30  pOut->hdr[1] = 0
3d10: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 68 64  ;.      pOut->hd
3d20: 72 5b 32 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[2] = 0;.      
3d30: 70 4f 75 74 2d 3e 68 64 72 5b 33 5d 20 3d 20 34  pOut->hdr[3] = 4
3d40: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61 5b  ;.      pOut->a[
3d50: 30 5d 20 3d 20 6d 6e 58 3b 0a 20 20 20 20 20 20  0] = mnX;.      
3d60: 70 4f 75 74 2d 3e 61 5b 31 5d 20 3d 20 6d 6e 59  pOut->a[1] = mnY
3d70: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61 5b  ;.      pOut->a[
3d80: 32 5d 20 3d 20 6d 78 58 3b 0a 20 20 20 20 20 20  2] = mxX;.      
3d90: 70 4f 75 74 2d 3e 61 5b 33 5d 20 3d 20 6d 6e 59  pOut->a[3] = mnY
3da0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61 5b  ;.      pOut->a[
3db0: 34 5d 20 3d 20 6d 78 58 3b 0a 20 20 20 20 20 20  4] = mxX;.      
3dc0: 70 4f 75 74 2d 3e 61 5b 35 5d 20 3d 20 6d 78 59  pOut->a[5] = mxY
3dd0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61 5b  ;.      pOut->a[
3de0: 36 5d 20 3d 20 6d 6e 58 3b 0a 20 20 20 20 20 20  6] = mnX;.      
3df0: 70 4f 75 74 2d 3e 61 5b 37 5d 20 3d 20 6d 78 59  pOut->a[7] = mxY
3e00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3e10: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3e20: 70 29 3b 0a 20 20 20 20 20 20 61 43 6f 6f 72 64  p);.      aCoord
3e30: 5b 30 5d 2e 66 20 3d 20 6d 6e 58 3b 0a 20 20 20  [0].f = mnX;.   
3e40: 20 20 20 61 43 6f 6f 72 64 5b 31 5d 2e 66 20 3d     aCoord[1].f =
3e50: 20 6d 78 58 3b 0a 20 20 20 20 20 20 61 43 6f 6f   mxX;.      aCoo
3e60: 72 64 5b 32 5d 2e 66 20 3d 20 6d 6e 59 3b 0a 20  rd[2].f = mnY;. 
3e70: 20 20 20 20 20 61 43 6f 6f 72 64 5b 33 5d 2e 66       aCoord[3].f
3e80: 20 3d 20 6d 78 59 3b 0a 20 20 20 20 7d 0a 20 20   = mxY;.    }.  
3e90: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4f 75 74 3b  }.  return pOut;
3ea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
3eb0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
3ec0: 67 65 6f 70 6f 6c 79 5f 62 62 6f 78 28 58 29 20  geopoly_bbox(X) 
3ed0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  SQL function..*/
3ee0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f  .static void geo
3ef0: 70 6f 6c 79 42 42 6f 78 46 75 6e 63 28 0a 20 20  polyBBoxFunc(.  
3f00: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3f10: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
3f20: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
3f30: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
3f40: 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20 3d 20 67    GeoPoly *p = g
3f50: 65 6f 70 6f 6c 79 42 42 6f 78 28 63 6f 6e 74 65  eopolyBBox(conte
3f60: 78 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 2c 20  xt, argv[0], 0, 
3f70: 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  0);.  if( p ){. 
3f80: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3f90: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
3fa0: 70 2d 3e 68 64 72 2c 20 0a 20 20 20 20 20 20 20  p->hdr, .       
3fb0: 34 2b 38 2a 70 2d 3e 6e 56 65 72 74 65 78 2c 20  4+8*p->nVertex, 
3fc0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
3fd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
3fe0: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
3ff0: 2a 0a 2a 2a 20 53 74 61 74 65 20 76 65 63 74 6f  *.** State vecto
4000: 72 20 66 6f 72 20 74 68 65 20 67 65 6f 70 6f 6c  r for the geopol
4010: 79 5f 67 72 6f 75 70 5f 62 62 6f 78 28 29 20 61  y_group_bbox() a
4020: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
4030: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
4040: 72 75 63 74 20 47 65 6f 42 42 6f 78 20 47 65 6f  ruct GeoBBox Geo
4050: 42 42 6f 78 3b 0a 73 74 72 75 63 74 20 47 65 6f  BBox;.struct Geo
4060: 42 42 6f 78 20 7b 0a 20 20 69 6e 74 20 69 73 49  BBox {.  int isI
4070: 6e 69 74 3b 0a 20 20 52 74 72 65 65 43 6f 6f 72  nit;.  RtreeCoor
4080: 64 20 61 5b 34 5d 3b 0a 7d 3b 0a 0a 0a 2f 2a 0a  d a[4];.};.../*.
4090: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
40a0: 6e 20 6f 66 20 74 68 65 20 67 65 6f 70 6f 6c 79  n of the geopoly
40b0: 5f 67 72 6f 75 70 5f 62 62 6f 78 28 58 29 20 61  _group_bbox(X) a
40c0: 67 67 72 65 67 61 74 65 20 53 51 4c 20 66 75 6e  ggregate SQL fun
40d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
40e0: 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 42 42 6f   void geopolyBBo
40f0: 78 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  xStep(.  sqlite3
4100: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
4110: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
4120: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4130: 2a 61 72 67 76 0a 29 7b 0a 20 20 52 74 72 65 65  *argv.){.  Rtree
4140: 43 6f 6f 72 64 20 61 5b 34 5d 3b 0a 20 20 69 6e  Coord a[4];.  in
4150: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
4160: 3b 0a 20 20 28 76 6f 69 64 29 67 65 6f 70 6f 6c  ;.  (void)geopol
4170: 79 42 42 6f 78 28 63 6f 6e 74 65 78 74 2c 20 61  yBBox(context, a
4180: 72 67 76 5b 30 5d 2c 20 61 2c 20 26 72 63 29 3b  rgv[0], a, &rc);
4190: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
41a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 47 65 6f 42  E_OK ){.    GeoB
41b0: 42 6f 78 20 2a 70 42 42 6f 78 3b 0a 20 20 20 20  Box *pBBox;.    
41c0: 70 42 42 6f 78 20 3d 20 28 47 65 6f 42 42 6f 78  pBBox = (GeoBBox
41d0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
41e0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
41f0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42 42  ext, sizeof(*pBB
4200: 6f 78 29 29 3b 0a 20 20 20 20 69 66 28 20 70 42  ox));.    if( pB
4210: 42 6f 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Box==0 ) return;
4220: 0a 20 20 20 20 69 66 28 20 70 42 42 6f 78 2d 3e  .    if( pBBox->
4230: 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
4240: 20 20 20 70 42 42 6f 78 2d 3e 69 73 49 6e 69 74     pBBox->isInit
4250: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = 1;.      memc
4260: 70 79 28 70 42 42 6f 78 2d 3e 61 2c 20 61 2c 20  py(pBBox->a, a, 
4270: 73 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6f 72  sizeof(RtreeCoor
4280: 64 29 2a 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d)*4);.    }else
4290: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d  {.      if( a[0]
42a0: 2e 66 20 3c 20 70 42 42 6f 78 2d 3e 61 5b 30 5d  .f < pBBox->a[0]
42b0: 2e 66 20 29 20 70 42 42 6f 78 2d 3e 61 5b 30 5d  .f ) pBBox->a[0]
42c0: 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 69   = a[0];.      i
42d0: 66 28 20 61 5b 31 5d 2e 66 20 3e 20 70 42 42 6f  f( a[1].f > pBBo
42e0: 78 2d 3e 61 5b 31 5d 2e 66 20 29 20 70 42 42 6f  x->a[1].f ) pBBo
42f0: 78 2d 3e 61 5b 31 5d 20 3d 20 61 5b 31 5d 3b 0a  x->a[1] = a[1];.
4300: 20 20 20 20 20 20 69 66 28 20 61 5b 32 5d 2e 66        if( a[2].f
4310: 20 3c 20 70 42 42 6f 78 2d 3e 61 5b 32 5d 2e 66   < pBBox->a[2].f
4320: 20 29 20 70 42 42 6f 78 2d 3e 61 5b 32 5d 20 3d   ) pBBox->a[2] =
4330: 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66 28   a[2];.      if(
4340: 20 61 5b 33 5d 2e 66 20 3e 20 70 42 42 6f 78 2d   a[3].f > pBBox-
4350: 3e 61 5b 33 5d 2e 66 20 29 20 70 42 42 6f 78 2d  >a[3].f ) pBBox-
4360: 3e 61 5b 33 5d 20 3d 20 61 5b 33 5d 3b 0a 20 20  >a[3] = a[3];.  
4370: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
4380: 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 42 42 6f   void geopolyBBo
4390: 78 46 69 6e 61 6c 28 0a 20 20 73 71 6c 69 74 65  xFinal(.  sqlite
43a0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
43b0: 78 74 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20  xt.){.  GeoPoly 
43c0: 2a 70 3b 0a 20 20 47 65 6f 42 42 6f 78 20 2a 70  *p;.  GeoBBox *p
43d0: 42 42 6f 78 3b 0a 20 20 70 42 42 6f 78 20 3d 20  BBox;.  pBBox = 
43e0: 28 47 65 6f 42 42 6f 78 2a 29 73 71 6c 69 74 65  (GeoBBox*)sqlite
43f0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
4400: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
4410: 0a 20 20 69 66 28 20 70 42 42 6f 78 3d 3d 30 20  .  if( pBBox==0 
4420: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
4430: 67 65 6f 70 6f 6c 79 42 42 6f 78 28 63 6f 6e 74  geopolyBBox(cont
4440: 65 78 74 2c 20 30 2c 20 70 42 42 6f 78 2d 3e 61  ext, 0, pBBox->a
4450: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  , 0);.  if( p ){
4460: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
4470: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
4480: 2c 20 70 2d 3e 68 64 72 2c 20 0a 20 20 20 20 20  , p->hdr, .     
4490: 20 20 34 2b 38 2a 70 2d 3e 6e 56 65 72 74 65 78    4+8*p->nVertex
44a0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
44b0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
44c0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
44d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
44e0: 65 20 69 66 20 70 6f 69 6e 74 20 28 78 30 2c 79  e if point (x0,y
44f0: 30 29 20 69 73 20 62 65 6e 65 61 74 68 20 6c 69  0) is beneath li
4500: 6e 65 20 73 65 67 6d 65 6e 74 20 28 78 31 2c 79  ne segment (x1,y
4510: 31 29 2d 3e 28 78 32 2c 79 32 29 2e 0a 2a 2a 20  1)->(x2,y2)..** 
4520: 52 65 74 75 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  Returns:.**.**  
4530: 20 20 2b 32 20 20 78 30 2c 79 30 20 69 73 20 6f    +2  x0,y0 is o
4540: 6e 20 74 68 65 20 6c 69 6e 65 20 73 65 67 65 6d  n the line segem
4550: 65 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 2b 31 20  ent.**.**    +1 
4560: 20 78 30 2c 79 30 20 69 73 20 62 65 6e 65 61 74   x0,y0 is beneat
4570: 68 20 6c 69 6e 65 20 73 65 67 6d 65 6e 74 0a 2a  h line segment.*
4580: 2a 0a 2a 2a 20 20 20 20 30 20 20 20 78 30 2c 79  *.**    0   x0,y
4590: 30 20 69 73 20 6e 6f 74 20 6f 6e 20 6f 72 20 62  0 is not on or b
45a0: 65 6e 65 61 74 68 20 74 68 65 20 6c 69 6e 65 20  eneath the line 
45b0: 73 65 67 6d 65 6e 74 20 6f 72 20 74 68 65 20 6c  segment or the l
45c0: 69 6e 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 20  ine segment.**  
45d0: 20 20 20 20 20 20 69 73 20 76 65 72 74 69 63 61        is vertica
45e0: 6c 20 61 6e 64 20 78 30 2c 79 30 20 69 73 20 6e  l and x0,y0 is n
45f0: 6f 74 20 6f 6e 20 74 68 65 20 6c 69 6e 65 20 73  ot on the line s
4600: 65 67 6d 65 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65  egment.**.** The
4610: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6f 72 64   left-most coord
4620: 69 6e 61 74 65 20 6d 69 6e 28 78 31 2c 78 32 29  inate min(x1,x2)
4630: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
4640: 65 64 20 74 6f 20 62 65 20 70 61 72 74 20 6f 66  ed to be part of
4650: 0a 2a 2a 20 74 68 65 20 6c 69 6e 65 20 73 65 67  .** the line seg
4660: 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72  ment for the pur
4670: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 61 6e  poses of this an
4680: 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  alysis..*/.stati
4690: 63 20 69 6e 74 20 70 6f 69 6e 74 42 65 6e 65 61  c int pointBenea
46a0: 74 68 4c 69 6e 65 28 0a 20 20 64 6f 75 62 6c 65  thLine(.  double
46b0: 20 78 30 2c 20 64 6f 75 62 6c 65 20 79 30 2c 0a   x0, double y0,.
46c0: 20 20 64 6f 75 62 6c 65 20 78 31 2c 20 64 6f 75    double x1, dou
46d0: 62 6c 65 20 79 31 2c 0a 20 20 64 6f 75 62 6c 65  ble y1,.  double
46e0: 20 78 32 2c 20 64 6f 75 62 6c 65 20 79 32 0a 29   x2, double y2.)
46f0: 7b 0a 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20  {.  double y;.  
4700: 69 66 28 20 78 30 3d 3d 78 31 20 26 26 20 79 30  if( x0==x1 && y0
4710: 3d 3d 79 31 20 29 20 72 65 74 75 72 6e 20 32 3b  ==y1 ) return 2;
4720: 0a 20 20 69 66 28 20 78 31 3c 78 32 20 29 7b 0a  .  if( x1<x2 ){.
4730: 20 20 20 20 69 66 28 20 78 30 3c 3d 78 31 20 7c      if( x0<=x1 |
4740: 7c 20 78 30 3e 78 32 20 29 20 72 65 74 75 72 6e  | x0>x2 ) return
4750: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
4760: 78 31 3e 78 32 20 29 7b 0a 20 20 20 20 69 66 28  x1>x2 ){.    if(
4770: 20 78 30 3c 3d 78 32 20 7c 7c 20 78 30 3e 78 31   x0<=x2 || x0>x1
4780: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
4790: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 56 65 72  else{.    /* Ver
47a0: 74 69 63 61 6c 20 6c 69 6e 65 20 73 65 67 6d 65  tical line segme
47b0: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 78 30  nt */.    if( x0
47c0: 21 3d 78 31 20 29 20 72 65 74 75 72 6e 20 30 3b  !=x1 ) return 0;
47d0: 0a 20 20 20 20 69 66 28 20 79 30 3c 79 31 20 26  .    if( y0<y1 &
47e0: 26 20 79 30 3c 79 32 20 29 20 72 65 74 75 72 6e  & y0<y2 ) return
47f0: 20 30 3b 0a 20 20 20 20 69 66 28 20 79 30 3e 79   0;.    if( y0>y
4800: 31 20 26 26 20 79 30 3e 79 32 20 29 20 72 65 74  1 && y0>y2 ) ret
4810: 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72  urn 0;.    retur
4820: 6e 20 32 3b 0a 20 20 7d 0a 20 20 79 20 3d 20 79  n 2;.  }.  y = y
4830: 31 20 2b 20 28 79 32 2d 79 31 29 2a 28 78 30 2d  1 + (y2-y1)*(x0-
4840: 78 31 29 2f 28 78 32 2d 78 31 29 3b 0a 20 20 69  x1)/(x2-x1);.  i
4850: 66 28 20 79 30 3d 3d 79 20 29 20 72 65 74 75 72  f( y0==y ) retur
4860: 6e 20 32 3b 0a 20 20 69 66 28 20 79 30 3c 79 20  n 2;.  if( y0<y 
4870: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
4880: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4890: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
48a0: 20 20 67 65 6f 70 6f 6c 79 5f 63 6f 6e 74 61 69    geopoly_contai
48b0: 6e 73 5f 70 6f 69 6e 74 28 50 2c 58 2c 59 29 0a  ns_point(P,X,Y).
48c0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2b 32 20  **.** Return +2 
48d0: 69 66 20 70 6f 69 6e 74 20 58 2c 59 20 69 73 20  if point X,Y is 
48e0: 77 69 74 68 69 6e 20 70 6f 6c 79 67 6f 6e 20 50  within polygon P
48f0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 2b 31 20 69  ..** Return +1 i
4900: 66 20 70 6f 69 6e 74 20 58 2c 59 20 69 73 20 6f  f point X,Y is o
4910: 6e 20 74 68 65 20 70 6f 6c 79 67 6f 6e 20 62 6f  n the polygon bo
4920: 75 6e 64 61 72 79 2e 0a 2a 2a 20 52 65 74 75 72  undary..** Retur
4930: 6e 20 30 20 69 66 20 70 6f 69 6e 74 20 58 2c 59  n 0 if point X,Y
4940: 20 69 73 20 6f 75 74 73 69 64 65 20 74 68 65 20   is outside the 
4950: 70 6f 6c 79 67 6f 6e 0a 2a 2f 0a 73 74 61 74 69  polygon.*/.stati
4960: 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 43 6f  c void geopolyCo
4970: 6e 74 61 69 6e 73 50 6f 69 6e 74 46 75 6e 63 28  ntainsPointFunc(
4980: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
4990: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
49a0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
49b0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
49c0: 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 31  ){.  GeoPoly *p1
49d0: 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61   = geopolyFuncPa
49e0: 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  ram(context, arg
49f0: 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 64 6f 75 62  v[0], 0);.  doub
4a00: 6c 65 20 78 30 20 3d 20 73 71 6c 69 74 65 33 5f  le x0 = sqlite3_
4a10: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
4a20: 76 5b 31 5d 29 3b 0a 20 20 64 6f 75 62 6c 65 20  v[1]);.  double 
4a30: 79 30 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  y0 = sqlite3_val
4a40: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 32  ue_double(argv[2
4a50: 5d 29 3b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  ]);.  int v = 0;
4a60: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
4a70: 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 66 28 20    int ii;.  if( 
4a80: 70 31 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  p1==0 ) return;.
4a90: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
4aa0: 31 2d 3e 6e 56 65 72 74 65 78 2d 31 3b 20 69 69  1->nVertex-1; ii
4ab0: 2b 2b 29 7b 0a 20 20 20 20 76 20 3d 20 70 6f 69  ++){.    v = poi
4ac0: 6e 74 42 65 6e 65 61 74 68 4c 69 6e 65 28 78 30  ntBeneathLine(x0
4ad0: 2c 79 30 2c 70 31 2d 3e 61 5b 69 69 2a 32 5d 2c  ,y0,p1->a[ii*2],
4ae0: 70 31 2d 3e 61 5b 69 69 2a 32 2b 31 5d 2c 0a 20  p1->a[ii*2+1],. 
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 31                p1
4b10: 2d 3e 61 5b 69 69 2a 32 2b 32 5d 2c 70 31 2d 3e  ->a[ii*2+2],p1->
4b20: 61 5b 69 69 2a 32 2b 33 5d 29 3b 0a 20 20 20 20  a[ii*2+3]);.    
4b30: 69 66 28 20 76 3d 3d 32 20 29 20 62 72 65 61 6b  if( v==2 ) break
4b40: 3b 0a 20 20 20 20 63 6e 74 20 2b 3d 20 76 3b 0a  ;.    cnt += v;.
4b50: 20 20 7d 0a 20 20 69 66 28 20 76 21 3d 32 20 29    }.  if( v!=2 )
4b60: 7b 0a 20 20 20 20 76 20 3d 20 70 6f 69 6e 74 42  {.    v = pointB
4b70: 65 6e 65 61 74 68 4c 69 6e 65 28 78 30 2c 79 30  eneathLine(x0,y0
4b80: 2c 70 31 2d 3e 61 5b 69 69 2a 32 5d 2c 70 31 2d  ,p1->a[ii*2],p1-
4b90: 3e 61 5b 69 69 2a 32 2b 31 5d 2c 0a 20 20 20 20  >a[ii*2+1],.    
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bb0: 20 20 20 20 20 20 20 20 20 20 20 70 31 2d 3e 61             p1->a
4bc0: 5b 30 5d 2c 70 31 2d 3e 61 5b 31 5d 29 3b 0a 20  [0],p1->a[1]);. 
4bd0: 20 7d 0a 20 20 69 66 28 20 76 3d 3d 32 20 29 7b   }.  if( v==2 ){
4be0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
4bf0: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
4c00: 20 31 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   1);.  }else if(
4c10: 20 28 28 76 2b 63 6e 74 29 26 31 29 3d 3d 30 20   ((v+cnt)&1)==0 
4c20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
4c30: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
4c40: 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t, 0);.  }else{.
4c50: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4c60: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
4c70: 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  2);.  }.  sqlite
4c80: 33 5f 66 72 65 65 28 70 31 29 3b 0a 7d 0a 0a 2f  3_free(p1);.}../
4c90: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
4ca0: 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
4cb0: 69 6e 74 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c  int geopolyOverl
4cc0: 61 70 28 47 65 6f 50 6f 6c 79 20 2a 70 31 2c 20  ap(GeoPoly *p1, 
4cd0: 47 65 6f 50 6f 6c 79 20 2a 70 32 29 3b 0a 0a 2f  GeoPoly *p2);../
4ce0: 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  *.** SQL functio
4cf0: 6e 3a 20 20 20 20 67 65 6f 70 6f 6c 79 5f 77 69  n:    geopoly_wi
4d00: 74 68 69 6e 28 50 31 2c 50 32 29 0a 2a 2a 0a 2a  thin(P1,P2).**.*
4d10: 2a 20 52 65 74 75 72 6e 20 2b 32 20 69 66 20 50  * Return +2 if P
4d20: 31 20 61 6e 64 20 50 32 20 61 72 65 20 74 68 65  1 and P2 are the
4d30: 20 73 61 6d 65 20 70 6f 6c 79 67 6f 6e 0a 2a 2a   same polygon.**
4d40: 20 52 65 74 75 72 6e 20 2b 31 20 69 66 20 50 32   Return +1 if P2
4d50: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69   is contained wi
4d60: 74 68 69 6e 20 50 31 0a 2a 2a 20 52 65 74 75 72  thin P1.** Retur
4d70: 6e 20 30 20 69 66 20 61 6e 79 20 70 61 72 74 20  n 0 if any part 
4d80: 6f 66 20 50 32 20 69 73 20 6f 6e 20 74 68 65 20  of P2 is on the 
4d90: 6f 75 74 73 69 64 65 20 6f 66 20 50 31 0a 2a 2a  outside of P1.**
4da0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4db0: 67 65 6f 70 6f 6c 79 57 69 74 68 69 6e 46 75 6e  geopolyWithinFun
4dc0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
4dd0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
4de0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
4df0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
4e00: 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a  v.){.  GeoPoly *
4e10: 70 31 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63  p1 = geopolyFunc
4e20: 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61  Param(context, a
4e30: 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 47 65  rgv[0], 0);.  Ge
4e40: 6f 50 6f 6c 79 20 2a 70 32 20 3d 20 67 65 6f 70  oPoly *p2 = geop
4e50: 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e  olyFuncParam(con
4e60: 74 65 78 74 2c 20 61 72 67 76 5b 31 5d 2c 20 30  text, argv[1], 0
4e70: 29 3b 0a 20 20 69 66 28 20 70 31 20 26 26 20 70  );.  if( p1 && p
4e80: 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  2 ){.    int x =
4e90: 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c 61 70 28   geopolyOverlap(
4ea0: 70 31 2c 20 70 32 29 3b 0a 20 20 20 20 69 66 28  p1, p2);.    if(
4eb0: 20 78 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71   x<0 ){.      sq
4ec0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
4ed0: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
4ee0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
4ef0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4f00: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
4f10: 78 3d 3d 32 20 3f 20 31 20 3a 20 78 3d 3d 34 20  x==2 ? 1 : x==4 
4f20: 3f 20 32 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a  ? 2 : 0);.    }.
4f30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
4f40: 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p1);.  sqlite
4f50: 33 5f 66 72 65 65 28 70 32 29 3b 0a 7d 0a 0a 2f  3_free(p2);.}../
4f60: 2a 20 4f 62 6a 65 63 74 73 20 75 73 65 64 20 62  * Objects used b
4f70: 79 20 74 68 65 20 6f 76 65 72 6c 61 70 20 61 6c  y the overlap al
4f80: 67 6f 72 69 68 6d 2e 20 2a 2f 0a 74 79 70 65 64  gorihm. */.typed
4f90: 65 66 20 73 74 72 75 63 74 20 47 65 6f 45 76 65  ef struct GeoEve
4fa0: 6e 74 20 47 65 6f 45 76 65 6e 74 3b 0a 74 79 70  nt GeoEvent;.typ
4fb0: 65 64 65 66 20 73 74 72 75 63 74 20 47 65 6f 53  edef struct GeoS
4fc0: 65 67 6d 65 6e 74 20 47 65 6f 53 65 67 6d 65 6e  egment GeoSegmen
4fd0: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
4fe0: 74 20 47 65 6f 4f 76 65 72 6c 61 70 20 47 65 6f  t GeoOverlap Geo
4ff0: 4f 76 65 72 6c 61 70 3b 0a 73 74 72 75 63 74 20  Overlap;.struct 
5000: 47 65 6f 45 76 65 6e 74 20 7b 0a 20 20 64 6f 75  GeoEvent {.  dou
5010: 62 6c 65 20 78 3b 20 20 20 20 20 20 20 20 20 20  ble x;          
5020: 20 20 20 20 2f 2a 20 58 20 63 6f 6f 72 64 69 6e      /* X coordin
5030: 61 74 65 20 61 74 20 77 68 69 63 68 20 65 76 65  ate at which eve
5040: 6e 74 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69  nt occurs */.  i
5050: 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
5060: 20 20 20 20 20 20 2f 2a 20 30 20 66 6f 72 20 41        /* 0 for A
5070: 44 44 2c 20 31 20 66 6f 72 20 52 45 4d 4f 56 45  DD, 1 for REMOVE
5080: 20 2a 2f 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74   */.  GeoSegment
5090: 20 2a 70 53 65 67 3b 20 20 20 20 20 20 2f 2a 20   *pSeg;      /* 
50a0: 54 68 65 20 73 65 67 6d 65 6e 74 20 74 6f 20 62  The segment to b
50b0: 65 20 61 64 64 65 64 20 6f 72 20 72 65 6d 6f 76  e added or remov
50c0: 65 64 20 2a 2f 0a 20 20 47 65 6f 45 76 65 6e 74  ed */.  GeoEvent
50d0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f   *pNext;       /
50e0: 2a 20 4e 65 78 74 20 65 76 65 6e 74 20 69 6e 20  * Next event in 
50f0: 74 68 65 20 73 6f 72 74 65 64 20 6c 69 73 74 20  the sorted list 
5100: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 47 65 6f  */.};.struct Geo
5110: 53 65 67 6d 65 6e 74 20 7b 0a 20 20 64 6f 75 62  Segment {.  doub
5120: 6c 65 20 43 2c 20 42 3b 20 20 20 20 20 20 20 20  le C, B;        
5130: 20 20 20 2f 2a 20 79 20 3d 20 43 2a 78 20 2b 20     /* y = C*x + 
5140: 42 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 79 3b  B */.  double y;
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 43 75 72 72 65 6e 74 20 79 20 76 61 6c 75 65   Current y value
5170: 20 2a 2f 0a 20 20 66 6c 6f 61 74 20 79 30 3b 20   */.  float y0; 
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5190: 49 6e 69 74 69 61 6c 20 79 20 76 61 6c 75 65 20  Initial y value 
51a0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
51b0: 61 72 20 73 69 64 65 3b 20 20 20 20 2f 2a 20 31  ar side;    /* 1
51c0: 20 66 6f 72 20 70 31 2c 20 32 20 66 6f 72 20 70   for p1, 2 for p
51d0: 32 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  2 */.  unsigned 
51e0: 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 2f 2a  int idx;      /*
51f0: 20 57 68 69 63 68 20 73 65 67 6d 65 6e 74 20 77   Which segment w
5200: 69 74 68 69 6e 20 74 68 65 20 73 69 64 65 20 2a  ithin the side *
5210: 2f 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a  /.  GeoSegment *
5220: 70 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65  pNext;     /* Ne
5230: 78 74 20 73 65 67 6d 65 6e 74 20 69 6e 20 61 20  xt segment in a 
5240: 6c 69 73 74 20 73 6f 72 74 65 64 20 62 79 20 79  list sorted by y
5250: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 47 65   */.};.struct Ge
5260: 6f 4f 76 65 72 6c 61 70 20 7b 0a 20 20 47 65 6f  oOverlap {.  Geo
5270: 45 76 65 6e 74 20 2a 61 45 76 65 6e 74 3b 20 20  Event *aEvent;  
5280: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
5290: 20 6f 66 20 61 6c 6c 20 65 76 65 6e 74 73 20 2a   of all events *
52a0: 2f 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a  /.  GeoSegment *
52b0: 61 53 65 67 6d 65 6e 74 3b 20 20 20 20 20 20 2f  aSegment;      /
52c0: 2a 20 41 72 72 61 79 20 6f 66 20 61 6c 6c 20 73  * Array of all s
52d0: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  egments */.  int
52e0: 20 6e 45 76 65 6e 74 3b 20 20 20 20 20 20 20 20   nEvent;        
52f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5300: 72 20 6f 66 20 65 76 65 6e 74 73 20 2a 2f 0a 20  r of events */. 
5310: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b 20 20   int nSegment;  
5320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5330: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
5340: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  s */.};../*.** A
5350: 64 64 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  dd a single segm
5360: 65 6e 74 20 61 6e 64 20 69 74 73 20 61 73 73 6f  ent and its asso
5370: 63 69 61 74 65 64 20 65 76 65 6e 74 73 2e 0a 2a  ciated events..*
5380: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
5390: 6f 70 6f 6c 79 41 64 64 4f 6e 65 53 65 67 6d 65  opolyAddOneSegme
53a0: 6e 74 28 0a 20 20 47 65 6f 4f 76 65 72 6c 61 70  nt(.  GeoOverlap
53b0: 20 2a 70 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20   *p,.  GeoCoord 
53c0: 78 30 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20 79  x0,.  GeoCoord y
53d0: 30 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20 78 31  0,.  GeoCoord x1
53e0: 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20 79 31 2c  ,.  GeoCoord y1,
53f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5400: 20 73 69 64 65 2c 0a 20 20 75 6e 73 69 67 6e 65   side,.  unsigne
5410: 64 20 69 6e 74 20 69 64 78 0a 29 7b 0a 20 20 47  d int idx.){.  G
5420: 65 6f 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  eoSegment *pSeg;
5430: 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a 70 45 76  .  GeoEvent *pEv
5440: 65 6e 74 3b 0a 20 20 69 66 28 20 78 30 3d 3d 78  ent;.  if( x0==x
5450: 31 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  1 ) return;  /* 
5460: 49 67 6e 6f 72 65 20 76 65 72 74 69 63 61 6c 20  Ignore vertical 
5470: 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66  segments */.  if
5480: 28 20 78 30 3e 78 31 20 29 7b 0a 20 20 20 20 47  ( x0>x1 ){.    G
5490: 65 6f 43 6f 6f 72 64 20 74 20 3d 20 78 30 3b 0a  eoCoord t = x0;.
54a0: 20 20 20 20 78 30 20 3d 20 78 31 3b 0a 20 20 20      x0 = x1;.   
54b0: 20 78 31 20 3d 20 74 3b 0a 20 20 20 20 74 20 3d   x1 = t;.    t =
54c0: 20 79 30 3b 0a 20 20 20 20 79 30 20 3d 20 79 31   y0;.    y0 = y1
54d0: 3b 0a 20 20 20 20 79 31 20 3d 20 74 3b 0a 20 20  ;.    y1 = t;.  
54e0: 7d 0a 20 20 70 53 65 67 20 3d 20 70 2d 3e 61 53  }.  pSeg = p->aS
54f0: 65 67 6d 65 6e 74 20 2b 20 70 2d 3e 6e 53 65 67  egment + p->nSeg
5500: 6d 65 6e 74 3b 0a 20 20 70 2d 3e 6e 53 65 67 6d  ment;.  p->nSegm
5510: 65 6e 74 2b 2b 3b 0a 20 20 70 53 65 67 2d 3e 43  ent++;.  pSeg->C
5520: 20 3d 20 28 79 31 2d 79 30 29 2f 28 78 31 2d 78   = (y1-y0)/(x1-x
5530: 30 29 3b 0a 20 20 70 53 65 67 2d 3e 42 20 3d 20  0);.  pSeg->B = 
5540: 79 31 20 2d 20 78 31 2a 70 53 65 67 2d 3e 43 3b  y1 - x1*pSeg->C;
5550: 0a 20 20 70 53 65 67 2d 3e 79 30 20 3d 20 79 30  .  pSeg->y0 = y0
5560: 3b 0a 20 20 70 53 65 67 2d 3e 73 69 64 65 20 3d  ;.  pSeg->side =
5570: 20 73 69 64 65 3b 0a 20 20 70 53 65 67 2d 3e 69   side;.  pSeg->i
5580: 64 78 20 3d 20 69 64 78 3b 0a 20 20 70 45 76 65  dx = idx;.  pEve
5590: 6e 74 20 3d 20 70 2d 3e 61 45 76 65 6e 74 20 2b  nt = p->aEvent +
55a0: 20 70 2d 3e 6e 45 76 65 6e 74 3b 0a 20 20 70 2d   p->nEvent;.  p-
55b0: 3e 6e 45 76 65 6e 74 2b 2b 3b 0a 20 20 70 45 76  >nEvent++;.  pEv
55c0: 65 6e 74 2d 3e 78 20 3d 20 78 30 3b 0a 20 20 70  ent->x = x0;.  p
55d0: 45 76 65 6e 74 2d 3e 65 54 79 70 65 20 3d 20 30  Event->eType = 0
55e0: 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 70 53 65 67  ;.  pEvent->pSeg
55f0: 20 3d 20 70 53 65 67 3b 0a 20 20 70 45 76 65 6e   = pSeg;.  pEven
5600: 74 20 3d 20 70 2d 3e 61 45 76 65 6e 74 20 2b 20  t = p->aEvent + 
5610: 70 2d 3e 6e 45 76 65 6e 74 3b 0a 20 20 70 2d 3e  p->nEvent;.  p->
5620: 6e 45 76 65 6e 74 2b 2b 3b 0a 20 20 70 45 76 65  nEvent++;.  pEve
5630: 6e 74 2d 3e 78 20 3d 20 78 31 3b 0a 20 20 70 45  nt->x = x1;.  pE
5640: 76 65 6e 74 2d 3e 65 54 79 70 65 20 3d 20 31 3b  vent->eType = 1;
5650: 0a 20 20 70 45 76 65 6e 74 2d 3e 70 53 65 67 20  .  pEvent->pSeg 
5660: 3d 20 70 53 65 67 3b 0a 7d 0a 20 20 0a 0a 0a 2f  = pSeg;.}.  .../
5670: 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 6c 6c 20  *.** Insert all 
5680: 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 65 76 65  segments and eve
5690: 6e 74 73 20 66 6f 72 20 70 6f 6c 79 67 6f 6e 20  nts for polygon 
56a0: 70 50 6f 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPoly..*/.static
56b0: 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 41 64 64   void geopolyAdd
56c0: 53 65 67 6d 65 6e 74 73 28 0a 20 20 47 65 6f 4f  Segments(.  GeoO
56d0: 76 65 72 6c 61 70 20 2a 70 2c 20 20 20 20 20 20  verlap *p,      
56e0: 20 20 20 20 2f 2a 20 41 64 64 20 73 65 67 6d 65      /* Add segme
56f0: 6e 74 73 20 74 6f 20 74 68 69 73 20 4f 76 65 72  nts to this Over
5700: 6c 61 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  lap object */.  
5710: 47 65 6f 50 6f 6c 79 20 2a 70 50 6f 6c 79 2c 20  GeoPoly *pPoly, 
5720: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 6b 65 20          /* Take 
5730: 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  all segments fro
5740: 6d 20 74 68 69 73 20 70 6f 6c 79 67 6f 6e 20 2a  m this polygon *
5750: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
5760: 72 20 73 69 64 65 20 20 20 20 20 20 2f 2a 20 54  r side      /* T
5770: 68 65 20 73 69 64 65 20 6f 66 20 70 50 6f 6c 79  he side of pPoly
5780: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
5790: 64 20 69 6e 74 20 69 3b 0a 20 20 47 65 6f 43 6f  d int i;.  GeoCo
57a0: 6f 72 64 20 2a 78 3b 0a 20 20 66 6f 72 28 69 3d  ord *x;.  for(i=
57b0: 30 3b 20 69 3c 28 75 6e 73 69 67 6e 65 64 29 70  0; i<(unsigned)p
57c0: 50 6f 6c 79 2d 3e 6e 56 65 72 74 65 78 2d 31 3b  Poly->nVertex-1;
57d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 78 20 3d 20 70   i++){.    x = p
57e0: 50 6f 6c 79 2d 3e 61 20 2b 20 28 69 2a 32 29 3b  Poly->a + (i*2);
57f0: 0a 20 20 20 20 67 65 6f 70 6f 6c 79 41 64 64 4f  .    geopolyAddO
5800: 6e 65 53 65 67 6d 65 6e 74 28 70 2c 20 78 5b 30  neSegment(p, x[0
5810: 5d 2c 20 78 5b 31 5d 2c 20 78 5b 32 5d 2c 20 78  ], x[1], x[2], x
5820: 5b 33 5d 2c 20 73 69 64 65 2c 20 69 29 3b 0a 20  [3], side, i);. 
5830: 20 7d 0a 20 20 78 20 3d 20 70 50 6f 6c 79 2d 3e   }.  x = pPoly->
5840: 61 20 2b 20 28 69 2a 32 29 3b 0a 20 20 67 65 6f  a + (i*2);.  geo
5850: 70 6f 6c 79 41 64 64 4f 6e 65 53 65 67 6d 65 6e  polyAddOneSegmen
5860: 74 28 70 2c 20 78 5b 30 5d 2c 20 78 5b 31 5d 2c  t(p, x[0], x[1],
5870: 20 70 50 6f 6c 79 2d 3e 61 5b 30 5d 2c 20 70 50   pPoly->a[0], pP
5880: 6f 6c 79 2d 3e 61 5b 31 5d 2c 20 73 69 64 65 2c  oly->a[1], side,
5890: 20 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   i);.}../*.** Me
58a0: 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66  rge two lists of
58b0: 20 73 6f 72 74 65 64 20 65 76 65 6e 74 73 20 62   sorted events b
58c0: 79 20 58 20 63 6f 6f 72 64 69 6e 61 74 65 0a 2a  y X coordinate.*
58d0: 2f 0a 73 74 61 74 69 63 20 47 65 6f 45 76 65 6e  /.static GeoEven
58e0: 74 20 2a 67 65 6f 70 6f 6c 79 45 76 65 6e 74 4d  t *geopolyEventM
58f0: 65 72 67 65 28 47 65 6f 45 76 65 6e 74 20 2a 70  erge(GeoEvent *p
5900: 4c 65 66 74 2c 20 47 65 6f 45 76 65 6e 74 20 2a  Left, GeoEvent *
5910: 70 52 69 67 68 74 29 7b 0a 20 20 47 65 6f 45 76  pRight){.  GeoEv
5920: 65 6e 74 20 68 65 61 64 2c 20 2a 70 4c 61 73 74  ent head, *pLast
5930: 3b 0a 20 20 68 65 61 64 2e 70 4e 65 78 74 20 3d  ;.  head.pNext =
5940: 20 30 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 68   0;.  pLast = &h
5950: 65 61 64 3b 0a 20 20 77 68 69 6c 65 28 20 70 52  ead;.  while( pR
5960: 69 67 68 74 20 26 26 20 70 4c 65 66 74 20 29 7b  ight && pLeft ){
5970: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
5980: 3e 78 20 3c 3d 20 70 4c 65 66 74 2d 3e 78 20 29  >x <= pLeft->x )
5990: 7b 0a 20 20 20 20 20 20 70 4c 61 73 74 2d 3e 70  {.      pLast->p
59a0: 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  Next = pRight;. 
59b0: 20 20 20 20 20 70 4c 61 73 74 20 3d 20 70 52 69       pLast = pRi
59c0: 67 68 74 3b 0a 20 20 20 20 20 20 70 52 69 67 68  ght;.      pRigh
59d0: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4e 65 78  t = pRight->pNex
59e0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
59f0: 20 20 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74      pLast->pNext
5a00: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
5a10: 70 4c 61 73 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLast = pLeft;. 
5a20: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4c 65       pLeft = pLe
5a30: 66 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ft->pNext;.    }
5a40: 0a 20 20 7d 0a 20 20 70 4c 61 73 74 2d 3e 70 4e  .  }.  pLast->pN
5a50: 65 78 74 20 3d 20 70 52 69 67 68 74 20 3f 20 70  ext = pRight ? p
5a60: 52 69 67 68 74 20 3a 20 70 4c 65 66 74 3b 0a 20  Right : pLeft;. 
5a70: 20 72 65 74 75 72 6e 20 68 65 61 64 2e 70 4e 65   return head.pNe
5a80: 78 74 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  xt;  .}../*.** S
5a90: 6f 72 74 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ort an array of 
5aa0: 6e 45 76 65 6e 74 20 65 76 65 6e 74 20 6f 62 6a  nEvent event obj
5ab0: 65 63 74 73 20 69 6e 74 6f 20 61 20 6c 69 73 74  ects into a list
5ac0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f 45  ..*/.static GeoE
5ad0: 76 65 6e 74 20 2a 67 65 6f 70 6f 6c 79 53 6f 72  vent *geopolySor
5ae0: 74 45 76 65 6e 74 73 42 79 58 28 47 65 6f 45 76  tEventsByX(GeoEv
5af0: 65 6e 74 20 2a 61 45 76 65 6e 74 2c 20 69 6e 74  ent *aEvent, int
5b00: 20 6e 45 76 65 6e 74 29 7b 0a 20 20 69 6e 74 20   nEvent){.  int 
5b10: 6d 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  mx = 0;.  int i,
5b20: 20 6a 3b 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a   j;.  GeoEvent *
5b30: 70 3b 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a 61  p;.  GeoEvent *a
5b40: 5b 35 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [50];.  for(i=0;
5b50: 20 69 3c 6e 45 76 65 6e 74 3b 20 69 2b 2b 29 7b   i<nEvent; i++){
5b60: 0a 20 20 20 20 70 20 3d 20 26 61 45 76 65 6e 74  .    p = &aEvent
5b70: 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  [i];.    p->pNex
5b80: 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  t = 0;.    for(j
5b90: 3d 30 3b 20 6a 3c 6d 78 20 26 26 20 61 5b 6a 5d  =0; j<mx && a[j]
5ba0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 20  ; j++){.      p 
5bb0: 3d 20 67 65 6f 70 6f 6c 79 45 76 65 6e 74 4d 65  = geopolyEventMe
5bc0: 72 67 65 28 61 5b 6a 5d 2c 20 70 29 3b 0a 20 20  rge(a[j], p);.  
5bd0: 20 20 20 20 61 5b 6a 5d 20 3d 20 30 3b 0a 20 20      a[j] = 0;.  
5be0: 20 20 7d 0a 20 20 20 20 61 5b 6a 5d 20 3d 20 70    }.    a[j] = p
5bf0: 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 6d 78 20  ;.    if( j>=mx 
5c00: 29 20 6d 78 20 3d 20 6a 2b 31 3b 0a 20 20 7d 0a  ) mx = j+1;.  }.
5c10: 20 20 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    p = 0;.  for(i
5c20: 3d 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a  =0; i<mx; i++){.
5c30: 20 20 20 20 70 20 3d 20 67 65 6f 70 6f 6c 79 45      p = geopolyE
5c40: 76 65 6e 74 4d 65 72 67 65 28 61 5b 69 5d 2c 20  ventMerge(a[i], 
5c50: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
5c60: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72   p;.}../*.** Mer
5c70: 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20  ge two lists of 
5c80: 73 6f 72 74 65 64 20 73 65 67 6d 65 6e 74 73 20  sorted segments 
5c90: 62 79 20 59 2c 20 61 6e 64 20 74 68 65 6e 20 62  by Y, and then b
5ca0: 79 20 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47  y C..*/.static G
5cb0: 65 6f 53 65 67 6d 65 6e 74 20 2a 67 65 6f 70 6f  eoSegment *geopo
5cc0: 6c 79 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 47  lySegmentMerge(G
5cd0: 65 6f 53 65 67 6d 65 6e 74 20 2a 70 4c 65 66 74  eoSegment *pLeft
5ce0: 2c 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70 52  , GeoSegment *pR
5cf0: 69 67 68 74 29 7b 0a 20 20 47 65 6f 53 65 67 6d  ight){.  GeoSegm
5d00: 65 6e 74 20 68 65 61 64 2c 20 2a 70 4c 61 73 74  ent head, *pLast
5d10: 3b 0a 20 20 68 65 61 64 2e 70 4e 65 78 74 20 3d  ;.  head.pNext =
5d20: 20 30 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 68   0;.  pLast = &h
5d30: 65 61 64 3b 0a 20 20 77 68 69 6c 65 28 20 70 52  ead;.  while( pR
5d40: 69 67 68 74 20 26 26 20 70 4c 65 66 74 20 29 7b  ight && pLeft ){
5d50: 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20  .    double r = 
5d60: 70 52 69 67 68 74 2d 3e 79 20 2d 20 70 4c 65 66  pRight->y - pLef
5d70: 74 2d 3e 79 3b 0a 20 20 20 20 69 66 28 20 72 3d  t->y;.    if( r=
5d80: 3d 30 2e 30 20 29 20 72 20 3d 20 70 52 69 67 68  =0.0 ) r = pRigh
5d90: 74 2d 3e 43 20 2d 20 70 4c 65 66 74 2d 3e 43 3b  t->C - pLeft->C;
5da0: 0a 20 20 20 20 69 66 28 20 72 3c 30 2e 30 20 29  .    if( r<0.0 )
5db0: 7b 0a 20 20 20 20 20 20 70 4c 61 73 74 2d 3e 70  {.      pLast->p
5dc0: 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  Next = pRight;. 
5dd0: 20 20 20 20 20 70 4c 61 73 74 20 3d 20 70 52 69       pLast = pRi
5de0: 67 68 74 3b 0a 20 20 20 20 20 20 70 52 69 67 68  ght;.      pRigh
5df0: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4e 65 78  t = pRight->pNex
5e00: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
5e10: 20 20 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74      pLast->pNext
5e20: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
5e30: 70 4c 61 73 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLast = pLeft;. 
5e40: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4c 65       pLeft = pLe
5e50: 66 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ft->pNext;.    }
5e60: 0a 20 20 7d 0a 20 20 70 4c 61 73 74 2d 3e 70 4e  .  }.  pLast->pN
5e70: 65 78 74 20 3d 20 70 52 69 67 68 74 20 3f 20 70  ext = pRight ? p
5e80: 52 69 67 68 74 20 3a 20 70 4c 65 66 74 3b 0a 20  Right : pLeft;. 
5e90: 20 72 65 74 75 72 6e 20 68 65 61 64 2e 70 4e 65   return head.pNe
5ea0: 78 74 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  xt;  .}../*.** S
5eb0: 6f 72 74 20 61 20 6c 69 73 74 20 6f 66 20 47 65  ort a list of Ge
5ec0: 6f 53 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64  oSegments in ord
5ed0: 65 72 20 6f 66 20 69 6e 63 72 65 61 73 69 6e 67  er of increasing
5ee0: 20 59 20 61 6e 64 20 69 6e 20 74 68 65 20 65 76   Y and in the ev
5ef0: 65 6e 74 20 6f 66 0a 2a 2a 20 61 20 74 69 65 2c  ent of.** a tie,
5f00: 20 69 6e 63 72 65 61 73 69 6e 67 20 43 20 28 73   increasing C (s
5f10: 6c 6f 70 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lope)..*/.static
5f20: 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a 67 65 6f   GeoSegment *geo
5f30: 70 6f 6c 79 53 6f 72 74 53 65 67 6d 65 6e 74 73  polySortSegments
5f40: 42 79 59 41 6e 64 43 28 47 65 6f 53 65 67 6d 65  ByYAndC(GeoSegme
5f50: 6e 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  nt *pList){.  in
5f60: 74 20 6d 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t mx = 0;.  int 
5f70: 69 3b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20  i;.  GeoSegment 
5f80: 2a 70 3b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74  *p;.  GeoSegment
5f90: 20 2a 61 5b 35 30 5d 3b 0a 20 20 77 68 69 6c 65   *a[50];.  while
5fa0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 70  ( pList ){.    p
5fb0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c   = pList;.    pL
5fc0: 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 4e 65  ist = pList->pNe
5fd0: 78 74 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  xt;.    p->pNext
5fe0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
5ff0: 30 3b 20 69 3c 6d 78 20 26 26 20 61 5b 69 5d 3b  0; i<mx && a[i];
6000: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 20 3d   i++){.      p =
6010: 20 67 65 6f 70 6f 6c 79 53 65 67 6d 65 6e 74 4d   geopolySegmentM
6020: 65 72 67 65 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  erge(a[i], p);. 
6030: 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20       a[i] = 0;. 
6040: 20 20 20 7d 0a 20 20 20 20 61 5b 69 5d 20 3d 20     }.    a[i] = 
6050: 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6d 78  p;.    if( i>=mx
6060: 20 29 20 6d 78 20 3d 20 69 2b 31 3b 0a 20 20 7d   ) mx = i+1;.  }
6070: 0a 20 20 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  p = 0;.  for(
6080: 69 3d 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b  i=0; i<mx; i++){
6090: 0a 20 20 20 20 70 20 3d 20 67 65 6f 70 6f 6c 79  .    p = geopoly
60a0: 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 61 5b 69  SegmentMerge(a[i
60b0: 5d 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ], p);.  }.  ret
60c0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
60d0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6f 76  Determine the ov
60e0: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 77  erlap between tw
60f0: 6f 20 70 6f 6c 79 67 6f 6e 73 0a 2a 2f 0a 73 74  o polygons.*/.st
6100: 61 74 69 63 20 69 6e 74 20 67 65 6f 70 6f 6c 79  atic int geopoly
6110: 4f 76 65 72 6c 61 70 28 47 65 6f 50 6f 6c 79 20  Overlap(GeoPoly 
6120: 2a 70 31 2c 20 47 65 6f 50 6f 6c 79 20 2a 70 32  *p1, GeoPoly *p2
6130: 29 7b 0a 20 20 69 6e 74 20 6e 56 65 72 74 65 78  ){.  int nVertex
6140: 20 3d 20 70 31 2d 3e 6e 56 65 72 74 65 78 20 2b   = p1->nVertex +
6150: 20 70 32 2d 3e 6e 56 65 72 74 65 78 20 2b 20 32   p2->nVertex + 2
6160: 3b 0a 20 20 47 65 6f 4f 76 65 72 6c 61 70 20 2a  ;.  GeoOverlap *
6170: 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  p;.  int nByte;.
6180: 20 20 47 65 6f 45 76 65 6e 74 20 2a 70 54 68 69    GeoEvent *pThi
6190: 73 45 76 65 6e 74 3b 0a 20 20 64 6f 75 62 6c 65  sEvent;.  double
61a0: 20 72 58 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   rX;.  int rc = 
61b0: 30 3b 0a 20 20 69 6e 74 20 6e 65 65 64 53 6f 72  0;.  int needSor
61c0: 74 20 3d 20 30 3b 0a 20 20 47 65 6f 53 65 67 6d  t = 0;.  GeoSegm
61d0: 65 6e 74 20 2a 70 41 63 74 69 76 65 20 3d 20 30  ent *pActive = 0
61e0: 3b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a  ;.  GeoSegment *
61f0: 70 53 65 67 3b 0a 20 20 75 6e 73 69 67 6e 65 64  pSeg;.  unsigned
6200: 20 63 68 61 72 20 61 4f 76 65 72 6c 61 70 5b 34   char aOverlap[4
6210: 5d 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 69  ];..  nByte = si
6220: 7a 65 6f 66 28 47 65 6f 45 76 65 6e 74 29 2a 6e  zeof(GeoEvent)*n
6230: 56 65 72 74 65 78 2a 32 20 0a 20 20 20 20 20 20  Vertex*2 .      
6240: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 47 65       + sizeof(Ge
6250: 6f 53 65 67 6d 65 6e 74 29 2a 6e 56 65 72 74 65  oSegment)*nVerte
6260: 78 20 0a 20 20 20 20 20 20 20 20 20 20 20 2b 20  x .           + 
6270: 73 69 7a 65 6f 66 28 47 65 6f 4f 76 65 72 6c 61  sizeof(GeoOverla
6280: 70 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  p);.  p = sqlite
6290: 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  3_malloc( nByte 
62a0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
62b0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 70 2d 3e  return -1;.  p->
62c0: 61 45 76 65 6e 74 20 3d 20 28 47 65 6f 45 76 65  aEvent = (GeoEve
62d0: 6e 74 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e  nt*)&p[1];.  p->
62e0: 61 53 65 67 6d 65 6e 74 20 3d 20 28 47 65 6f 53  aSegment = (GeoS
62f0: 65 67 6d 65 6e 74 2a 29 26 70 2d 3e 61 45 76 65  egment*)&p->aEve
6300: 6e 74 5b 6e 56 65 72 74 65 78 2a 32 5d 3b 0a 20  nt[nVertex*2];. 
6310: 20 70 2d 3e 6e 45 76 65 6e 74 20 3d 20 70 2d 3e   p->nEvent = p->
6320: 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  nSegment = 0;.  
6330: 67 65 6f 70 6f 6c 79 41 64 64 53 65 67 6d 65 6e  geopolyAddSegmen
6340: 74 73 28 70 2c 20 70 31 2c 20 31 29 3b 0a 20 20  ts(p, p1, 1);.  
6350: 67 65 6f 70 6f 6c 79 41 64 64 53 65 67 6d 65 6e  geopolyAddSegmen
6360: 74 73 28 70 2c 20 70 32 2c 20 32 29 3b 0a 20 20  ts(p, p2, 2);.  
6370: 70 54 68 69 73 45 76 65 6e 74 20 3d 20 67 65 6f  pThisEvent = geo
6380: 70 6f 6c 79 53 6f 72 74 45 76 65 6e 74 73 42 79  polySortEventsBy
6390: 58 28 70 2d 3e 61 45 76 65 6e 74 2c 20 70 2d 3e  X(p->aEvent, p->
63a0: 6e 45 76 65 6e 74 29 3b 0a 20 20 72 58 20 3d 20  nEvent);.  rX = 
63b0: 70 54 68 69 73 45 76 65 6e 74 2d 3e 78 3d 3d 30  pThisEvent->x==0
63c0: 2e 30 20 3f 20 2d 31 2e 30 20 3a 20 30 2e 30 3b  .0 ? -1.0 : 0.0;
63d0: 0a 20 20 6d 65 6d 73 65 74 28 61 4f 76 65 72 6c  .  memset(aOverl
63e0: 61 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4f  ap, 0, sizeof(aO
63f0: 76 65 72 6c 61 70 29 29 3b 0a 20 20 77 68 69 6c  verlap));.  whil
6400: 65 28 20 70 54 68 69 73 45 76 65 6e 74 20 29 7b  e( pThisEvent ){
6410: 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 45 76  .    if( pThisEv
6420: 65 6e 74 2d 3e 78 21 3d 72 58 20 29 7b 0a 20 20  ent->x!=rX ){.  
6430: 20 20 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a      GeoSegment *
6440: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
6450: 20 69 6e 74 20 69 4d 61 73 6b 20 3d 20 30 3b 0a   int iMask = 0;.
6460: 20 20 20 20 20 20 47 45 4f 44 45 42 55 47 28 28        GEODEBUG((
6470: 22 44 69 73 74 69 6e 63 74 20 58 3a 20 25 67 5c  "Distinct X: %g\
6480: 6e 22 2c 20 70 54 68 69 73 45 76 65 6e 74 2d 3e  n", pThisEvent->
6490: 78 29 29 3b 0a 20 20 20 20 20 20 72 58 20 3d 20  x));.      rX = 
64a0: 70 54 68 69 73 45 76 65 6e 74 2d 3e 78 3b 0a 20  pThisEvent->x;. 
64b0: 20 20 20 20 20 69 66 28 20 6e 65 65 64 53 6f 72       if( needSor
64c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 47 45 4f  t ){.        GEO
64d0: 44 45 42 55 47 28 28 22 53 4f 52 54 5c 6e 22 29  DEBUG(("SORT\n")
64e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 41 63 74 69  );.        pActi
64f0: 76 65 20 3d 20 67 65 6f 70 6f 6c 79 53 6f 72 74  ve = geopolySort
6500: 53 65 67 6d 65 6e 74 73 42 79 59 41 6e 64 43 28  SegmentsByYAndC(
6510: 70 41 63 74 69 76 65 29 3b 0a 20 20 20 20 20 20  pActive);.      
6520: 20 20 6e 65 65 64 53 6f 72 74 20 3d 20 30 3b 0a    needSort = 0;.
6530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
6540: 72 28 70 53 65 67 3d 70 41 63 74 69 76 65 3b 20  r(pSeg=pActive; 
6550: 70 53 65 67 3b 20 70 53 65 67 3d 70 53 65 67 2d  pSeg; pSeg=pSeg-
6560: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
6570: 20 69 66 28 20 70 50 72 65 76 20 29 7b 0a 20 20   if( pPrev ){.  
6580: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
6590: 76 2d 3e 79 21 3d 70 53 65 67 2d 3e 79 20 29 7b  v->y!=pSeg->y ){
65a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 45 4f  .            GEO
65b0: 44 45 42 55 47 28 28 22 4d 41 53 4b 3a 20 25 64  DEBUG(("MASK: %d
65c0: 5c 6e 22 2c 20 69 4d 61 73 6b 29 29 3b 0a 20 20  \n", iMask));.  
65d0: 20 20 20 20 20 20 20 20 20 20 61 4f 76 65 72 6c            aOverl
65e0: 61 70 5b 69 4d 61 73 6b 5d 20 3d 20 31 3b 0a 20  ap[iMask] = 1;. 
65f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6600: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4d 61     }.        iMa
6610: 73 6b 20 5e 3d 20 70 53 65 67 2d 3e 73 69 64 65  sk ^= pSeg->side
6620: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20  ;.        pPrev 
6630: 3d 20 70 53 65 67 3b 0a 20 20 20 20 20 20 7d 0a  = pSeg;.      }.
6640: 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 30 3b        pPrev = 0;
6650: 0a 20 20 20 20 20 20 66 6f 72 28 70 53 65 67 3d  .      for(pSeg=
6660: 70 41 63 74 69 76 65 3b 20 70 53 65 67 3b 20 70  pActive; pSeg; p
6670: 53 65 67 3d 70 53 65 67 2d 3e 70 4e 65 78 74 29  Seg=pSeg->pNext)
6680: 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65  {.        double
6690: 20 79 20 3d 20 70 53 65 67 2d 3e 43 2a 72 58 20   y = pSeg->C*rX 
66a0: 2b 20 70 53 65 67 2d 3e 42 3b 0a 20 20 20 20 20  + pSeg->B;.     
66b0: 20 20 20 47 45 4f 44 45 42 55 47 28 28 22 53 65     GEODEBUG(("Se
66c0: 67 6d 65 6e 74 20 25 64 2e 25 64 20 25 67 2d 3e  gment %d.%d %g->
66d0: 25 67 5c 6e 22 2c 20 70 53 65 67 2d 3e 73 69 64  %g\n", pSeg->sid
66e0: 65 2c 20 70 53 65 67 2d 3e 69 64 78 2c 20 70 53  e, pSeg->idx, pS
66f0: 65 67 2d 3e 79 2c 20 79 29 29 3b 0a 20 20 20 20  eg->y, y));.    
6700: 20 20 20 20 70 53 65 67 2d 3e 79 20 3d 20 79 3b      pSeg->y = y;
6710: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
6720: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
6730: 69 66 28 20 70 50 72 65 76 2d 3e 79 3e 70 53 65  if( pPrev->y>pSe
6740: 67 2d 3e 79 20 26 26 20 70 50 72 65 76 2d 3e 73  g->y && pPrev->s
6750: 69 64 65 21 3d 70 53 65 67 2d 3e 73 69 64 65 20  ide!=pSeg->side 
6760: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
6770: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
6780: 20 20 20 47 45 4f 44 45 42 55 47 28 28 22 43 72     GEODEBUG(("Cr
6790: 6f 73 73 69 6e 67 3a 20 25 64 2e 25 64 20 61 6e  ossing: %d.%d an
67a0: 64 20 25 64 2e 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d.%d\n",.    
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67c0: 70 50 72 65 76 2d 3e 73 69 64 65 2c 20 70 50 72  pPrev->side, pPr
67d0: 65 76 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20 20  ev->idx,.       
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 65               pSe
67f0: 67 2d 3e 73 69 64 65 2c 20 70 53 65 67 2d 3e 69  g->side, pSeg->i
6800: 64 78 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dx));.          
6810: 20 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79 4f 76    goto geopolyOv
6820: 65 72 6c 61 70 44 6f 6e 65 3b 0a 20 20 20 20 20  erlapDone;.     
6830: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
6840: 50 72 65 76 2d 3e 79 21 3d 70 53 65 67 2d 3e 79  Prev->y!=pSeg->y
6850: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6860: 47 45 4f 44 45 42 55 47 28 28 22 4d 41 53 4b 3a  GEODEBUG(("MASK:
6870: 20 25 64 5c 6e 22 2c 20 69 4d 61 73 6b 29 29 3b   %d\n", iMask));
6880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 4f 76  .            aOv
6890: 65 72 6c 61 70 5b 69 4d 61 73 6b 5d 20 3d 20 31  erlap[iMask] = 1
68a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
68b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
68c0: 69 4d 61 73 6b 20 5e 3d 20 70 53 65 67 2d 3e 73  iMask ^= pSeg->s
68d0: 69 64 65 3b 0a 20 20 20 20 20 20 20 20 70 50 72  ide;.        pPr
68e0: 65 76 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 20  ev = pSeg;.     
68f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 47 45 4f   }.    }.    GEO
6900: 44 45 42 55 47 28 28 22 25 73 20 25 64 2e 25 64  DEBUG(("%s %d.%d
6910: 20 43 3d 25 67 20 42 3d 25 67 5c 6e 22 2c 0a 20   C=%g B=%g\n",. 
6920: 20 20 20 20 20 70 54 68 69 73 45 76 65 6e 74 2d       pThisEvent-
6930: 3e 65 54 79 70 65 20 3f 20 22 52 4d 20 22 20 3a  >eType ? "RM " :
6940: 20 22 41 44 44 22 2c 0a 20 20 20 20 20 20 70 54   "ADD",.      pT
6950: 68 69 73 45 76 65 6e 74 2d 3e 70 53 65 67 2d 3e  hisEvent->pSeg->
6960: 73 69 64 65 2c 20 70 54 68 69 73 45 76 65 6e 74  side, pThisEvent
6970: 2d 3e 70 53 65 67 2d 3e 69 64 78 2c 0a 20 20 20  ->pSeg->idx,.   
6980: 20 20 20 70 54 68 69 73 45 76 65 6e 74 2d 3e 70     pThisEvent->p
6990: 53 65 67 2d 3e 43 2c 0a 20 20 20 20 20 20 70 54  Seg->C,.      pT
69a0: 68 69 73 45 76 65 6e 74 2d 3e 70 53 65 67 2d 3e  hisEvent->pSeg->
69b0: 42 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68  B));.    if( pTh
69c0: 69 73 45 76 65 6e 74 2d 3e 65 54 79 70 65 3d 3d  isEvent->eType==
69d0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  0 ){.      /* Ad
69e0: 64 20 61 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  d a segment */. 
69f0: 20 20 20 20 20 70 53 65 67 20 3d 20 70 54 68 69       pSeg = pThi
6a00: 73 45 76 65 6e 74 2d 3e 70 53 65 67 3b 0a 20 20  sEvent->pSeg;.  
6a10: 20 20 20 20 70 53 65 67 2d 3e 79 20 3d 20 70 53      pSeg->y = pS
6a20: 65 67 2d 3e 79 30 3b 0a 20 20 20 20 20 20 70 53  eg->y0;.      pS
6a30: 65 67 2d 3e 70 4e 65 78 74 20 3d 20 70 41 63 74  eg->pNext = pAct
6a40: 69 76 65 3b 0a 20 20 20 20 20 20 70 41 63 74 69  ive;.      pActi
6a50: 76 65 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 20  ve = pSeg;.     
6a60: 20 6e 65 65 64 53 6f 72 74 20 3d 20 31 3b 0a 20   needSort = 1;. 
6a70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6a80: 2f 2a 20 52 65 6d 6f 76 65 20 61 20 73 65 67 6d  /* Remove a segm
6a90: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ent */.      if(
6aa0: 20 70 41 63 74 69 76 65 3d 3d 70 54 68 69 73 45   pActive==pThisE
6ab0: 76 65 6e 74 2d 3e 70 53 65 67 20 29 7b 0a 20 20  vent->pSeg ){.  
6ac0: 20 20 20 20 20 20 70 41 63 74 69 76 65 20 3d 20        pActive = 
6ad0: 70 41 63 74 69 76 65 2d 3e 70 4e 65 78 74 3b 0a  pActive->pNext;.
6ae0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6af0: 20 20 20 20 20 66 6f 72 28 70 53 65 67 3d 70 41       for(pSeg=pA
6b00: 63 74 69 76 65 3b 20 70 53 65 67 3b 20 70 53 65  ctive; pSeg; pSe
6b10: 67 3d 70 53 65 67 2d 3e 70 4e 65 78 74 29 7b 0a  g=pSeg->pNext){.
6b20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
6b30: 65 67 2d 3e 70 4e 65 78 74 3d 3d 70 54 68 69 73  eg->pNext==pThis
6b40: 45 76 65 6e 74 2d 3e 70 53 65 67 20 29 7b 0a 20  Event->pSeg ){. 
6b50: 20 20 20 20 20 20 20 20 20 20 20 70 53 65 67 2d             pSeg-
6b60: 3e 70 4e 65 78 74 20 3d 20 70 53 65 67 2d 3e 70  >pNext = pSeg->p
6b70: 4e 65 78 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Next->pNext;.   
6b80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6b90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6ba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6bb0: 20 20 7d 0a 20 20 20 20 70 54 68 69 73 45 76 65    }.    pThisEve
6bc0: 6e 74 20 3d 20 70 54 68 69 73 45 76 65 6e 74 2d  nt = pThisEvent-
6bd0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
6be0: 28 20 61 4f 76 65 72 6c 61 70 5b 33 5d 3d 3d 30  ( aOverlap[3]==0
6bf0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
6c00: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 4f 76 65    }else if( aOve
6c10: 72 6c 61 70 5b 31 5d 21 3d 30 20 26 26 20 61 4f  rlap[1]!=0 && aO
6c20: 76 65 72 6c 61 70 5b 32 5d 3d 3d 30 20 29 7b 0a  verlap[2]==0 ){.
6c30: 20 20 20 20 72 63 20 3d 20 33 3b 0a 20 20 7d 65      rc = 3;.  }e
6c40: 6c 73 65 20 69 66 28 20 61 4f 76 65 72 6c 61 70  lse if( aOverlap
6c50: 5b 31 5d 3d 3d 30 20 26 26 20 61 4f 76 65 72 6c  [1]==0 && aOverl
6c60: 61 70 5b 32 5d 21 3d 30 20 29 7b 0a 20 20 20 20  ap[2]!=0 ){.    
6c70: 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 20  rc = 2;.  }else 
6c80: 69 66 28 20 61 4f 76 65 72 6c 61 70 5b 31 5d 3d  if( aOverlap[1]=
6c90: 3d 30 20 26 26 20 61 4f 76 65 72 6c 61 70 5b 32  =0 && aOverlap[2
6ca0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  ]==0 ){.    rc =
6cb0: 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   4;.  }else{.   
6cc0: 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 0a 67 65   rc = 1;.  }..ge
6cd0: 6f 70 6f 6c 79 4f 76 65 72 6c 61 70 44 6f 6e 65  opolyOverlapDone
6ce0: 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
6cf0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
6d00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  ;.}../*.** SQL f
6d10: 75 6e 63 74 69 6f 6e 3a 20 20 20 20 67 65 6f 70  unction:    geop
6d20: 6f 6c 79 5f 6f 76 65 72 6c 61 70 28 50 31 2c 50  oly_overlap(P1,P
6d30: 32 29 0a 2a 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  2).**.** Determi
6d40: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
6d50: 74 20 50 31 20 61 6e 64 20 50 32 20 6f 76 65 72  t P1 and P2 over
6d60: 6c 61 70 2e 20 52 65 74 75 72 6e 20 76 61 6c 75  lap. Return valu
6d70: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 20 20 20 20  e:.**.**   0    
6d80: 20 54 68 65 20 74 77 6f 20 70 6f 6c 79 67 6f 6e   The two polygon
6d90: 73 20 61 72 65 20 64 69 73 6a 6f 69 6e 74 0a 2a  s are disjoint.*
6da0: 2a 20 20 20 31 20 20 20 20 20 54 68 65 79 20 6f  *   1     They o
6db0: 76 65 72 6c 61 70 0a 2a 2a 20 20 20 32 20 20 20  verlap.**   2   
6dc0: 20 20 50 31 20 69 73 20 63 6f 6d 70 6c 65 74 65    P1 is complete
6dd0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ly contained wit
6de0: 68 69 6e 20 50 32 0a 2a 2a 20 20 20 33 20 20 20  hin P2.**   3   
6df0: 20 20 50 32 20 69 73 20 63 6f 6d 70 6c 65 74 65    P2 is complete
6e00: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ly contained wit
6e10: 68 69 6e 20 50 31 0a 2a 2a 20 20 20 34 20 20 20  hin P1.**   4   
6e20: 20 20 50 31 20 61 6e 64 20 50 32 20 61 72 65 20    P1 and P2 are 
6e30: 74 68 65 20 73 61 6d 65 20 70 6f 6c 79 67 6f 6e  the same polygon
6e40: 0a 2a 2a 20 20 20 4e 55 4c 4c 20 20 45 69 74 68  .**   NULL  Eith
6e50: 65 72 20 50 31 20 6f 72 20 50 32 20 6f 72 20 62  er P1 or P2 or b
6e60: 6f 74 68 20 61 72 65 20 6e 6f 74 20 76 61 6c 69  oth are not vali
6e70: 64 20 70 6f 6c 79 67 6f 6e 73 0a 2a 2f 0a 73 74  d polygons.*/.st
6e80: 61 74 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c  atic void geopol
6e90: 79 4f 76 65 72 6c 61 70 46 75 6e 63 28 0a 20 20  yOverlapFunc(.  
6ea0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6eb0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
6ec0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
6ed0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
6ee0: 20 20 47 65 6f 50 6f 6c 79 20 2a 70 31 20 3d 20    GeoPoly *p1 = 
6ef0: 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d  geopolyFuncParam
6f00: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30  (context, argv[0
6f10: 5d 2c 20 30 29 3b 0a 20 20 47 65 6f 50 6f 6c 79  ], 0);.  GeoPoly
6f20: 20 2a 70 32 20 3d 20 67 65 6f 70 6f 6c 79 46 75   *p2 = geopolyFu
6f30: 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c  ncParam(context,
6f40: 20 61 72 67 76 5b 31 5d 2c 20 30 29 3b 0a 20 20   argv[1], 0);.  
6f50: 69 66 28 20 70 31 20 26 26 20 70 32 20 29 7b 0a  if( p1 && p2 ){.
6f60: 20 20 20 20 69 6e 74 20 78 20 3d 20 67 65 6f 70      int x = geop
6f70: 6f 6c 79 4f 76 65 72 6c 61 70 28 70 31 2c 20 70  olyOverlap(p1, p
6f80: 32 29 3b 0a 20 20 20 20 69 66 28 20 78 3c 30 20  2);.    if( x<0 
6f90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6fa0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
6fb0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
6fc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
6fd0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6fe0: 74 28 63 6f 6e 74 65 78 74 2c 20 78 29 3b 0a 20  t(context, x);. 
6ff0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
7000: 65 33 5f 66 72 65 65 28 70 31 29 3b 0a 20 20 73  e3_free(p1);.  s
7010: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 32 29 3b  qlite3_free(p2);
7020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  .}../*.** Enable
7030: 20 6f 72 20 64 69 73 61 62 6c 65 20 64 65 62 75   or disable debu
7040: 67 67 69 6e 67 20 6f 75 74 70 75 74 0a 2a 2f 0a  gging output.*/.
7050: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f 70  static void geop
7060: 6f 6c 79 44 65 62 75 67 46 75 6e 63 28 0a 20 20  olyDebugFunc(.  
7070: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7080: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
7090: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
70a0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
70b0: 23 69 66 64 65 66 20 47 45 4f 50 4f 4c 59 5f 45  #ifdef GEOPOLY_E
70c0: 4e 41 42 4c 45 5f 44 45 42 55 47 0a 20 20 67 65  NABLE_DEBUG.  ge
70d0: 6f 5f 64 65 62 75 67 20 3d 20 73 71 6c 69 74 65  o_debug = sqlite
70e0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
70f0: 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  [0]);.#endif.}..
7100: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
7110: 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70 6c  tion is the impl
7120: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6f  ementation of bo
7130: 74 68 20 74 68 65 20 78 43 6f 6e 6e 65 63 74 20  th the xConnect 
7140: 61 6e 64 20 78 43 72 65 61 74 65 0a 2a 2a 20 6d  and xCreate.** m
7150: 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 67 65  ethods of the ge
7160: 6f 70 6f 6c 79 20 76 69 72 74 75 61 6c 20 74 61  opoly virtual ta
7170: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67  ble..**.**   arg
7180: 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c 65  v[0]   -> module
7190: 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b   name.**   argv[
71a0: 31 5d 20 20 20 2d 3e 20 64 61 74 61 62 61 73 65  1]   -> database
71b0: 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b   name.**   argv[
71c0: 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e 61  2]   -> table na
71d0: 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 2e 2e 2e  me.**   argv[...
71e0: 5d 20 2d 3e 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ] -> column name
71f0: 73 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s....*/.static i
7200: 6e 74 20 67 65 6f 70 6f 6c 79 49 6e 69 74 28 0a  nt geopolyInit(.
7210: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
7240: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
7250: 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 20 20 20    void *pAux,   
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7270: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
7280: 74 68 65 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f  the RTREE_COORD_
7290: 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  * constants */. 
72a0: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
72b0: 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
72c0: 76 2c 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65  v,   /* Paramete
72d0: 72 73 20 74 6f 20 43 52 45 41 54 45 20 54 41 42  rs to CREATE TAB
72e0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  LE statement */.
72f0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
7300: 2a 70 70 56 74 61 62 2c 20 20 20 20 20 20 20 20  *ppVtab,        
7310: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
7320: 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  w virtual table 
7330: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
7340: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
7350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
7360: 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 2c 20   Error message, 
7370: 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
7380: 69 73 43 72 65 61 74 65 20 20 20 20 20 20 20 20  isCreate        
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 2f 2a 20 54 72 75 65 20 66 6f 72 20 78 43 72 65  /* True for xCre
73b0: 61 74 65 2c 20 66 61 6c 73 65 20 66 6f 72 20 78  ate, false for x
73c0: 43 6f 6e 6e 65 63 74 20 2a 2f 0a 29 7b 0a 20 20  Connect */.){.  
73d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
73e0: 4f 4b 3b 0a 20 20 52 74 72 65 65 20 2a 70 52 74  OK;.  Rtree *pRt
73f0: 72 65 65 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 20  ree;.  int nDb; 
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7410: 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
7420: 20 61 72 67 76 5b 31 5d 20 2a 2f 0a 20 20 69 6e   argv[1] */.  in
7430: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
7440: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
7450: 20 73 74 72 69 6e 67 20 61 72 67 76 5b 32 5d 20   string argv[2] 
7460: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72  */.  sqlite3_str
7470: 20 2a 70 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a   *pSql;.  char *
7480: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 69 69 3b 0a  zSql;.  int ii;.
7490: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
74a0: 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54  config(db, SQLIT
74b0: 45 5f 56 54 41 42 5f 43 4f 4e 53 54 52 41 49 4e  E_VTAB_CONSTRAIN
74c0: 54 5f 53 55 50 50 4f 52 54 2c 20 31 29 3b 0a 0a  T_SUPPORT, 1);..
74d0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
74e0: 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  e sqlite3_vtab s
74f0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 6e 44  tructure */.  nD
7500: 62 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  b = (int)strlen(
7510: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 6e 4e 61 6d  argv[1]);.  nNam
7520: 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
7530: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 70 52 74 72  argv[2]);.  pRtr
7540: 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 73 71  ee = (Rtree *)sq
7550: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
7560: 65 6f 66 28 52 74 72 65 65 29 2b 6e 44 62 2b 6e  eof(Rtree)+nDb+n
7570: 4e 61 6d 65 2b 32 29 3b 0a 20 20 69 66 28 20 21  Name+2);.  if( !
7580: 70 52 74 72 65 65 20 29 7b 0a 20 20 20 20 72 65  pRtree ){.    re
7590: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
75a0: 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  M;.  }.  memset(
75b0: 70 52 74 72 65 65 2c 20 30 2c 20 73 69 7a 65 6f  pRtree, 0, sizeo
75c0: 66 28 52 74 72 65 65 29 2b 6e 44 62 2b 6e 4e 61  f(Rtree)+nDb+nNa
75d0: 6d 65 2b 32 29 3b 0a 20 20 70 52 74 72 65 65 2d  me+2);.  pRtree-
75e0: 3e 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 70 52  >nBusy = 1;.  pR
75f0: 74 72 65 65 2d 3e 62 61 73 65 2e 70 4d 6f 64 75  tree->base.pModu
7600: 6c 65 20 3d 20 26 72 74 72 65 65 4d 6f 64 75 6c  le = &rtreeModul
7610: 65 3b 0a 20 20 70 52 74 72 65 65 2d 3e 7a 44 62  e;.  pRtree->zDb
7620: 20 3d 20 28 63 68 61 72 20 2a 29 26 70 52 74 72   = (char *)&pRtr
7630: 65 65 5b 31 5d 3b 0a 20 20 70 52 74 72 65 65 2d  ee[1];.  pRtree-
7640: 3e 7a 4e 61 6d 65 20 3d 20 26 70 52 74 72 65 65  >zName = &pRtree
7650: 2d 3e 7a 44 62 5b 6e 44 62 2b 31 5d 3b 0a 20 20  ->zDb[nDb+1];.  
7660: 70 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79  pRtree->eCoordTy
7670: 70 65 20 3d 20 52 54 52 45 45 5f 43 4f 4f 52 44  pe = RTREE_COORD
7680: 5f 52 45 41 4c 33 32 3b 0a 20 20 70 52 74 72 65  _REAL32;.  pRtre
7690: 65 2d 3e 6e 44 69 6d 20 3d 20 32 3b 0a 20 20 70  e->nDim = 2;.  p
76a0: 52 74 72 65 65 2d 3e 6e 44 69 6d 32 20 3d 20 34  Rtree->nDim2 = 4
76b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 52 74 72 65  ;.  memcpy(pRtre
76c0: 65 2d 3e 7a 44 62 2c 20 61 72 67 76 5b 31 5d 2c  e->zDb, argv[1],
76d0: 20 6e 44 62 29 3b 0a 20 20 6d 65 6d 63 70 79 28   nDb);.  memcpy(
76e0: 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20 61  pRtree->zName, a
76f0: 72 67 76 5b 32 5d 2c 20 6e 4e 61 6d 65 29 3b 0a  rgv[2], nName);.
7700: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 43 6f  ..  /* Create/Co
7710: 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 75 6e 64  nnect to the und
7720: 65 72 6c 79 69 6e 67 20 72 65 6c 61 74 69 6f 6e  erlying relation
7730: 61 6c 20 64 61 74 61 62 61 73 65 20 73 63 68 65  al database sche
7740: 6d 61 2e 20 49 66 0a 20 20 2a 2a 20 74 68 61 74  ma. If.  ** that
7750: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
7760: 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 64 65 63  call sqlite3_dec
7770: 6c 61 72 65 5f 76 74 61 62 28 29 20 74 6f 20 63  lare_vtab() to c
7780: 6f 6e 66 69 67 75 72 65 0a 20 20 2a 2a 20 74 68  onfigure.  ** th
7790: 65 20 72 2d 74 72 65 65 20 74 61 62 6c 65 20 73  e r-tree table s
77a0: 63 68 65 6d 61 2e 0a 20 20 2a 2f 0a 20 20 70 53  chema..  */.  pS
77b0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72  ql = sqlite3_str
77c0: 5f 6e 65 77 28 64 62 29 3b 0a 20 20 73 71 6c 69  _new(db);.  sqli
77d0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
77e0: 70 53 71 6c 2c 20 22 43 52 45 41 54 45 20 54 41  pSql, "CREATE TA
77f0: 42 4c 45 20 78 28 5f 73 68 61 70 65 22 29 3b 0a  BLE x(_shape");.
7800: 20 20 70 52 74 72 65 65 2d 3e 6e 41 75 78 20 3d    pRtree->nAux =
7810: 20 31 3b 20 20 20 2f 2a 20 41 64 64 20 6f 6e 65   1;   /* Add one
7820: 20 66 6f 72 20 5f 73 68 61 70 65 20 2a 2f 0a 20   for _shape */. 
7830: 20 66 6f 72 28 69 69 3d 33 3b 20 69 69 3c 61 72   for(ii=3; ii<ar
7840: 67 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70  gc; ii++){.    p
7850: 52 74 72 65 65 2d 3e 6e 41 75 78 2b 2b 3b 0a 20  Rtree->nAux++;. 
7860: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
7870: 70 70 65 6e 64 66 28 70 53 71 6c 2c 20 22 2c 25  ppendf(pSql, ",%
7880: 73 22 2c 20 61 72 67 76 5b 69 69 5d 29 3b 0a 20  s", argv[ii]);. 
7890: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72   }.  sqlite3_str
78a0: 5f 61 70 70 65 6e 64 66 28 70 53 71 6c 2c 20 22  _appendf(pSql, "
78b0: 29 3b 22 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  );");.  zSql = s
78c0: 71 6c 69 74 65 33 5f 73 74 72 5f 66 69 6e 69 73  qlite3_str_finis
78d0: 68 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 21  h(pSql);.  if( !
78e0: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  zSql ){.    rc =
78f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7900: 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
7910: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
7920: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
7930: 28 64 62 2c 20 7a 53 71 6c 29 29 20 29 7b 0a 20  (db, zSql)) ){. 
7940: 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
7950: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
7960: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
7970: 28 64 62 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (db));.  }.  sql
7980: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
7990: 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
79a0: 20 67 65 6f 70 6f 6c 79 49 6e 69 74 5f 66 61 69   geopolyInit_fai
79b0: 6c 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e 42 79  l;.  pRtree->nBy
79c0: 74 65 73 50 65 72 43 65 6c 6c 20 3d 20 38 20 2b  tesPerCell = 8 +
79d0: 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32 2a 34   pRtree->nDim2*4
79e0: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
79f0: 75 74 20 74 68 65 20 6e 6f 64 65 20 73 69 7a 65  ut the node size
7a00: 20 74 6f 20 75 73 65 2e 20 2a 2f 0a 20 20 72 63   to use. */.  rc
7a10: 20 3d 20 67 65 74 4e 6f 64 65 53 69 7a 65 28 64   = getNodeSize(d
7a20: 62 2c 20 70 52 74 72 65 65 2c 20 69 73 43 72 65  b, pRtree, isCre
7a30: 61 74 65 2c 20 70 7a 45 72 72 29 3b 0a 20 20 69  ate, pzErr);.  i
7a40: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 67 65 6f  f( rc ) goto geo
7a50: 70 6f 6c 79 49 6e 69 74 5f 66 61 69 6c 3b 0a 20  polyInit_fail;. 
7a60: 20 72 63 20 3d 20 72 74 72 65 65 53 71 6c 49 6e   rc = rtreeSqlIn
7a70: 69 74 28 70 52 74 72 65 65 2c 20 64 62 2c 20 61  it(pRtree, db, a
7a80: 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 2c  rgv[1], argv[2],
7a90: 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 69 66   isCreate);.  if
7aa0: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 7a 45  ( rc ){.    *pzE
7ab0: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
7ac0: 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
7ad0: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
7ae0: 20 20 20 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79      goto geopoly
7af0: 49 6e 69 74 5f 66 61 69 6c 3b 0a 20 20 7d 0a 0a  Init_fail;.  }..
7b00: 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c    *ppVtab = (sql
7b10: 69 74 65 33 5f 76 74 61 62 20 2a 29 70 52 74 72  ite3_vtab *)pRtr
7b20: 65 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ee;.  return SQL
7b30: 49 54 45 5f 4f 4b 3b 0a 0a 67 65 6f 70 6f 6c 79  ITE_OK;..geopoly
7b40: 49 6e 69 74 5f 66 61 69 6c 3a 0a 20 20 69 66 28  Init_fail:.  if(
7b50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7b60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
7b70: 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70  OR;.  assert( *p
7b80: 70 56 74 61 62 3d 3d 30 20 29 3b 0a 20 20 61 73  pVtab==0 );.  as
7b90: 73 65 72 74 28 20 70 52 74 72 65 65 2d 3e 6e 42  sert( pRtree->nB
7ba0: 75 73 79 3d 3d 31 20 29 3b 0a 20 20 72 74 72 65  usy==1 );.  rtre
7bb0: 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 29  eRelease(pRtree)
7bc0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7bd0: 0a 0a 0a 2f 2a 20 0a 2a 2a 20 47 45 4f 50 4f 4c  .../* .** GEOPOL
7be0: 59 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  Y virtual table 
7bf0: 6d 6f 64 75 6c 65 20 78 43 72 65 61 74 65 20 6d  module xCreate m
7c00: 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
7c10: 20 69 6e 74 20 67 65 6f 70 6f 6c 79 43 72 65 61   int geopolyCrea
7c20: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
7c30: 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  b,.  void *pAux,
7c40: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  .  int argc, con
7c50: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
7c60: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgv,.  sqlite3_v
7c70: 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20  tab **ppVtab,.  
7c80: 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
7c90: 20 20 72 65 74 75 72 6e 20 67 65 6f 70 6f 6c 79    return geopoly
7ca0: 49 6e 69 74 28 64 62 2c 20 70 41 75 78 2c 20 61  Init(db, pAux, a
7cb0: 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56 74 61  rgc, argv, ppVta
7cc0: 62 2c 20 70 7a 45 72 72 2c 20 31 29 3b 0a 7d 0a  b, pzErr, 1);.}.
7cd0: 0a 2f 2a 20 0a 2a 2a 20 47 45 4f 50 4f 4c 59 20  ./* .** GEOPOLY 
7ce0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
7cf0: 64 75 6c 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65  dule xConnect me
7d00: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
7d10: 69 6e 74 20 67 65 6f 70 6f 6c 79 43 6f 6e 6e 65  int geopolyConne
7d20: 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
7d30: 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  b,.  void *pAux,
7d40: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  .  int argc, con
7d50: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
7d60: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgv,.  sqlite3_v
7d70: 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20  tab **ppVtab,.  
7d80: 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
7d90: 20 20 72 65 74 75 72 6e 20 67 65 6f 70 6f 6c 79    return geopoly
7da0: 49 6e 69 74 28 64 62 2c 20 70 41 75 78 2c 20 61  Init(db, pAux, a
7db0: 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56 74 61  rgc, argv, ppVta
7dc0: 62 2c 20 70 7a 45 72 72 2c 20 30 29 3b 0a 7d 0a  b, pzErr, 0);.}.
7dd0: 0a 0a 2f 2a 20 0a 2a 2a 20 47 45 4f 50 4f 4c 59  ../* .** GEOPOLY
7de0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
7df0: 6f 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d 65  odule xFilter me
7e00: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 51 75 65 72  thod..**.** Quer
7e10: 79 20 70 6c 61 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  y plans:.**.**  
7e20: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 72 6f      1         ro
7e30: 77 69 64 20 6c 6f 6f 6b 75 70 0a 2a 2a 20 20 20  wid lookup.**   
7e40: 20 20 20 32 20 20 20 20 20 20 20 20 20 73 65 61     2         sea
7e50: 72 63 68 20 66 6f 72 20 6f 62 6a 65 63 74 73 20  rch for objects 
7e60: 6f 76 65 72 6c 61 70 70 69 6e 67 20 74 68 65 20  overlapping the 
7e70: 73 61 6d 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f  same bounding bo
7e80: 78 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  x.**            
7e90: 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e      that contain
7ea0: 73 20 70 6f 6c 79 67 6f 6e 20 61 72 67 76 5b 30  s polygon argv[0
7eb0: 5d 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  ].**      3     
7ec0: 20 20 20 20 73 65 61 72 63 68 20 66 6f 72 20 6f      search for o
7ed0: 62 6a 65 63 74 73 20 6f 76 65 72 6c 61 70 70 69  bjects overlappi
7ee0: 6e 67 20 74 68 65 20 73 61 6d 65 20 62 6f 75 6e  ng the same boun
7ef0: 64 69 6e 67 20 62 6f 78 0a 2a 2a 20 20 20 20 20  ding box.**     
7f00: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
7f10: 63 6f 6e 74 61 69 6e 73 20 70 6f 6c 79 67 6f 6e  contains polygon
7f20: 20 61 72 67 76 5b 30 5d 0a 2a 2a 20 20 20 20 20   argv[0].**     
7f30: 20 34 20 20 20 20 20 20 20 20 20 66 75 6c 6c 20   4         full 
7f40: 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2f 0a 73 74  table scan.*/.st
7f50: 61 74 69 63 20 69 6e 74 20 67 65 6f 70 6f 6c 79  atic int geopoly
7f60: 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65  Filter(.  sqlite
7f70: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
7f80: 56 74 61 62 43 75 72 73 6f 72 2c 20 20 20 20 20  VtabCursor,     
7f90: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
7fa0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20   initialize */. 
7fb0: 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 20 20 20   int idxNum,    
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fd0: 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20         /* Query 
7fe0: 70 6c 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  plan */.  const 
7ff0: 63 68 61 72 20 2a 69 64 78 53 74 72 2c 20 20 20  char *idxStr,   
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8010: 2f 2a 20 4e 6f 74 20 55 73 65 64 20 2a 2f 0a 20  /* Not Used */. 
8020: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
8030: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 20  e3_value **argv 
8040: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65         /* Parame
8050: 74 65 72 73 20 74 6f 20 74 68 65 20 71 75 65 72  ters to the quer
8060: 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 52  y plan */.){.  R
8070: 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28  tree *pRtree = (
8080: 52 74 72 65 65 20 2a 29 70 56 74 61 62 43 75 72  Rtree *)pVtabCur
8090: 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 52 74  sor->pVtab;.  Rt
80a0: 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20  reeCursor *pCsr 
80b0: 3d 20 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a  = (RtreeCursor *
80c0: 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
80d0: 52 74 72 65 65 4e 6f 64 65 20 2a 70 52 6f 6f 74  RtreeNode *pRoot
80e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
80f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
8100: 74 20 69 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 73  t iCell = 0;.  s
8110: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
8120: 6d 74 3b 0a 0a 20 20 72 74 72 65 65 52 65 66 65  mt;..  rtreeRefe
8130: 72 65 6e 63 65 28 70 52 74 72 65 65 29 3b 0a 0a  rence(pRtree);..
8140: 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 63    /* Reset the c
8150: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 61 6d  ursor to the sam
8160: 65 20 73 74 61 74 65 20 61 73 20 72 74 72 65 65  e state as rtree
8170: 4f 70 65 6e 28 29 20 6c 65 61 76 65 73 20 69 74  Open() leaves it
8180: 20 69 6e 2e 20 2a 2f 0a 20 20 66 72 65 65 43 75   in. */.  freeCu
8190: 72 73 6f 72 43 6f 6e 73 74 72 61 69 6e 74 73 28  rsorConstraints(
81a0: 70 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCsr);.  sqlite3
81b0: 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 50 6f 69  _free(pCsr->aPoi
81c0: 6e 74 29 3b 0a 20 20 70 53 74 6d 74 20 3d 20 70  nt);.  pStmt = p
81d0: 43 73 72 2d 3e 70 52 65 61 64 41 75 78 3b 0a 20  Csr->pReadAux;. 
81e0: 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c   memset(pCsr, 0,
81f0: 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 75 72   sizeof(RtreeCur
8200: 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e 62  sor));.  pCsr->b
8210: 61 73 65 2e 70 56 74 61 62 20 3d 20 28 73 71 6c  ase.pVtab = (sql
8220: 69 74 65 33 5f 76 74 61 62 2a 29 70 52 74 72 65  ite3_vtab*)pRtre
8230: 65 3b 0a 20 20 70 43 73 72 2d 3e 70 52 65 61 64  e;.  pCsr->pRead
8240: 41 75 78 20 3d 20 70 53 74 6d 74 3b 0a 0a 20 20  Aux = pStmt;..  
8250: 70 43 73 72 2d 3e 69 53 74 72 61 74 65 67 79 20  pCsr->iStrategy 
8260: 3d 20 69 64 78 4e 75 6d 3b 0a 20 20 69 66 28 20  = idxNum;.  if( 
8270: 69 64 78 4e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20  idxNum==1 ){.   
8280: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
8290: 20 2d 20 6c 6f 6f 6b 75 70 20 62 79 20 72 6f 77   - lookup by row
82a0: 69 64 2e 20 2a 2f 0a 20 20 20 20 52 74 72 65 65  id. */.    Rtree
82b0: 4e 6f 64 65 20 2a 70 4c 65 61 66 3b 20 20 20 20  Node *pLeaf;    
82c0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 6f 6e 20 77      /* Leaf on w
82d0: 68 69 63 68 20 74 68 65 20 72 65 71 75 69 72 65  hich the require
82e0: 64 20 63 65 6c 6c 20 72 65 73 69 64 65 73 20 2a  d cell resides *
82f0: 2f 0a 20 20 20 20 52 74 72 65 65 53 65 61 72 63  /.    RtreeSearc
8300: 68 50 6f 69 6e 74 20 2a 70 3b 20 20 20 20 20 2f  hPoint *p;     /
8310: 2a 20 53 65 61 72 63 68 20 70 6f 69 6e 74 20 66  * Search point f
8320: 6f 72 20 74 68 65 20 6c 65 61 66 20 2a 2f 0a 20  or the leaf */. 
8330: 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
8340: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
8350: 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  t64(argv[0]);.  
8360: 20 20 69 36 34 20 69 4e 6f 64 65 20 3d 20 30 3b    i64 iNode = 0;
8370: 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 65  .    rc = findLe
8380: 61 66 4e 6f 64 65 28 70 52 74 72 65 65 2c 20 69  afNode(pRtree, i
8390: 52 6f 77 69 64 2c 20 26 70 4c 65 61 66 2c 20 26  Rowid, &pLeaf, &
83a0: 69 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  iNode);.    if( 
83b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
83c0: 20 70 4c 65 61 66 21 3d 30 20 29 7b 0a 20 20 20   pLeaf!=0 ){.   
83d0: 20 20 20 70 20 3d 20 72 74 72 65 65 53 65 61 72     p = rtreeSear
83e0: 63 68 50 6f 69 6e 74 4e 65 77 28 70 43 73 72 2c  chPointNew(pCsr,
83f0: 20 52 54 52 45 45 5f 5a 45 52 4f 2c 20 30 29 3b   RTREE_ZERO, 0);
8400: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8410: 21 3d 30 20 29 3b 20 20 2f 2a 20 41 6c 77 61 79  !=0 );  /* Alway
8420: 73 20 72 65 74 75 72 6e 73 20 70 43 73 72 2d 3e  s returns pCsr->
8430: 73 50 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  sPoint */.      
8440: 70 43 73 72 2d 3e 61 4e 6f 64 65 5b 30 5d 20 3d  pCsr->aNode[0] =
8450: 20 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 70 2d   pLeaf;.      p-
8460: 3e 69 64 20 3d 20 69 4e 6f 64 65 3b 0a 20 20 20  >id = iNode;.   
8470: 20 20 20 70 2d 3e 65 57 69 74 68 69 6e 20 3d 20     p->eWithin = 
8480: 50 41 52 54 4c 59 5f 57 49 54 48 49 4e 3b 0a 20  PARTLY_WITHIN;. 
8490: 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 6f       rc = nodeRo
84a0: 77 69 64 49 6e 64 65 78 28 70 52 74 72 65 65 2c  widIndex(pRtree,
84b0: 20 70 4c 65 61 66 2c 20 69 52 6f 77 69 64 2c 20   pLeaf, iRowid, 
84c0: 26 69 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  &iCell);.      p
84d0: 2d 3e 69 43 65 6c 6c 20 3d 20 28 75 38 29 69 43  ->iCell = (u8)iC
84e0: 65 6c 6c 3b 0a 20 20 20 20 20 20 52 54 52 45 45  ell;.      RTREE
84f0: 5f 51 55 45 55 45 5f 54 52 41 43 45 28 70 43 73  _QUEUE_TRACE(pCs
8500: 72 2c 20 22 50 55 53 48 2d 46 31 3a 22 29 3b 0a  r, "PUSH-F1:");.
8510: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8520: 20 70 43 73 72 2d 3e 61 74 45 4f 46 20 3d 20 31   pCsr->atEOF = 1
8530: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
8540: 0a 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 63  .    /* Normal c
8550: 61 73 65 20 2d 20 72 2d 74 72 65 65 20 73 63 61  ase - r-tree sca
8560: 6e 2e 20 53 65 74 20 75 70 20 74 68 65 20 52 74  n. Set up the Rt
8570: 72 65 65 43 75 72 73 6f 72 2e 61 43 6f 6e 73 74  reeCursor.aConst
8580: 72 61 69 6e 74 20 61 72 72 61 79 20 0a 20 20 20  raint array .   
8590: 20 2a 2a 20 77 69 74 68 20 74 68 65 20 63 6f 6e   ** with the con
85a0: 66 69 67 75 72 65 64 20 63 6f 6e 73 74 72 61 69  figured constrai
85b0: 6e 74 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nts. .    */.   
85c0: 20 72 63 20 3d 20 6e 6f 64 65 41 63 71 75 69 72   rc = nodeAcquir
85d0: 65 28 70 52 74 72 65 65 2c 20 31 2c 20 30 2c 20  e(pRtree, 1, 0, 
85e0: 26 70 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28  &pRoot);.    if(
85f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
8600: 26 20 69 64 78 4e 75 6d 3c 3d 33 20 29 7b 0a 20  & idxNum<=3 ){. 
8610: 20 20 20 20 20 52 74 72 65 65 43 6f 6f 72 64 20       RtreeCoord 
8620: 62 62 6f 78 5b 34 5d 3b 0a 20 20 20 20 20 20 52  bbox[4];.      R
8630: 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a  treeConstraint *
8640: 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
8650: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 20 20   argc==1 );.    
8660: 20 20 67 65 6f 70 6f 6c 79 42 42 6f 78 28 30 2c    geopolyBBox(0,
8670: 20 61 72 67 76 5b 30 5d 2c 20 62 62 6f 78 2c 20   argv[0], bbox, 
8680: 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
8690: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
86a0: 74 6f 20 67 65 6f 70 6f 6c 79 5f 66 69 6c 74 65  to geopoly_filte
86b0: 72 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  r_end;.      }. 
86c0: 20 20 20 20 20 70 43 73 72 2d 3e 61 43 6f 6e 73       pCsr->aCons
86d0: 74 72 61 69 6e 74 20 3d 20 70 20 3d 20 73 71 6c  traint = p = sql
86e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
86f0: 6f 66 28 52 74 72 65 65 43 6f 6e 73 74 72 61 69  of(RtreeConstrai
8700: 6e 74 29 2a 34 29 3b 0a 20 20 20 20 20 20 70 43  nt)*4);.      pC
8710: 73 72 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  sr->nConstraint 
8720: 3d 20 34 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 4;.      if( p
8730: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
8740: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
8750: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8760: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43         memset(pC
8770: 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 2c  sr->aConstraint,
8780: 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65   0, sizeof(Rtree
8790: 43 6f 6e 73 74 72 61 69 6e 74 29 2a 34 29 3b 0a  Constraint)*4);.
87a0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
87b0: 43 73 72 2d 3e 61 6e 51 75 65 75 65 2c 20 30 2c  Csr->anQueue, 0,
87c0: 20 73 69 7a 65 6f 66 28 75 33 32 29 2a 28 70 52   sizeof(u32)*(pR
87d0: 74 72 65 65 2d 3e 69 44 65 70 74 68 20 2b 20 31  tree->iDepth + 1
87e0: 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
87f0: 69 64 78 4e 75 6d 3d 3d 32 20 29 7b 0a 20 20 20  idxNum==2 ){.   
8800: 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 6c 61         /* Overla
8810: 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  p query */.     
8820: 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27 42 27       p->op = 'B'
8830: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  ;.          p->i
8840: 43 6f 6f 72 64 20 3d 20 30 3b 0a 20 20 20 20 20  Coord = 0;.     
8850: 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65       p->u.rValue
8860: 20 3d 20 62 62 6f 78 5b 31 5d 2e 66 3b 0a 20 20   = bbox[1].f;.  
8870: 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20          p++;.   
8880: 20 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27         p->op = '
8890: 44 27 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  D';.          p-
88a0: 3e 69 43 6f 6f 72 64 20 3d 20 31 3b 0a 20 20 20  >iCoord = 1;.   
88b0: 20 20 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c         p->u.rVal
88c0: 75 65 20 3d 20 62 62 6f 78 5b 30 5d 2e 66 3b 0a  ue = bbox[0].f;.
88d0: 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20            p++;. 
88e0: 20 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d           p->op =
88f0: 20 27 42 27 3b 0a 20 20 20 20 20 20 20 20 20 20   'B';.          
8900: 70 2d 3e 69 43 6f 6f 72 64 20 3d 20 32 3b 0a 20  p->iCoord = 2;. 
8910: 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 72 56           p->u.rV
8920: 61 6c 75 65 20 3d 20 62 62 6f 78 5b 33 5d 2e 66  alue = bbox[3].f
8930: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b  ;.          p++;
8940: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  .          p->op
8950: 20 3d 20 27 44 27 3b 0a 20 20 20 20 20 20 20 20   = 'D';.        
8960: 20 20 70 2d 3e 69 43 6f 6f 72 64 20 3d 20 33 3b    p->iCoord = 3;
8970: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e  .          p->u.
8980: 72 56 61 6c 75 65 20 3d 20 62 62 6f 78 5b 32 5d  rValue = bbox[2]
8990: 2e 66 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  .f;.        }els
89a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
89b0: 57 69 74 68 69 6e 20 71 75 65 72 79 20 2a 2f 0a  Within query */.
89c0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 20            p->op 
89d0: 3d 20 27 44 27 3b 0a 20 20 20 20 20 20 20 20 20  = 'D';.         
89e0: 20 70 2d 3e 69 43 6f 6f 72 64 20 3d 20 30 3b 0a   p->iCoord = 0;.
89f0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 72            p->u.r
8a00: 56 61 6c 75 65 20 3d 20 62 62 6f 78 5b 30 5d 2e  Value = bbox[0].
8a10: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2b 2b  f;.          p++
8a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6f  ;.          p->o
8a30: 70 20 3d 20 27 42 27 3b 0a 20 20 20 20 20 20 20  p = 'B';.       
8a40: 20 20 20 70 2d 3e 69 43 6f 6f 72 64 20 3d 20 31     p->iCoord = 1
8a50: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75  ;.          p->u
8a60: 2e 72 56 61 6c 75 65 20 3d 20 62 62 6f 78 5b 31  .rValue = bbox[1
8a70: 5d 2e 66 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ].f;.          p
8a80: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ++;.          p-
8a90: 3e 6f 70 20 3d 20 27 44 27 3b 0a 20 20 20 20 20  >op = 'D';.     
8aa0: 20 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64 20 3d       p->iCoord =
8ab0: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   2;.          p-
8ac0: 3e 75 2e 72 56 61 6c 75 65 20 3d 20 62 62 6f 78  >u.rValue = bbox
8ad0: 5b 32 5d 2e 66 3b 0a 20 20 20 20 20 20 20 20 20  [2].f;.         
8ae0: 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   p++;.          
8af0: 70 2d 3e 6f 70 20 3d 20 27 42 27 3b 0a 20 20 20  p->op = 'B';.   
8b00: 20 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64         p->iCoord
8b10: 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20   = 3;.          
8b20: 70 2d 3e 75 2e 72 56 61 6c 75 65 20 3d 20 62 62  p->u.rValue = bb
8b30: 6f 78 5b 33 5d 2e 66 3b 0a 20 20 20 20 20 20 20  ox[3].f;.       
8b40: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
8b50: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8b60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8b70: 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  RtreeSearchPoint
8b80: 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e   *pNew;.      pN
8b90: 65 77 20 3d 20 72 74 72 65 65 53 65 61 72 63 68  ew = rtreeSearch
8ba0: 50 6f 69 6e 74 4e 65 77 28 70 43 73 72 2c 20 52  PointNew(pCsr, R
8bb0: 54 52 45 45 5f 5a 45 52 4f 2c 20 28 75 38 29 28  TREE_ZERO, (u8)(
8bc0: 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 2b 31  pRtree->iDepth+1
8bd0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  ));.      if( pN
8be0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
8bf0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
8c00: 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
8c10: 20 67 65 6f 70 6f 6c 79 5f 66 69 6c 74 65 72 5f   geopoly_filter_
8c20: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
8c30: 20 20 20 70 4e 65 77 2d 3e 69 64 20 3d 20 31 3b     pNew->id = 1;
8c40: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 43 65  .      pNew->iCe
8c50: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  ll = 0;.      pN
8c60: 65 77 2d 3e 65 57 69 74 68 69 6e 20 3d 20 50 41  ew->eWithin = PA
8c70: 52 54 4c 59 5f 57 49 54 48 49 4e 3b 0a 20 20 20  RTLY_WITHIN;.   
8c80: 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d     assert( pCsr-
8c90: 3e 62 50 6f 69 6e 74 3d 3d 31 20 29 3b 0a 20 20  >bPoint==1 );.  
8ca0: 20 20 20 20 70 43 73 72 2d 3e 61 4e 6f 64 65 5b      pCsr->aNode[
8cb0: 30 5d 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 20 20  0] = pRoot;.    
8cc0: 20 20 70 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 20    pRoot = 0;.   
8cd0: 20 20 20 52 54 52 45 45 5f 51 55 45 55 45 5f 54     RTREE_QUEUE_T
8ce0: 52 41 43 45 28 70 43 73 72 2c 20 22 50 55 53 48  RACE(pCsr, "PUSH
8cf0: 2d 46 6d 3a 22 29 3b 0a 20 20 20 20 20 20 72 63  -Fm:");.      rc
8d00: 20 3d 20 72 74 72 65 65 53 74 65 70 54 6f 4c 65   = rtreeStepToLe
8d10: 61 66 28 70 43 73 72 29 3b 0a 20 20 20 20 7d 0a  af(pCsr);.    }.
8d20: 20 20 7d 0a 0a 67 65 6f 70 6f 6c 79 5f 66 69 6c    }..geopoly_fil
8d30: 74 65 72 5f 65 6e 64 3a 0a 20 20 6e 6f 64 65 52  ter_end:.  nodeR
8d40: 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
8d50: 52 6f 6f 74 29 3b 0a 20 20 72 74 72 65 65 52 65  Root);.  rtreeRe
8d60: 6c 65 61 73 65 28 70 52 74 72 65 65 29 3b 0a 20  lease(pRtree);. 
8d70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8d80: 2a 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75  *.** Rtree virtu
8d90: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
8da0: 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
8db0: 64 2e 20 54 68 65 72 65 20 61 72 65 20 74 68 72  d. There are thr
8dc0: 65 65 0a 2a 2a 20 74 61 62 6c 65 20 73 63 61 6e  ee.** table scan
8dd0: 20 73 74 72 61 74 65 67 69 65 73 20 74 6f 20 63   strategies to c
8de0: 68 6f 6f 73 65 20 66 72 6f 6d 20 28 69 6e 20 6f  hoose from (in o
8df0: 72 64 65 72 20 66 72 6f 6d 20 6d 6f 73 74 20 74  rder from most t
8e00: 6f 20 0a 2a 2a 20 6c 65 61 73 74 20 64 65 73 69  o .** least desi
8e10: 72 61 62 6c 65 29 3a 0a 2a 2a 0a 2a 2a 20 20 20  rable):.**.**   
8e20: 69 64 78 4e 75 6d 20 20 20 20 20 69 64 78 53 74  idxNum     idxSt
8e30: 72 20 20 20 20 20 20 20 20 53 74 72 61 74 65 67  r        Strateg
8e40: 79 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  y.**   ---------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 31  -------.**     1
8e80: 20 20 20 20 20 20 20 20 22 72 6f 77 69 64 22 20          "rowid" 
8e90: 20 20 20 20 20 20 44 69 72 65 63 74 20 6c 6f 6f        Direct loo
8ea0: 6b 75 70 20 62 79 20 72 6f 77 69 64 2e 0a 2a 2a  kup by rowid..**
8eb0: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 22 72       2        "r
8ec0: 74 72 65 65 22 20 20 20 20 20 20 20 52 2d 74 72  tree"       R-tr
8ed0: 65 65 20 6f 76 65 72 6c 61 70 20 71 75 65 72 79  ee overlap query
8ee0: 20 75 73 69 6e 67 20 67 65 6f 70 6f 6c 79 5f 6f   using geopoly_o
8ef0: 76 65 72 6c 61 70 28 29 0a 2a 2a 20 20 20 20 20  verlap().**     
8f00: 33 20 20 20 20 20 20 20 20 22 72 74 72 65 65 22  3        "rtree"
8f10: 20 20 20 20 20 20 20 52 2d 74 72 65 65 20 77 69         R-tree wi
8f20: 74 68 69 6e 20 71 75 65 72 79 20 75 73 69 6e 67  thin query using
8f30: 20 67 65 6f 70 6f 6c 79 5f 77 69 74 68 69 6e 28   geopoly_within(
8f40: 29 0a 2a 2a 20 20 20 20 20 34 20 20 20 20 20 20  ).**     4      
8f50: 20 20 22 66 75 6c 6c 73 63 61 6e 22 20 20 20 20    "fullscan"    
8f60: 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 2e  full-table scan.
8f70: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fa0: 2d 2d 2d 2d 2d 2d 0a 2a 2f 0a 73 74 61 74 69 63  ------.*/.static
8fb0: 20 69 6e 74 20 67 65 6f 70 6f 6c 79 42 65 73 74   int geopolyBest
8fc0: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74  Index(sqlite3_vt
8fd0: 61 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33  ab *tab, sqlite3
8fe0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
8ff0: 78 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 69  xInfo){.  int ii
9000: 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 54 65  ;.  int iRowidTe
9010: 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  rm = -1;.  int i
9020: 46 75 6e 63 54 65 72 6d 20 3d 20 2d 31 3b 0a 20  FuncTerm = -1;. 
9030: 20 69 6e 74 20 69 64 78 4e 75 6d 20 3d 20 30 3b   int idxNum = 0;
9040: 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
9050: 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
9060: 74 72 61 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  traint; ii++){. 
9070: 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65     struct sqlite
9080: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
9090: 6e 74 20 2a 70 20 3d 20 26 70 49 64 78 49 6e 66  nt *p = &pIdxInf
90a0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  o->aConstraint[i
90b0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  i];.    if( !p->
90c0: 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75  usable ) continu
90d0: 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 43  e;.    if( p->iC
90e0: 6f 6c 75 6d 6e 3c 30 20 26 26 20 70 2d 3e 6f 70  olumn<0 && p->op
90f0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
9100: 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 20 29 7b  ONSTRAINT_EQ  ){
9110: 0a 20 20 20 20 20 20 69 52 6f 77 69 64 54 65 72  .      iRowidTer
9120: 6d 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 62 72  m = ii;.      br
9130: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
9140: 66 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30  f( p->iColumn==0
9150: 20 26 26 20 70 2d 3e 6f 70 3e 3d 53 51 4c 49 54   && p->op>=SQLIT
9160: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
9170: 4e 54 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  NT_FUNCTION ){. 
9180: 20 20 20 20 20 2f 2a 20 70 2d 3e 6f 70 3d 3d 53       /* p->op==S
9190: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
91a0: 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 20  TRAINT_FUNCTION 
91b0: 66 6f 72 20 67 65 6f 70 6f 6c 79 5f 6f 76 65 72  for geopoly_over
91c0: 6c 61 70 28 29 0a 20 20 20 20 20 20 2a 2a 20 70  lap().      ** p
91d0: 2d 3e 6f 70 3d 3d 28 53 51 4c 49 54 45 5f 49 4e  ->op==(SQLITE_IN
91e0: 44 45 58 5f 43 4f 4e 54 52 41 49 4e 54 5f 46 55  DEX_CONTRAINT_FU
91f0: 4e 43 54 49 4f 4e 2b 31 29 20 66 6f 72 20 67 65  NCTION+1) for ge
9200: 6f 70 6f 6c 79 5f 77 69 74 68 69 6e 28 29 2e 0a  opoly_within()..
9210: 20 20 20 20 20 20 2a 2a 20 53 65 65 20 67 65 6f        ** See geo
9220: 70 6f 6c 79 46 69 6e 64 46 75 6e 63 74 69 6f 6e  polyFindFunction
9230: 28 29 20 2a 2f 0a 20 20 20 20 20 20 69 46 75 6e  () */.      iFun
9240: 63 54 65 72 6d 20 3d 20 69 69 3b 0a 20 20 20 20  cTerm = ii;.    
9250: 20 20 69 64 78 4e 75 6d 20 3d 20 70 2d 3e 6f 70    idxNum = p->op
9260: 20 2d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   - SQLITE_INDEX_
9270: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54  CONSTRAINT_FUNCT
9280: 49 4f 4e 20 2b 20 32 3b 0a 20 20 20 20 7d 0a 20  ION + 2;.    }. 
9290: 20 7d 0a 0a 20 20 69 66 28 20 69 52 6f 77 69 64   }..  if( iRowid
92a0: 54 65 72 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Term>=0 ){.    p
92b0: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
92c0: 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 1;.    pIdxInf
92d0: 6f 2d 3e 69 64 78 53 74 72 20 3d 20 22 72 6f 77  o->idxStr = "row
92e0: 69 64 22 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  id";.    pIdxInf
92f0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
9300: 61 67 65 5b 69 52 6f 77 69 64 54 65 72 6d 5d 2e  age[iRowidTerm].
9310: 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20  argvIndex = 1;. 
9320: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
9330: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 52  nstraintUsage[iR
9340: 6f 77 69 64 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d  owidTerm].omit =
9350: 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   1;.    pIdxInfo
9360: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
9370: 3d 20 33 30 2e 30 3b 0a 20 20 20 20 70 49 64 78  = 30.0;.    pIdx
9380: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
9390: 6f 77 73 20 3d 20 31 3b 0a 20 20 20 20 70 49 64  ows = 1;.    pId
93a0: 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20  xInfo->idxFlags 
93b0: 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  = SQLITE_INDEX_S
93c0: 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  CAN_UNIQUE;.    
93d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
93e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 46 75 6e  ;.  }.  if( iFun
93f0: 63 54 65 72 6d 3e 3d 30 20 29 7b 0a 20 20 20 20  cTerm>=0 ){.    
9400: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
9410: 20 3d 20 69 64 78 4e 75 6d 3b 0a 20 20 20 20 70   = idxNum;.    p
9420: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
9430: 3d 20 22 72 74 72 65 65 22 3b 0a 20 20 20 20 70  = "rtree";.    p
9440: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
9450: 61 69 6e 74 55 73 61 67 65 5b 69 46 75 6e 63 54  aintUsage[iFuncT
9460: 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  erm].argvIndex =
9470: 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   1;.    pIdxInfo
9480: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
9490: 67 65 5b 69 46 75 6e 63 54 65 72 6d 5d 2e 6f 6d  ge[iFuncTerm].om
94a0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  it = 0;.    pIdx
94b0: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
94c0: 6f 73 74 20 3d 20 33 30 30 2e 30 3b 0a 20 20 20  ost = 300.0;.   
94d0: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
94e0: 61 74 65 64 52 6f 77 73 20 3d 20 31 30 3b 0a 20  atedRows = 10;. 
94f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9500: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49  _OK;.  }.  pIdxI
9510: 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 34 3b  nfo->idxNum = 4;
9520: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
9530: 53 74 72 20 3d 20 22 66 75 6c 6c 73 63 61 6e 22  Str = "fullscan"
9540: 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
9550: 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 33 30  timatedCost = 30
9560: 30 30 30 30 30 2e 30 3b 0a 20 20 70 49 64 78 49  00000.0;.  pIdxI
9570: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
9580: 77 73 20 3d 20 31 30 30 30 30 30 3b 0a 20 20 72  ws = 100000;.  r
9590: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
95a0: 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 47 45 4f 50  .}.../* .** GEOP
95b0: 4f 4c 59 20 76 69 72 74 75 61 6c 20 74 61 62 6c  OLY virtual tabl
95c0: 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6c 75 6d 6e  e module xColumn
95d0: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
95e0: 69 63 20 69 6e 74 20 67 65 6f 70 6f 6c 79 43 6f  ic int geopolyCo
95f0: 6c 75 6d 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  lumn(sqlite3_vta
9600: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73  b_cursor *cur, s
9610: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9620: 63 74 78 2c 20 69 6e 74 20 69 29 7b 0a 20 20 52  ctx, int i){.  R
9630: 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28  tree *pRtree = (
9640: 52 74 72 65 65 20 2a 29 63 75 72 2d 3e 70 56 74  Rtree *)cur->pVt
9650: 61 62 3b 0a 20 20 52 74 72 65 65 43 75 72 73 6f  ab;.  RtreeCurso
9660: 72 20 2a 70 43 73 72 20 3d 20 28 52 74 72 65 65  r *pCsr = (Rtree
9670: 43 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20  Cursor *)cur;.  
9680: 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  RtreeSearchPoint
9690: 20 2a 70 20 3d 20 72 74 72 65 65 53 65 61 72 63   *p = rtreeSearc
96a0: 68 50 6f 69 6e 74 46 69 72 73 74 28 70 43 73 72  hPointFirst(pCsr
96b0: 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  );.  int rc = SQ
96c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65  LITE_OK;.  Rtree
96d0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 72 74  Node *pNode = rt
96e0: 72 65 65 4e 6f 64 65 4f 66 46 69 72 73 74 53 65  reeNodeOfFirstSe
96f0: 61 72 63 68 50 6f 69 6e 74 28 70 43 73 72 2c 20  archPoint(pCsr, 
9700: 26 72 63 29 3b 0a 0a 20 20 69 66 28 20 72 63 20  &rc);..  if( rc 
9710: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
9720: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
9730: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
9740: 28 20 69 3c 3d 70 52 74 72 65 65 2d 3e 6e 41 75  ( i<=pRtree->nAu
9750: 78 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 43  x ){.    if( !pC
9760: 73 72 2d 3e 62 41 75 78 56 61 6c 69 64 20 29 7b  sr->bAuxValid ){
9770: 0a 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d  .      if( pCsr-
9780: 3e 70 52 65 61 64 41 75 78 3d 3d 30 20 29 7b 0a  >pReadAux==0 ){.
9790: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
97a0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28  ite3_prepare_v3(
97b0: 70 52 74 72 65 65 2d 3e 64 62 2c 20 70 52 74 72  pRtree->db, pRtr
97c0: 65 65 2d 3e 7a 52 65 61 64 41 75 78 53 71 6c 2c  ee->zReadAuxSql,
97d0: 20 2d 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20   -1, 0,.        
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 20 20 20 20 20 20 26 70 43 73 72 2d 3e 70          &pCsr->p
9800: 52 65 61 64 41 75 78 2c 20 30 29 3b 0a 20 20 20  ReadAux, 0);.   
9810: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
9820: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
9830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
9840: 69 6e 64 5f 69 6e 74 36 34 28 70 43 73 72 2d 3e  ind_int64(pCsr->
9850: 70 52 65 61 64 41 75 78 2c 20 31 2c 20 0a 20 20  pReadAux, 1, .  
9860: 20 20 20 20 20 20 20 20 6e 6f 64 65 47 65 74 52          nodeGetR
9870: 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70 4e 6f  owid(pRtree, pNo
9880: 64 65 2c 20 70 2d 3e 69 43 65 6c 6c 29 29 3b 0a  de, p->iCell));.
9890: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
98a0: 65 33 5f 73 74 65 70 28 70 43 73 72 2d 3e 70 52  e3_step(pCsr->pR
98b0: 65 61 64 41 75 78 29 3b 0a 20 20 20 20 20 20 69  eadAux);.      i
98c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f  f( rc==SQLITE_RO
98d0: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 73  W ){.        pCs
98e0: 72 2d 3e 62 41 75 78 56 61 6c 69 64 20 3d 20 31  r->bAuxValid = 1
98f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9900: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
9910: 65 73 65 74 28 70 43 73 72 2d 3e 70 52 65 61 64  eset(pCsr->pRead
9920: 41 75 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Aux);.        if
9930: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
9940: 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  E ) rc = SQLITE_
9950: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  OK;.        retu
9960: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
9970: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9980: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74  _result_value(ct
9990: 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  x, sqlite3_colum
99a0: 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 52  n_value(pCsr->pR
99b0: 65 61 64 41 75 78 2c 20 69 2b 32 29 29 3b 0a 20  eadAux, i+2));. 
99c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
99d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
99e0: 20 54 68 65 20 78 55 70 64 61 74 65 20 6d 65 74   The xUpdate met
99f0: 68 6f 64 20 66 6f 72 20 47 45 4f 50 4f 4c 59 20  hod for GEOPOLY 
9a00: 6d 6f 64 75 6c 65 20 76 69 72 74 75 61 6c 20 74  module virtual t
9a10: 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ables..**.** For
9a20: 20 44 45 4c 45 54 45 3a 0a 2a 2a 0a 2a 2a 20 20   DELETE:.**.**  
9a30: 20 20 20 61 72 67 76 5b 30 5d 20 3d 20 74 68 65     argv[0] = the
9a40: 20 72 6f 77 69 64 20 74 6f 20 62 65 20 64 65 6c   rowid to be del
9a50: 65 74 65 64 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  eted.**.** For I
9a60: 4e 53 45 52 54 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  NSERT:.**.**    
9a70: 20 61 72 67 76 5b 30 5d 20 3d 20 53 51 4c 20 4e   argv[0] = SQL N
9a80: 55 4c 4c 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  ULL.**     argv[
9a90: 31 5d 20 3d 20 72 6f 77 69 64 20 74 6f 20 69 6e  1] = rowid to in
9aa0: 73 65 72 74 2c 20 6f 72 20 61 6e 20 53 51 4c 20  sert, or an SQL 
9ab0: 4e 55 4c 4c 20 74 6f 20 73 65 6c 65 63 74 20 61  NULL to select a
9ac0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20  utomatically.** 
9ad0: 20 20 20 20 61 72 67 76 5b 32 5d 20 3d 20 5f 73      argv[2] = _s
9ae0: 68 61 70 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20  hape column.**  
9af0: 20 20 20 61 72 67 76 5b 33 5d 20 3d 20 66 69 72     argv[3] = fir
9b00: 73 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64  st application-d
9b10: 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 2e 2e 2e  efined column...
9b20: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 55 50 44 41  ..**.** For UPDA
9b30: 54 45 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72  TE:.**.**     ar
9b40: 67 76 5b 30 5d 20 3d 20 72 6f 77 69 64 20 74 6f  gv[0] = rowid to
9b50: 20 6d 6f 64 69 66 79 2e 20 20 4e 65 76 65 72 20   modify.  Never 
9b60: 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 61 72 67 76  NULL.**     argv
9b70: 5b 31 5d 20 3d 20 72 6f 77 69 64 20 61 66 74 65  [1] = rowid afte
9b80: 72 20 74 68 65 20 63 68 61 6e 67 65 2e 20 20 4e  r the change.  N
9b90: 65 76 65 72 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20  ever NULL.**    
9ba0: 20 61 72 67 76 5b 32 5d 20 3d 20 6e 65 77 20 76   argv[2] = new v
9bb0: 61 6c 75 65 20 66 6f 72 20 5f 73 68 61 70 65 0a  alue for _shape.
9bc0: 2a 2a 20 20 20 20 20 61 72 67 76 5b 33 5d 20 3d  **     argv[3] =
9bd0: 20 6e 65 77 20 76 61 6c 75 65 20 66 6f 72 20 66   new value for f
9be0: 69 72 73 74 20 61 70 70 6c 69 63 61 74 69 6f 6e  irst application
9bf0: 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 2e  -defined column.
9c00: 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ....*/.static in
9c10: 74 20 67 65 6f 70 6f 6c 79 55 70 64 61 74 65 28  t geopolyUpdate(
9c20: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
9c30: 2a 70 56 74 61 62 2c 20 0a 20 20 69 6e 74 20 6e  *pVtab, .  int n
9c40: 44 61 74 61 2c 20 0a 20 20 73 71 6c 69 74 65 33  Data, .  sqlite3
9c50: 5f 76 61 6c 75 65 20 2a 2a 61 44 61 74 61 2c 20  _value **aData, 
9c60: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
9c70: 2a 70 52 6f 77 69 64 0a 29 7b 0a 20 20 52 74 72  *pRowid.){.  Rtr
9c80: 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74  ee *pRtree = (Rt
9c90: 72 65 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 69  ree *)pVtab;.  i
9ca0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
9cb0: 4b 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 63  K;.  RtreeCell c
9cc0: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
9cd0: 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
9ce0: 20 74 6f 20 69 6e 73 65 72 74 20 69 66 20 6e 44   to insert if nD
9cf0: 61 74 61 3e 31 20 2a 2f 0a 20 20 69 36 34 20 6f  ata>1 */.  i64 o
9d00: 6c 64 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20  ldRowid;        
9d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9d20: 65 20 6f 6c 64 20 72 6f 77 69 64 20 2a 2f 0a 20  e old rowid */. 
9d30: 20 69 6e 74 20 6f 6c 64 52 6f 77 69 64 56 61 6c   int oldRowidVal
9d40: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
9d50: 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6c 64 52   /* True if oldR
9d60: 6f 77 69 64 20 69 73 20 76 61 6c 69 64 20 2a 2f  owid is valid */
9d70: 0a 20 20 69 36 34 20 6e 65 77 52 6f 77 69 64 3b  .  i64 newRowid;
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f     /* The new ro
9da0: 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77  wid */.  int new
9db0: 52 6f 77 69 64 56 61 6c 69 64 3b 20 20 20 20 20  RowidValid;     
9dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9dd0: 20 69 66 20 6e 65 77 52 6f 77 69 64 20 69 73 20   if newRowid is 
9de0: 76 61 6c 69 64 20 2a 2f 0a 20 20 69 6e 74 20 63  valid */.  int c
9df0: 6f 6f 72 64 43 68 61 6e 67 65 20 3d 20 30 3b 20  oordChange = 0; 
9e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
9e10: 61 6e 67 65 20 69 6e 20 63 6f 6f 72 64 69 6e 61  ange in coordina
9e20: 74 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20 70 52  tes */..  if( pR
9e30: 74 72 65 65 2d 3e 6e 4e 6f 64 65 52 65 66 20 29  tree->nNodeRef )
9e40: 7b 0a 20 20 20 20 2f 2a 20 55 6e 61 62 6c 65 20  {.    /* Unable 
9e50: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
9e60: 62 74 72 65 65 20 77 68 69 6c 65 20 61 6e 6f 74  btree while anot
9e70: 68 65 72 20 63 75 72 73 6f 72 20 69 73 20 72 65  her cursor is re
9e80: 61 64 69 6e 67 20 66 72 6f 6d 20 69 74 2c 0a 20  ading from it,. 
9e90: 20 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20     ** since the 
9ea0: 77 72 69 74 65 20 6d 69 67 68 74 20 64 6f 20 61  write might do a
9eb0: 20 72 65 62 61 6c 61 6e 63 65 20 77 68 69 63 68   rebalance which
9ec0: 20 77 6f 75 6c 64 20 64 69 73 72 75 70 74 20 74   would disrupt t
9ed0: 68 65 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 63  he read.    ** c
9ee0: 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65  ursor. */.    re
9ef0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
9f00: 45 44 5f 56 54 41 42 3b 0a 20 20 7d 0a 20 20 72  ED_VTAB;.  }.  r
9f10: 74 72 65 65 52 65 66 65 72 65 6e 63 65 28 70 52  treeReference(pR
9f20: 74 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74 28  tree);.  assert(
9f30: 6e 44 61 74 61 3e 3d 31 29 3b 0a 0a 20 20 72 63  nData>=1);..  rc
9f40: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
9f50: 0a 20 20 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64  .  oldRowidValid
9f60: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
9f70: 5f 74 79 70 65 28 61 44 61 74 61 5b 30 5d 29 21  _type(aData[0])!
9f80: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 3b 0a 20  =SQLITE_NULL;;. 
9f90: 20 6f 6c 64 52 6f 77 69 64 20 3d 20 6f 6c 64 52   oldRowid = oldR
9fa0: 6f 77 69 64 56 61 6c 69 64 20 3f 20 73 71 6c 69  owidValid ? sqli
9fb0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
9fc0: 61 44 61 74 61 5b 30 5d 29 20 3a 20 30 3b 0a 20  aData[0]) : 0;. 
9fd0: 20 6e 65 77 52 6f 77 69 64 56 61 6c 69 64 20 3d   newRowidValid =
9fe0: 20 6e 44 61 74 61 3e 31 20 26 26 20 73 71 6c 69   nData>1 && sqli
9ff0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
a000: 44 61 74 61 5b 31 5d 29 21 3d 53 51 4c 49 54 45  Data[1])!=SQLITE
a010: 5f 4e 55 4c 4c 3b 0a 20 20 6e 65 77 52 6f 77 69  _NULL;.  newRowi
a020: 64 20 3d 20 6e 65 77 52 6f 77 69 64 56 61 6c 69  d = newRowidVali
a030: 64 20 3f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d ? sqlite3_valu
a040: 65 5f 69 6e 74 36 34 28 61 44 61 74 61 5b 31 5d  e_int64(aData[1]
a050: 29 20 3a 20 30 3b 0a 20 20 63 65 6c 6c 2e 69 52  ) : 0;.  cell.iR
a060: 6f 77 69 64 20 3d 20 6e 65 77 52 6f 77 69 64 3b  owid = newRowid;
a070: 0a 0a 20 20 69 66 28 20 6e 44 61 74 61 3e 31 20  ..  if( nData>1 
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 2f 2a 20 6e 6f 74 20 61 20 44 45 4c 45 54 45 20  /* not a DELETE 
a0b0: 2a 2f 0a 20 20 20 26 26 20 28 21 6f 6c 64 52 6f  */.   && (!oldRo
a0c0: 77 69 64 56 61 6c 69 64 20 20 20 20 20 20 20 20  widValid        
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 2f 2a 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20   /* INSERT */.  
a0f0: 20 20 20 20 20 20 7c 7c 20 21 73 71 6c 69 74 65        || !sqlite
a100: 33 5f 76 61 6c 75 65 5f 6e 6f 63 68 61 6e 67 65  3_value_nochange
a110: 28 61 44 61 74 61 5b 32 5d 29 20 20 2f 2a 20 55  (aData[2])  /* U
a120: 50 44 41 54 45 20 5f 73 68 61 70 65 20 2a 2f 0a  PDATE _shape */.
a130: 20 20 20 20 20 20 20 20 7c 7c 20 6f 6c 64 52 6f          || oldRo
a140: 77 69 64 21 3d 6e 65 77 52 6f 77 69 64 29 20 20  wid!=newRowid)  
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a160: 20 52 6f 77 69 64 20 63 68 61 6e 67 65 20 2a 2f   Rowid change */
a170: 0a 20 20 29 7b 0a 20 20 20 20 67 65 6f 70 6f 6c  .  ){.    geopol
a180: 79 42 42 6f 78 28 30 2c 20 61 44 61 74 61 5b 32  yBBox(0, aData[2
a190: 5d 2c 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 2c 20  ], cell.aCoord, 
a1a0: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
a1b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
a1c0: 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  ==SQLITE_ERROR )
a1d0: 7b 0a 20 20 20 20 20 20 20 20 70 56 74 61 62 2d  {.        pVtab-
a1e0: 3e 7a 45 72 72 4d 73 67 20 3d 0a 20 20 20 20 20  >zErrMsg =.     
a1f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
a200: 69 6e 74 66 28 22 5f 73 68 61 70 65 20 64 6f 65  intf("_shape doe
a210: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
a220: 76 61 6c 69 64 20 70 6f 6c 79 67 6f 6e 22 29 3b  valid polygon");
a230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
a240: 6f 74 6f 20 67 65 6f 70 6f 6c 79 5f 75 70 64 61  oto geopoly_upda
a250: 74 65 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  te_end;.    }.  
a260: 20 20 63 6f 6f 72 64 43 68 61 6e 67 65 20 3d 20    coordChange = 
a270: 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  1;..    /* If a 
a280: 72 6f 77 69 64 20 76 61 6c 75 65 20 77 61 73 20  rowid value was 
a290: 73 75 70 70 6c 69 65 64 2c 20 63 68 65 63 6b 20  supplied, check 
a2a0: 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
a2b0: 20 70 72 65 73 65 6e 74 20 69 6e 20 0a 20 20 20   present in .   
a2c0: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 20 49   ** the table. I
a2d0: 66 20 73 6f 2c 20 74 68 65 20 63 6f 6e 73 74 72  f so, the constr
a2e0: 61 69 6e 74 20 68 61 73 20 66 61 69 6c 65 64 2e  aint has failed.
a2f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 52   */.    if( newR
a300: 6f 77 69 64 56 61 6c 69 64 20 29 7b 0a 20 20 20  owidValid ){.   
a310: 20 20 20 69 6e 74 20 73 74 65 70 72 63 3b 0a 20     int steprc;. 
a320: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
a330: 64 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e  d_int64(pRtree->
a340: 70 52 65 61 64 52 6f 77 69 64 2c 20 31 2c 20 63  pReadRowid, 1, c
a350: 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20  ell.iRowid);.   
a360: 20 20 20 73 74 65 70 72 63 20 3d 20 73 71 6c 69     steprc = sqli
a370: 74 65 33 5f 73 74 65 70 28 70 52 74 72 65 65 2d  te3_step(pRtree-
a380: 3e 70 52 65 61 64 52 6f 77 69 64 29 3b 0a 20 20  >pReadRowid);.  
a390: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a3a0: 5f 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70  _reset(pRtree->p
a3b0: 52 65 61 64 52 6f 77 69 64 29 3b 0a 20 20 20 20  ReadRowid);.    
a3c0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
a3d0: 3d 3d 73 74 65 70 72 63 20 29 7b 0a 20 20 20 20  ==steprc ){.    
a3e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
a3f0: 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74  vtab_on_conflict
a400: 28 70 52 74 72 65 65 2d 3e 64 62 29 3d 3d 53 51  (pRtree->db)==SQ
a410: 4c 49 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a  LITE_REPLACE ){.
a420: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72            rc = r
a430: 74 72 65 65 44 65 6c 65 74 65 52 6f 77 69 64 28  treeDeleteRowid(
a440: 70 52 74 72 65 65 2c 20 63 65 6c 6c 2e 69 52 6f  pRtree, cell.iRo
a450: 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid);.        }e
a460: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
a470: 63 20 3d 20 72 74 72 65 65 43 6f 6e 73 74 72 61  c = rtreeConstra
a480: 69 6e 74 45 72 72 6f 72 28 70 52 74 72 65 65 2c  intError(pRtree,
a490: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
a4a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a4b0: 0a 0a 20 20 2f 2a 20 49 66 20 61 44 61 74 61 5b  ..  /* If aData[
a4c0: 30 5d 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c  0] is not an SQL
a4d0: 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 69 74 20   NULL value, it 
a4e0: 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  is the rowid of 
a4f0: 61 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 74 6f  a.  ** record to
a500: 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 74 68 65   delete from the
a510: 20 72 2d 74 72 65 65 20 74 61 62 6c 65 2e 20 54   r-tree table. T
a520: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
a530: 63 6b 20 64 6f 65 73 0a 20 20 2a 2a 20 6a 75 73  ck does.  ** jus
a540: 74 20 74 68 61 74 2e 0a 20 20 2a 2f 0a 20 20 69  t that..  */.  i
a550: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a560: 20 26 26 20 28 6e 44 61 74 61 3d 3d 31 20 7c 7c   && (nData==1 ||
a570: 20 28 63 6f 6f 72 64 43 68 61 6e 67 65 20 26 26   (coordChange &&
a580: 20 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64 29 29   oldRowidValid))
a590: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 74 72   ){.    rc = rtr
a5a0: 65 65 44 65 6c 65 74 65 52 6f 77 69 64 28 70 52  eeDeleteRowid(pR
a5b0: 74 72 65 65 2c 20 6f 6c 64 52 6f 77 69 64 29 3b  tree, oldRowid);
a5c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
a5d0: 65 20 61 44 61 74 61 5b 5d 20 61 72 72 61 79 20  e aData[] array 
a5e0: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
a5f0: 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 2c 20  an one element, 
a600: 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 28 61  elements.  ** (a
a610: 44 61 74 61 5b 32 5d 2e 2e 61 44 61 74 61 5b 61  Data[2]..aData[a
a620: 72 67 63 2d 31 5d 29 20 63 6f 6e 74 61 69 6e 20  rgc-1]) contain 
a630: 61 20 6e 65 77 20 72 65 63 6f 72 64 20 74 6f 20  a new record to 
a640: 69 6e 73 65 72 74 20 69 6e 74 6f 0a 20 20 2a 2a  insert into.  **
a650: 20 74 68 65 20 72 2d 74 72 65 65 20 73 74 72 75   the r-tree stru
a660: 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cture..  */.  if
a670: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a680: 26 26 20 6e 44 61 74 61 3e 31 20 26 26 20 63 6f  && nData>1 && co
a690: 6f 72 64 43 68 61 6e 67 65 20 29 7b 0a 20 20 20  ordChange ){.   
a6a0: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
a6b0: 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
a6c0: 68 65 20 72 2d 74 72 65 65 20 2a 2f 0a 20 20 20  he r-tree */.   
a6d0: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65 61   RtreeNode *pLea
a6e0: 66 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  f = 0;.    if( !
a6f0: 6e 65 77 52 6f 77 69 64 56 61 6c 69 64 20 29 7b  newRowidValid ){
a700: 0a 20 20 20 20 20 20 72 63 20 3d 20 72 74 72 65  .      rc = rtre
a710: 65 4e 65 77 52 6f 77 69 64 28 70 52 74 72 65 65  eNewRowid(pRtree
a720: 2c 20 26 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b  , &cell.iRowid);
a730: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 6f 77  .    }.    *pRow
a740: 69 64 20 3d 20 63 65 6c 6c 2e 69 52 6f 77 69 64  id = cell.iRowid
a750: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
a760: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a770: 20 72 63 20 3d 20 43 68 6f 6f 73 65 4c 65 61 66   rc = ChooseLeaf
a780: 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c 20  (pRtree, &cell, 
a790: 30 2c 20 26 70 4c 65 61 66 29 3b 0a 20 20 20 20  0, &pLeaf);.    
a7a0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
a7b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a7c0: 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20   int rc2;.      
a7d0: 70 52 74 72 65 65 2d 3e 69 52 65 69 6e 73 65 72  pRtree->iReinser
a7e0: 74 48 65 69 67 68 74 20 3d 20 2d 31 3b 0a 20 20  tHeight = -1;.  
a7f0: 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 49 6e      rc = rtreeIn
a800: 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65 2c  sertCell(pRtree,
a810: 20 70 4c 65 61 66 2c 20 26 63 65 6c 6c 2c 20 30   pLeaf, &cell, 0
a820: 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 6e  );.      rc2 = n
a830: 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65  odeRelease(pRtre
a840: 65 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  e, pLeaf);.     
a850: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
a860: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
a870: 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a   = rc2;.      }.
a880: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a890: 43 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 20  Change the data 
a8a0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
a8b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
a8c0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 20  lite3_stmt *pUp 
a8d0: 3d 20 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65  = pRtree->pWrite
a8e0: 41 75 78 3b 0a 20 20 20 20 69 6e 74 20 6a 6a 3b  Aux;.    int jj;
a8f0: 0a 20 20 20 20 69 6e 74 20 6e 43 68 61 6e 67 65  .    int nChange
a900: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
a910: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 55 70  3_bind_int64(pUp
a920: 2c 20 31 2c 20 63 65 6c 6c 2e 69 52 6f 77 69 64  , 1, cell.iRowid
a930: 29 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  );.    for(jj=0;
a940: 20 6a 6a 3c 70 52 74 72 65 65 2d 3e 6e 41 75 78   jj<pRtree->nAux
a950: 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; jj++){.      i
a960: 66 28 20 21 73 71 6c 69 74 65 33 5f 76 61 6c 75  f( !sqlite3_valu
a970: 65 5f 6e 6f 63 68 61 6e 67 65 28 61 44 61 74 61  e_nochange(aData
a980: 5b 6a 6a 2b 32 5d 29 20 29 20 6e 43 68 61 6e 67  [jj+2]) ) nChang
a990: 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e++;.      sqlit
a9a0: 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 55  e3_bind_value(pU
a9b0: 70 2c 20 6a 6a 2b 32 2c 20 61 44 61 74 61 5b 6a  p, jj+2, aData[j
a9c0: 6a 2b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  j+2]);.    }.   
a9d0: 20 69 66 28 20 6e 43 68 61 6e 67 65 20 29 7b 0a   if( nChange ){.
a9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
a9f0: 65 70 28 70 55 70 29 3b 0a 20 20 20 20 20 20 72  ep(pUp);.      r
aa00: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
aa10: 74 28 70 55 70 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pUp);.    }.  
aa20: 7d 0a 0a 67 65 6f 70 6f 6c 79 5f 75 70 64 61 74  }..geopoly_updat
aa30: 65 5f 65 6e 64 3a 0a 20 20 72 74 72 65 65 52 65  e_end:.  rtreeRe
aa40: 6c 65 61 73 65 28 70 52 74 72 65 65 29 3b 0a 20  lease(pRtree);. 
aa50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
aa60: 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 61 74  *.** Report that
aa70: 20 67 65 6f 70 6f 6c 79 5f 6f 76 65 72 6c 61 70   geopoly_overlap
aa80: 28 29 20 69 73 20 61 6e 20 6f 76 65 72 6c 6f 61  () is an overloa
aa90: 64 65 64 20 66 75 6e 63 74 69 6f 6e 20 73 75 69  ded function sui
aaa0: 74 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 75 73 65  table.** for use
aab0: 20 69 6e 20 78 42 65 73 74 49 6e 64 65 78 2e 0a   in xBestIndex..
aac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
aad0: 6f 70 6f 6c 79 46 69 6e 64 46 75 6e 63 74 69 6f  opolyFindFunctio
aae0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  n(.  sqlite3_vta
aaf0: 62 20 2a 70 56 74 61 62 2c 0a 20 20 69 6e 74 20  b *pVtab,.  int 
ab00: 6e 41 72 67 2c 0a 20 20 63 6f 6e 73 74 20 63 68  nArg,.  const ch
ab10: 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 76 6f 69  ar *zName,.  voi
ab20: 64 20 28 2a 2a 70 78 46 75 6e 63 29 28 73 71 6c  d (**pxFunc)(sql
ab30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
ab40: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
ab50: 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 2a 70 70 41  *),.  void **ppA
ab60: 72 67 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  rg.){.  if( sqli
ab70: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d  te3_stricmp(zNam
ab80: 65 2c 20 22 67 65 6f 70 6f 6c 79 5f 6f 76 65 72  e, "geopoly_over
ab90: 6c 61 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lap")==0 ){.    
aba0: 2a 70 78 46 75 6e 63 20 3d 20 67 65 6f 70 6f 6c  *pxFunc = geopol
abb0: 79 4f 76 65 72 6c 61 70 46 75 6e 63 3b 0a 20 20  yOverlapFunc;.  
abc0: 20 20 2a 70 70 41 72 67 20 3d 20 30 3b 0a 20 20    *ppArg = 0;.  
abd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
abe0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
abf0: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 7d 0a 20  _FUNCTION;.  }. 
ac00: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
ac10: 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 67 65 6f  icmp(zName, "geo
ac20: 70 6f 6c 79 5f 77 69 74 68 69 6e 22 29 3d 3d 30  poly_within")==0
ac30: 20 29 7b 0a 20 20 20 20 2a 70 78 46 75 6e 63 20   ){.    *pxFunc 
ac40: 3d 20 67 65 6f 70 6f 6c 79 57 69 74 68 69 6e 46  = geopolyWithinF
ac50: 75 6e 63 3b 0a 20 20 20 20 2a 70 70 41 72 67 20  unc;.    *ppArg 
ac60: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
ac70: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
ac80: 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e  STRAINT_FUNCTION
ac90: 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +1;.  }.  return
aca0: 20 30 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 73   0;.}...static s
acb0: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 67 65  qlite3_module ge
acc0: 6f 70 6f 6c 79 4d 6f 64 75 6c 65 20 3d 20 7b 0a  opolyModule = {.
acd0: 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
acf0: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 67   iVersion */.  g
ad00: 65 6f 70 6f 6c 79 43 72 65 61 74 65 2c 20 20 20  eopolyCreate,   
ad10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
ad20: 72 65 61 74 65 20 2d 20 63 72 65 61 74 65 20 61  reate - create a
ad30: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 67 65 6f 70   table */.  geop
ad40: 6f 6c 79 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20  olyConnect,     
ad50: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e          /* xConn
ad60: 65 63 74 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f  ect - connect to
ad70: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
ad80: 6c 65 20 2a 2f 0a 20 20 67 65 6f 70 6f 6c 79 42  le */.  geopolyB
ad90: 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20  estIndex,       
ada0: 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65      /* xBestInde
adb0: 78 20 2d 20 44 65 74 65 72 6d 69 6e 65 20 73 65  x - Determine se
adc0: 61 72 63 68 20 73 74 72 61 74 65 67 79 20 2a 2f  arch strategy */
add0: 0a 20 20 72 74 72 65 65 44 69 73 63 6f 6e 6e 65  .  rtreeDisconne
ade0: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct,            /
adf0: 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20  * xDisconnect - 
ae00: 44 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20  Disconnect from 
ae10: 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72  a table */.  rtr
ae20: 65 65 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20  eeDestroy,      
ae30: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73           /* xDes
ae40: 74 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74 61  troy - Drop a ta
ae50: 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65 4f 70  ble */.  rtreeOp
ae60: 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
ae70: 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
ae80: 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
ae90: 0a 20 20 72 74 72 65 65 43 6c 6f 73 65 2c 20 20  .  rtreeClose,  
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aeb0: 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65  * xClose - close
aec0: 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 67   a cursor */.  g
aed0: 65 6f 70 6f 6c 79 46 69 6c 74 65 72 2c 20 20 20  eopolyFilter,   
aee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
aef0: 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
af00: 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
af10: 74 73 20 2a 2f 0a 20 20 72 74 72 65 65 4e 65 78  ts */.  rtreeNex
af20: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
af30: 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61      /* xNext - a
af40: 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20  dvance a cursor 
af50: 2a 2f 0a 20 20 72 74 72 65 65 45 6f 66 2c 20 20  */.  rtreeEof,  
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 67 65   /* xEof */.  ge
af80: 6f 70 6f 6c 79 43 6f 6c 75 6d 6e 2c 20 20 20 20  opolyColumn,    
af90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
afa0: 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61  lumn - read data
afb0: 20 2a 2f 0a 20 20 72 74 72 65 65 52 6f 77 69 64   */.  rtreeRowid
afc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
afd0: 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65    /* xRowid - re
afe0: 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 67 65 6f  ad data */.  geo
aff0: 70 6f 6c 79 55 70 64 61 74 65 2c 20 20 20 20 20  polyUpdate,     
b000: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64           /* xUpd
b010: 61 74 65 20 2d 20 77 72 69 74 65 20 64 61 74 61  ate - write data
b020: 20 2a 2f 0a 20 20 72 74 72 65 65 42 65 67 69 6e   */.  rtreeBegin
b030: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
b040: 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20 62 65    /* xBegin - be
b050: 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
b060: 2a 2f 0a 20 20 72 74 72 65 65 45 6e 64 54 72 61  */.  rtreeEndTra
b070: 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 20 20  nsaction,       
b080: 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73 79 6e 63   /* xSync - sync
b090: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
b0a0: 20 20 72 74 72 65 65 45 6e 64 54 72 61 6e 73 61    rtreeEndTransa
b0b0: 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 2f 2a  ction,        /*
b0c0: 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f 6d 6d 69   xCommit - commi
b0d0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  t transaction */
b0e0: 0a 20 20 72 74 72 65 65 45 6e 64 54 72 61 6e 73  .  rtreeEndTrans
b0f0: 61 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 2f  action,        /
b100: 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f  * xRollback - ro
b110: 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69  llback transacti
b120: 6f 6e 20 2a 2f 0a 20 20 67 65 6f 70 6f 6c 79 46  on */.  geopolyF
b130: 69 6e 64 46 75 6e 63 74 69 6f 6e 2c 20 20 20 20  indFunction,    
b140: 20 20 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63      /* xFindFunc
b150: 74 69 6f 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20  tion - function 
b160: 6f 76 65 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20  overloading */. 
b170: 20 72 74 72 65 65 52 65 6e 61 6d 65 2c 20 20 20   rtreeRename,   
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b190: 78 52 65 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65  xRename - rename
b1a0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
b1b0: 72 74 72 65 65 53 61 76 65 70 6f 69 6e 74 2c 20  rtreeSavepoint, 
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
b1d0: 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30  Savepoint */.  0
b1e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b1f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
b200: 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 2c 20 20  elease */.  0,  
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
b230: 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 73 74  backTo */.};..st
b240: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
b250: 5f 67 65 6f 70 6f 6c 79 5f 69 6e 69 74 28 73 71  _geopoly_init(sq
b260: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
b270: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b280: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
b290: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 76 6f   struct {.    vo
b2a0: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
b2b0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
b2c0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
b2d0: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  );.    int nArg;
b2e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
b2f0: 2a 7a 4e 61 6d 65 3b 0a 20 20 7d 20 61 46 75 6e  *zName;.  } aFun
b300: 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 67  c[] = {.     { g
b310: 65 6f 70 6f 6c 79 41 72 65 61 46 75 6e 63 2c 20  eopolyAreaFunc, 
b320: 20 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 22           1,    "
b330: 67 65 6f 70 6f 6c 79 5f 61 72 65 61 22 20 20 20  geopoly_area"   
b340: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
b350: 20 20 7b 20 67 65 6f 70 6f 6c 79 42 6c 6f 62 46    { geopolyBlobF
b360: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 31 2c  unc,          1,
b370: 20 20 20 20 22 67 65 6f 70 6f 6c 79 5f 62 6c 6f      "geopoly_blo
b380: 62 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  b"             }
b390: 2c 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79  ,.     { geopoly
b3a0: 4a 73 6f 6e 46 75 6e 63 2c 20 20 20 20 20 20 20  JsonFunc,       
b3b0: 20 20 20 31 2c 20 20 20 20 22 67 65 6f 70 6f 6c     1,    "geopol
b3c0: 79 5f 6a 73 6f 6e 22 20 20 20 20 20 20 20 20 20  y_json"         
b3d0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67 65      },.     { ge
b3e0: 6f 70 6f 6c 79 53 76 67 46 75 6e 63 2c 20 20 20  opolySvgFunc,   
b3f0: 20 20 20 20 20 20 20 2d 31 2c 20 20 20 20 22 67         -1,    "g
b400: 65 6f 70 6f 6c 79 5f 73 76 67 22 20 20 20 20 20  eopoly_svg"     
b410: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
b420: 20 7b 20 67 65 6f 70 6f 6c 79 57 69 74 68 69 6e   { geopolyWithin
b430: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 32 2c 20  Func,        2, 
b440: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 77 69 74 68     "geopoly_with
b450: 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  in"           },
b460: 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 43  .     { geopolyC
b470: 6f 6e 74 61 69 6e 73 50 6f 69 6e 74 46 75 6e 63  ontainsPointFunc
b480: 2c 20 33 2c 20 20 20 20 22 67 65 6f 70 6f 6c 79  , 3,    "geopoly
b490: 5f 63 6f 6e 74 61 69 6e 73 5f 70 6f 69 6e 74 22  _contains_point"
b4a0: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67 65 6f     },.     { geo
b4b0: 70 6f 6c 79 4f 76 65 72 6c 61 70 46 75 6e 63 2c  polyOverlapFunc,
b4c0: 20 20 20 20 20 20 20 32 2c 20 20 20 20 22 67 65         2,    "ge
b4d0: 6f 70 6f 6c 79 5f 6f 76 65 72 6c 61 70 22 20 20  opoly_overlap"  
b4e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
b4f0: 7b 20 67 65 6f 70 6f 6c 79 44 65 62 75 67 46 75  { geopolyDebugFu
b500: 6e 63 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20  nc,         1,  
b510: 20 20 22 67 65 6f 70 6f 6c 79 5f 64 65 62 75 67    "geopoly_debug
b520: 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  "            },.
b530: 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 42 42       { geopolyBB
b540: 6f 78 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  oxFunc,         
b550: 20 31 2c 20 20 20 20 22 67 65 6f 70 6f 6c 79 5f   1,    "geopoly_
b560: 62 62 6f 78 22 20 20 20 20 20 20 20 20 20 20 20  bbox"           
b570: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67 65 6f 70    },.     { geop
b580: 6f 6c 79 58 66 6f 72 6d 46 75 6e 63 2c 20 20 20  olyXformFunc,   
b590: 20 20 20 20 20 20 37 2c 20 20 20 20 22 67 65 6f        7,    "geo
b5a0: 70 6f 6c 79 5f 78 66 6f 72 6d 22 20 20 20 20 20  poly_xform"     
b5b0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20         },.  };. 
b5c0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
b5d0: 72 75 63 74 20 7b 0a 20 20 20 20 76 6f 69 64 20  ruct {.    void 
b5e0: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
b5f0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
b600: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a  lite3_value**);.
b610: 20 20 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61      void (*xFina
b620: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
b630: 78 74 2a 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  xt*);.    const 
b640: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 7d  char *zName;.  }
b650: 20 61 41 67 67 5b 5d 20 3d 20 7b 0a 20 20 20 20   aAgg[] = {.    
b660: 20 7b 20 67 65 6f 70 6f 6c 79 42 42 6f 78 53 74   { geopolyBBoxSt
b670: 65 70 2c 20 67 65 6f 70 6f 6c 79 42 42 6f 78 46  ep, geopolyBBoxF
b680: 69 6e 61 6c 2c 20 22 67 65 6f 70 6f 6c 79 5f 67  inal, "geopoly_g
b690: 72 6f 75 70 5f 62 62 6f 78 22 20 20 20 20 7d 2c  roup_bbox"    },
b6a0: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
b6b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
b6c0: 6f 66 28 61 46 75 6e 63 29 2f 73 69 7a 65 6f 66  of(aFunc)/sizeof
b6d0: 28 61 46 75 6e 63 5b 30 5d 29 20 26 26 20 72 63  (aFunc[0]) && rc
b6e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
b6f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
b700: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
b710: 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 5b 69 5d  ion(db, aFunc[i]
b720: 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 5b 69 5d  .zName, aFunc[i]
b730: 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20  .nArg,.         
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55          SQLITE_U
b760: 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b780: 20 20 20 20 20 20 20 20 20 61 46 75 6e 63 5b 69           aFunc[i
b790: 5d 2e 78 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ].xFunc, 0, 0);.
b7a0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
b7b0: 3c 73 69 7a 65 6f 66 28 61 41 67 67 29 2f 73 69  <sizeof(aAgg)/si
b7c0: 7a 65 6f 66 28 61 41 67 67 5b 30 5d 29 20 26 26  zeof(aAgg[0]) &&
b7d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
b7e0: 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  i++){.    rc = s
b7f0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
b800: 6e 63 74 69 6f 6e 28 64 62 2c 20 61 41 67 67 5b  nction(db, aAgg[
b810: 69 5d 2e 7a 4e 61 6d 65 2c 20 31 2c 20 53 51 4c  i].zName, 1, SQL
b820: 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
b850: 20 61 41 67 67 5b 69 5d 2e 78 53 74 65 70 2c 20   aAgg[i].xStep, 
b860: 61 41 67 67 5b 69 5d 2e 78 46 69 6e 61 6c 29 3b  aAgg[i].xFinal);
b870: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
b880: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b890: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
b8a0: 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 64 62  ate_module_v2(db
b8b0: 2c 20 22 67 65 6f 70 6f 6c 79 22 2c 20 26 67 65  , "geopoly", &ge
b8c0: 6f 70 6f 6c 79 4d 6f 64 75 6c 65 2c 20 30 2c 20  opolyModule, 0, 
b8d0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
b8e0: 20 72 63 3b 0a 7d 0a                              rc;.}.