/ Hex Artifact Content
Login

Artifact 8c175a1c1e9c8659533a28c9aabf5ec1315e598b56129707ffe87567fcc475b8:


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 6f 6e 73 74 20 75 6e 73  al){.  const uns
13b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20  igned char *z = 
13c0: 70 2d 3e 7a 3b 0a 20 20 63 68 61 72 20 63 20 3d  p->z;.  char c =
13d0: 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70 61 63   geopolySkipSpac
13e0: 65 28 70 29 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  e(p);.  int j;. 
13f0: 20 69 6e 74 20 73 65 65 6e 44 50 20 3d 20 30 3b   int seenDP = 0;
1400: 0a 20 20 69 6e 74 20 73 65 65 6e 45 20 3d 20 30  .  int seenE = 0
1410: 3b 0a 20 20 61 73 73 65 72 74 28 20 27 2d 27 20  ;.  assert( '-' 
1420: 3c 20 27 30 27 20 29 3b 0a 20 20 69 66 28 20 63  < '0' );.  if( c
1430: 3c 3d 27 30 27 20 29 7b 0a 20 20 20 20 6a 20 3d  <='0' ){.    j =
1440: 20 63 3d 3d 27 2d 27 3b 0a 20 20 20 20 69 66 28   c=='-';.    if(
1450: 20 7a 5b 6a 5d 3d 3d 27 30 27 20 26 26 20 7a 5b   z[j]=='0' && z[
1460: 6a 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 6a  j+1]>='0' && z[j
1470: 2b 31 5d 3c 3d 27 39 27 20 29 20 72 65 74 75 72  +1]<='9' ) retur
1480: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20 31  n 0;.  }.  j = 1
1490: 3b 0a 20 20 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b  ;.  for(;; j++){
14a0: 0a 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20  .    c = z[j];. 
14b0: 20 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26     if( c>='0' &&
14c0: 20 63 3c 3d 27 39 27 20 29 20 63 6f 6e 74 69 6e   c<='9' ) contin
14d0: 75 65 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  ue;.    if( c=='
14e0: 2e 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  .' ){.      if( 
14f0: 7a 5b 6a 2d 31 5d 3d 3d 27 2d 27 20 29 20 72 65  z[j-1]=='-' ) re
1500: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66  turn 0;.      if
1510: 28 20 73 65 65 6e 44 50 20 29 20 72 65 74 75 72  ( seenDP ) retur
1520: 6e 20 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 44  n 0;.      seenD
1530: 50 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  P = 1;.      con
1540: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1550: 20 69 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20 63   if( c=='e' || c
1560: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 20 20 69  =='E' ){.      i
1570: 66 28 20 7a 5b 6a 2d 31 5d 3c 27 30 27 20 29 20  f( z[j-1]<'0' ) 
1580: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1590: 69 66 28 20 73 65 65 6e 45 20 29 20 72 65 74 75  if( seenE ) retu
15a0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 73 65 65  rn -1;.      see
15b0: 6e 44 50 20 3d 20 73 65 65 6e 45 20 3d 20 31 3b  nDP = seenE = 1;
15c0: 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a 2b 31  .      c = z[j+1
15d0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ];.      if( c==
15e0: 27 2b 27 20 7c 7c 20 63 3d 3d 27 2d 27 20 29 7b  '+' || c=='-' ){
15f0: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
1600: 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a 2b 31 5d        c = z[j+1]
1610: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1620: 69 66 28 20 63 3c 27 30 27 20 7c 7c 20 63 3e 27  if( c<'0' || c>'
1630: 39 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  9' ) return 0;. 
1640: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1650: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
1660: 20 20 7d 0a 20 20 69 66 28 20 7a 5b 6a 2d 31 5d    }.  if( z[j-1]
1670: 3c 27 30 27 20 29 20 72 65 74 75 72 6e 20 30 3b  <'0' ) return 0;
1680: 0a 20 20 69 66 28 20 70 56 61 6c 20 29 20 2a 70  .  if( pVal ) *p
1690: 56 61 6c 20 3d 20 61 74 6f 66 28 28 63 6f 6e 73  Val = atof((cons
16a0: 74 20 63 68 61 72 2a 29 70 2d 3e 7a 29 3b 0a 20  t char*)p->z);. 
16b0: 20 70 2d 3e 7a 20 2b 3d 20 6a 3b 0a 20 20 72 65   p->z += j;.  re
16c0: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
16d0: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73   If the input is
16e0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a   a well-formed J
16f0: 53 4f 4e 20 61 72 72 61 79 20 6f 66 20 63 6f 6f  SON array of coo
1700: 72 64 69 6e 61 74 65 73 2c 20 77 68 65 72 65 20  rdinates, where 
1710: 65 61 63 68 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61  each.** coordina
1720: 74 65 20 69 73 20 69 74 73 65 6c 66 20 61 20 74  te is itself a t
1730: 77 6f 2d 76 61 6c 75 65 20 61 72 72 61 79 2c 20  wo-value array, 
1740: 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 65  then convert the
1750: 20 4a 53 4f 4e 20 69 6e 74 6f 0a 2a 2a 20 61 20   JSON into.** a 
1760: 47 65 6f 50 6f 6c 79 20 6f 62 6a 65 63 74 20 61  GeoPoly object a
1770: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
1780: 74 65 72 20 74 6f 20 74 68 61 74 20 6f 62 6a 65  ter to that obje
1790: 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ct..**.** If any
17a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
17b0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
17c0: 74 61 74 69 63 20 47 65 6f 50 6f 6c 79 20 2a 67  tatic GeoPoly *g
17d0: 65 6f 70 6f 6c 79 50 61 72 73 65 4a 73 6f 6e 28  eopolyParseJson(
17e0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
17f0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 52 63  har *z, int *pRc
1800: 29 7b 0a 20 20 47 65 6f 50 61 72 73 65 20 73 3b  ){.  GeoParse s;
1810: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1820: 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
1830: 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 29  &s, 0, sizeof(s)
1840: 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 3b 0a 20 20  );.  s.z = z;.  
1850: 69 66 28 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53  if( geopolySkipS
1860: 70 61 63 65 28 26 73 29 3d 3d 27 5b 27 20 29 7b  pace(&s)=='[' ){
1870: 0a 20 20 20 20 73 2e 7a 2b 2b 3b 0a 20 20 20 20  .    s.z++;.    
1880: 77 68 69 6c 65 28 20 67 65 6f 70 6f 6c 79 53 6b  while( geopolySk
1890: 69 70 53 70 61 63 65 28 26 73 29 3d 3d 27 5b 27  ipSpace(&s)=='['
18a0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
18b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
18c0: 20 63 3b 0a 20 20 20 20 20 20 73 2e 7a 2b 2b 3b   c;.      s.z++;
18d0: 0a 20 20 20 20 20 20 69 66 28 20 73 2e 6e 56 65  .      if( s.nVe
18e0: 72 74 65 78 3c 3d 73 2e 6e 41 6c 6c 6f 63 20 29  rtex<=s.nAlloc )
18f0: 7b 0a 20 20 20 20 20 20 20 20 47 65 6f 43 6f 6f  {.        GeoCoo
1900: 72 64 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20  rd *aNew;.      
1910: 20 20 73 2e 6e 41 6c 6c 6f 63 20 3d 20 73 2e 6e    s.nAlloc = s.n
1920: 41 6c 6c 6f 63 2a 32 20 2b 20 31 36 3b 0a 20 20  Alloc*2 + 16;.  
1930: 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c        aNew = sql
1940: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 73  ite3_realloc64(s
1950: 2e 61 2c 20 73 2e 6e 41 6c 6c 6f 63 2a 73 69 7a  .a, s.nAlloc*siz
1960: 65 6f 66 28 47 65 6f 43 6f 6f 72 64 29 2a 32 20  eof(GeoCoord)*2 
1970: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
1980: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1990: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
19b0: 20 73 2e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20   s.nErr++;.     
19c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 2e      }.        s.
19e0: 61 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  a = aNew;.      
19f0: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 67  }.      while( g
1a00: 65 6f 70 6f 6c 79 50 61 72 73 65 4e 75 6d 62 65  eopolyParseNumbe
1a10: 72 28 26 73 2c 20 69 69 3c 3d 31 20 3f 20 26 73  r(&s, ii<=1 ? &s
1a20: 2e 61 5b 73 2e 6e 56 65 72 74 65 78 2a 32 2b 69  .a[s.nVertex*2+i
1a30: 69 5d 20 3a 20 30 29 20 29 7b 0a 20 20 20 20 20  i] : 0) ){.     
1a40: 20 20 20 69 69 2b 2b 3b 0a 20 20 20 20 20 20 20     ii++;.       
1a50: 20 69 66 28 20 69 69 3d 3d 32 20 29 20 73 2e 6e   if( ii==2 ) s.n
1a60: 56 65 72 74 65 78 2b 2b 3b 0a 20 20 20 20 20 20  Vertex++;.      
1a70: 20 20 63 20 3d 20 67 65 6f 70 6f 6c 79 53 6b 69    c = geopolySki
1a80: 70 53 70 61 63 65 28 26 73 29 3b 0a 20 20 20 20  pSpace(&s);.    
1a90: 20 20 20 20 73 2e 7a 2b 2b 3b 0a 20 20 20 20 20      s.z++;.     
1aa0: 20 20 20 69 66 28 20 63 3d 3d 27 2c 27 20 29 20     if( c==',' ) 
1ab0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1ac0: 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 62    if( c==']' ) b
1ad0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 2e  reak;.        s.
1ae0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
1af0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1b00: 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  R;.        goto 
1b10: 70 61 72 73 65 5f 6a 73 6f 6e 5f 65 72 72 3b 0a  parse_json_err;.
1b20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b30: 28 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70 61  ( geopolySkipSpa
1b40: 63 65 28 26 73 29 3d 3d 27 2c 27 20 29 7b 0a 20  ce(&s)==',' ){. 
1b50: 20 20 20 20 20 20 20 73 2e 7a 2b 2b 3b 0a 20 20         s.z++;.  
1b60: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1b80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
1b90: 66 28 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70  f( geopolySkipSp
1ba0: 61 63 65 28 26 73 29 3d 3d 27 5d 27 20 26 26 20  ace(&s)==']' && 
1bb0: 73 2e 6e 56 65 72 74 65 78 3e 3d 34 20 29 7b 0a  s.nVertex>=4 ){.
1bc0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b        int nByte;
1bd0: 0a 20 20 20 20 20 20 47 65 6f 50 6f 6c 79 20 2a  .      GeoPoly *
1be0: 70 4f 75 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  pOut;.      int 
1bf0: 78 20 3d 20 28 73 2e 6e 56 65 72 74 65 78 2d 31  x = (s.nVertex-1
1c00: 29 2a 32 3b 0a 20 20 20 20 20 20 69 66 28 20 73  )*2;.      if( s
1c10: 2e 61 5b 78 5d 3d 3d 73 2e 61 5b 30 5d 20 26 26  .a[x]==s.a[0] &&
1c20: 20 73 2e 61 5b 78 2b 31 5d 3d 3d 73 2e 61 5b 31   s.a[x+1]==s.a[1
1c30: 5d 20 29 20 73 2e 6e 56 65 72 74 65 78 2d 2d 3b  ] ) s.nVertex--;
1c40: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73  .      nByte = s
1c50: 69 7a 65 6f 66 28 47 65 6f 50 6f 6c 79 29 20 2a  izeof(GeoPoly) *
1c60: 20 28 73 2e 6e 56 65 72 74 65 78 2d 31 29 2a 32   (s.nVertex-1)*2
1c70: 2a 73 69 7a 65 6f 66 28 47 65 6f 43 6f 6f 72 64  *sizeof(GeoCoord
1c80: 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20  );.      pOut = 
1c90: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1ca0: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 20  ( nByte );.     
1cb0: 20 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66   x = 1;.      if
1cc0: 28 20 70 4f 75 74 3d 3d 30 20 29 20 67 6f 74 6f  ( pOut==0 ) goto
1cd0: 20 70 61 72 73 65 5f 6a 73 6f 6e 5f 65 72 72 3b   parse_json_err;
1ce0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e 56 65  .      pOut->nVe
1cf0: 72 74 65 78 20 3d 20 73 2e 6e 56 65 72 74 65 78  rtex = s.nVertex
1d00: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
1d10: 4f 75 74 2d 3e 61 2c 20 73 2e 61 2c 20 73 2e 6e  Out->a, s.a, s.n
1d20: 56 65 72 74 65 78 2a 32 2a 73 69 7a 65 6f 66 28  Vertex*2*sizeof(
1d30: 47 65 6f 43 6f 6f 72 64 29 29 3b 0a 20 20 20 20  GeoCoord));.    
1d40: 20 20 70 4f 75 74 2d 3e 68 64 72 5b 30 5d 20 3d    pOut->hdr[0] =
1d50: 20 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   *(unsigned char
1d60: 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4f 75 74  *)&x;.      pOut
1d70: 2d 3e 68 64 72 5b 31 5d 20 3d 20 28 73 2e 6e 56  ->hdr[1] = (s.nV
1d80: 65 72 74 65 78 3e 3e 31 36 29 26 30 78 66 66 3b  ertex>>16)&0xff;
1d90: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 68 64 72  .      pOut->hdr
1da0: 5b 32 5d 20 3d 20 28 73 2e 6e 56 65 72 74 65 78  [2] = (s.nVertex
1db0: 3e 3e 38 29 26 30 78 66 66 3b 0a 20 20 20 20 20  >>8)&0xff;.     
1dc0: 20 70 4f 75 74 2d 3e 68 64 72 5b 33 5d 20 3d 20   pOut->hdr[3] = 
1dd0: 73 2e 6e 56 65 72 74 65 78 26 30 78 66 66 3b 0a  s.nVertex&0xff;.
1de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1df0: 65 65 28 73 2e 61 29 3b 0a 20 20 20 20 20 20 69  ee(s.a);.      i
1e00: 66 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20  f( pRc ) *pRc = 
1e10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1e20: 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20   return pOut;.  
1e30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1e40: 2e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  .nErr++;.      r
1e50: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1e60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 70 61 72 73  ;.    }.  }.pars
1e70: 65 5f 6a 73 6f 6e 5f 65 72 72 3a 0a 20 20 69 66  e_json_err:.  if
1e80: 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20 72  ( pRc ) *pRc = r
1e90: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  c;.  sqlite3_fre
1ea0: 65 28 73 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e  e(s.a);.  return
1eb0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   0;.}../*.** Giv
1ec0: 65 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 61  en a function pa
1ed0: 72 61 6d 65 74 65 72 2c 20 74 72 79 20 74 6f 20  rameter, try to 
1ee0: 69 6e 74 65 72 70 72 65 74 20 69 74 20 61 73 20  interpret it as 
1ef0: 61 20 70 6f 6c 79 67 6f 6e 2c 20 65 69 74 68 65  a polygon, eithe
1f00: 72 0a 2a 2a 20 69 6e 20 74 68 65 20 62 69 6e 61  r.** in the bina
1f10: 72 79 20 66 6f 72 6d 61 74 20 6f 72 20 4a 53 4f  ry format or JSO
1f20: 4e 20 74 65 78 74 2e 20 20 43 6f 6d 70 75 74 65  N text.  Compute
1f30: 20 61 20 47 65 6f 50 6f 6c 79 20 6f 62 6a 65 63   a GeoPoly objec
1f40: 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  t and.** return 
1f50: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61  a pointer to tha
1f60: 74 20 6f 62 6a 65 63 74 2e 20 20 4f 72 20 69 66  t object.  Or if
1f70: 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6e 6f   the input is no
1f80: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1f90: 2a 2a 20 70 6f 6c 79 67 6f 6e 2c 20 70 75 74 20  ** polygon, put 
1fa0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1fb0: 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74   in sqlite3_cont
1fc0: 65 78 74 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ext and return N
1fd0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47  ULL..*/.static G
1fe0: 65 6f 50 6f 6c 79 20 2a 67 65 6f 70 6f 6c 79 46  eoPoly *geopolyF
1ff0: 75 6e 63 50 61 72 61 6d 28 0a 20 20 73 71 6c 69  uncParam(.  sqli
2000: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2010: 78 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  x,      /* Conte
2020: 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
2030: 73 61 67 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  sages */.  sqlit
2040: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20  e3_value *pVal, 
2050: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61         /* The va
2060: 6c 75 65 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f  lue to decode */
2070: 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20  .  int *pRc     
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2090: 2a 20 57 72 69 74 65 20 65 72 72 6f 72 20 68 65  * Write error he
20a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 47 65 6f 50 6f  re */.){.  GeoPo
20b0: 6c 79 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ly *p = 0;.  int
20c0: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 73 71   nByte;.  if( sq
20d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
20e0: 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 42  (pVal)==SQLITE_B
20f0: 4c 4f 42 0a 20 20 20 26 26 20 28 6e 42 79 74 65  LOB.   && (nByte
2100: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2110: 5f 62 79 74 65 73 28 70 56 61 6c 29 29 3e 3d 28  _bytes(pVal))>=(
2120: 34 2b 36 2a 73 69 7a 65 6f 66 28 47 65 6f 43 6f  4+6*sizeof(GeoCo
2130: 6f 72 64 29 29 0a 20 20 29 7b 0a 20 20 20 20 63  ord)).  ){.    c
2140: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2150: 61 72 20 2a 61 20 3d 20 73 71 6c 69 74 65 33 5f  ar *a = sqlite3_
2160: 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29  value_blob(pVal)
2170: 3b 0a 20 20 20 20 69 6e 74 20 6e 56 65 72 74 65  ;.    int nVerte
2180: 78 3b 0a 20 20 20 20 6e 56 65 72 74 65 78 20 3d  x;.    nVertex =
2190: 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61   (a[1]<<16) + (a
21a0: 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a  [2]<<8) + a[3];.
21b0: 20 20 20 20 69 66 28 20 28 61 5b 30 5d 3d 3d 30      if( (a[0]==0
21c0: 20 7c 7c 20 61 5b 30 5d 3d 3d 31 29 0a 20 20 20   || a[0]==1).   
21d0: 20 20 26 26 20 28 6e 56 65 72 74 65 78 2a 32 2a    && (nVertex*2*
21e0: 73 69 7a 65 6f 66 28 47 65 6f 43 6f 6f 72 64 29  sizeof(GeoCoord)
21f0: 20 2b 20 34 29 3d 3d 6e 42 79 74 65 0a 20 20 20   + 4)==nByte.   
2200: 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 73 71   ){.      p = sq
2210: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
2220: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 6e 56  sizeof(*p) + (nV
2230: 65 72 74 65 78 2d 31 29 2a 32 2a 73 69 7a 65 6f  ertex-1)*2*sizeo
2240: 66 28 47 65 6f 43 6f 6f 72 64 29 20 29 3b 0a 20  f(GeoCoord) );. 
2250: 20 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b       if( p==0 ){
2260: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52 63  .        if( pRc
2270: 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45   ) *pRc = SQLITE
2280: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
2290: 69 66 28 20 70 43 74 78 20 29 20 73 71 6c 69 74  if( pCtx ) sqlit
22a0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
22b0: 6e 6f 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20  nomem(pCtx);.   
22c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22d0: 20 20 69 6e 74 20 78 20 3d 20 31 3b 0a 20 20 20    int x = 1;.   
22e0: 20 20 20 20 20 70 2d 3e 6e 56 65 72 74 65 78 20       p->nVertex 
22f0: 3d 20 6e 56 65 72 74 65 78 3b 0a 20 20 20 20 20  = nVertex;.     
2300: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 68 64 72     memcpy(p->hdr
2310: 2c 20 61 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , a, nByte);.   
2320: 20 20 20 20 20 69 66 28 20 61 5b 30 5d 20 21 3d       if( a[0] !=
2330: 20 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   *(unsigned char
2340: 2a 29 26 78 20 29 7b 0a 20 20 20 20 20 20 20 20  *)&x ){.        
2350: 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
2360: 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2370: 3c 6e 56 65 72 74 65 78 2a 32 3b 20 69 69 2b 2b  <nVertex*2; ii++
2380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
2390: 65 6f 70 6f 6c 79 53 77 61 62 33 32 28 28 75 6e  eopolySwab32((un
23a0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 2d  signed char*)&p-
23b0: 3e 61 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20  >a[ii]);.       
23c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
23d0: 2d 3e 68 64 72 5b 30 5d 20 5e 3d 20 31 3b 0a 20  ->hdr[0] ^= 1;. 
23e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2400: 52 63 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49  Rc ) *pRc = SQLI
2410: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 74 75 72  TE_OK;.    retur
2420: 6e 20 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n p;.  }else if(
2430: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2440: 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
2450: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 72 65  E_TEXT ){.    re
2460: 74 75 72 6e 20 67 65 6f 70 6f 6c 79 50 61 72 73  turn geopolyPars
2470: 65 4a 73 6f 6e 28 73 71 6c 69 74 65 33 5f 76 61  eJson(sqlite3_va
2480: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 20  lue_text(pVal), 
2490: 70 52 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pRc);.  }else{. 
24a0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
24b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20  _ERROR;.    if( 
24c0: 70 43 74 78 21 3d 30 20 29 20 73 71 6c 69 74 65  pCtx!=0 ) sqlite
24d0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
24e0: 43 74 78 2c 20 22 6e 6f 74 20 61 20 76 61 6c 69  Ctx, "not a vali
24f0: 64 20 70 6f 6c 79 67 6f 6e 22 2c 20 2d 31 29 3b  d polygon", -1);
2500: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2510: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
2520: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
2530: 65 20 67 65 6f 70 6f 6c 79 5f 62 6c 6f 62 28 58  e geopoly_blob(X
2540: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ) function..**.*
2550: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69  * If the input i
2560: 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  s a well-formed 
2570: 47 65 6f 70 6f 6c 79 20 42 4c 4f 42 20 6f 72 20  Geopoly BLOB or 
2580: 4a 53 4f 4e 20 73 74 72 69 6e 67 0a 2a 2a 20 74  JSON string.** t
2590: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 42  hen return the B
25a0: 4c 4f 42 20 72 65 70 72 65 73 65 6e 74 61 74 69  LOB representati
25b0: 6f 6e 20 6f 66 20 74 68 65 20 70 6f 6c 79 67 6f  on of the polygo
25c0: 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  n.  Otherwise.**
25d0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
25e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f  .static void geo
25f0: 70 6f 6c 79 42 6c 6f 62 46 75 6e 63 28 0a 20 20  polyBlobFunc(.  
2600: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2610: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
2620: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
2630: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
2640: 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20 3d 20 67    GeoPoly *p = g
2650: 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28  eopolyFuncParam(
2660: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
2670: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  , 0);.  if( p ){
2680: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2690: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
26a0: 2c 20 70 2d 3e 68 64 72 2c 20 0a 20 20 20 20 20  , p->hdr, .     
26b0: 20 20 34 2b 38 2a 70 2d 3e 6e 56 65 72 74 65 78    4+8*p->nVertex
26c0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
26d0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
26e0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
26f0: 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74  ./*.** SQL funct
2700: 69 6f 6e 3a 20 20 20 20 20 67 65 6f 70 6f 6c 79  ion:     geopoly
2710: 5f 6a 73 6f 6e 28 58 29 0a 2a 2a 0a 2a 2a 20 49  _json(X).**.** I
2720: 6e 74 65 72 70 72 65 74 20 58 20 61 73 20 61 20  nterpret X as a 
2730: 70 6f 6c 79 67 6f 6e 20 61 6e 64 20 72 65 6e 64  polygon and rend
2740: 65 72 20 69 74 20 61 73 20 61 20 4a 53 4f 4e 20  er it as a JSON 
2750: 61 72 72 61 79 0a 2a 2a 20 6f 66 20 63 6f 6f 72  array.** of coor
2760: 64 69 6e 61 74 65 73 2e 20 20 4f 72 2c 20 69 66  dinates.  Or, if
2770: 20 58 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69   X is not a vali
2780: 64 20 70 6f 6c 79 67 6f 6e 2c 20 72 65 74 75 72  d polygon, retur
2790: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
27a0: 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 4a 73  c void geopolyJs
27b0: 6f 6e 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  onFunc(.  sqlite
27c0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
27d0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
27e0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
27f0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50  **argv.){.  GeoP
2800: 6f 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79  oly *p = geopoly
2810: 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78  FuncParam(contex
2820: 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a  t, argv[0], 0);.
2830: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
2840: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
2850: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
2860: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
2870: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
2880: 20 2a 78 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   *x = sqlite3_st
2890: 72 5f 6e 65 77 28 64 62 29 3b 0a 20 20 20 20 69  r_new(db);.    i
28a0: 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
28b0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 78 2c 20  3_str_append(x, 
28c0: 22 5b 22 2c 20 31 29 3b 0a 20 20 20 20 66 6f 72  "[", 1);.    for
28d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 56 65 72 74  (i=0; i<p->nVert
28e0: 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ex; i++){.      
28f0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
2900: 6e 64 66 28 78 2c 20 22 5b 25 21 67 2c 25 21 67  ndf(x, "[%!g,%!g
2910: 5d 2c 22 2c 20 70 2d 3e 61 5b 69 2a 32 5d 2c 20  ],", p->a[i*2], 
2920: 70 2d 3e 61 5b 69 2a 32 2b 31 5d 29 3b 0a 20 20  p->a[i*2+1]);.  
2930: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2940: 73 74 72 5f 61 70 70 65 6e 64 66 28 78 2c 20 22  str_appendf(x, "
2950: 5b 25 21 67 2c 25 21 67 5d 5d 22 2c 20 70 2d 3e  [%!g,%!g]]", p->
2960: 61 5b 30 5d 2c 20 70 2d 3e 61 5b 31 5d 29 3b 0a  a[0], p->a[1]);.
2970: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2980: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
2990: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 66 69 6e   sqlite3_str_fin
29a0: 69 73 68 28 78 29 2c 20 2d 31 2c 20 73 71 6c 69  ish(x), -1, sqli
29b0: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 73  te3_free);.    s
29c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
29d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c    }.}../*.** SQL
29e0: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 20 20 67   function:     g
29f0: 65 6f 70 6f 6c 79 5f 73 76 67 28 58 2c 20 2e 2e  eopoly_svg(X, ..
2a00: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70  ..).**.** Interp
2a10: 72 65 74 20 58 20 61 73 20 61 20 70 6f 6c 79 67  ret X as a polyg
2a20: 6f 6e 20 61 6e 64 20 72 65 6e 64 65 72 20 69 74  on and render it
2a30: 20 61 73 20 61 20 53 56 47 20 3c 70 6f 6c 79 6c   as a SVG <polyl
2a40: 69 6e 65 3e 2e 0a 2a 2a 20 41 64 64 69 74 69 6f  ine>..** Additio
2a50: 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 20 61 72  nal arguments ar
2a60: 65 20 61 64 64 65 64 20 61 73 20 61 74 74 72 69  e added as attri
2a70: 62 75 74 65 73 20 74 6f 20 74 68 65 20 3c 70 6f  butes to the <po
2a80: 6c 79 6c 69 6e 65 3e 2e 0a 2a 2f 0a 73 74 61 74  lyline>..*/.stat
2a90: 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 53  ic void geopolyS
2aa0: 76 67 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  vgFunc(.  sqlite
2ab0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
2ac0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
2ad0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2ae0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50  **argv.){.  GeoP
2af0: 6f 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79  oly *p = geopoly
2b00: 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78  FuncParam(contex
2b10: 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a  t, argv[0], 0);.
2b20: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
2b30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
2b40: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
2b50: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
2b60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
2b70: 20 2a 78 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   *x = sqlite3_st
2b80: 72 5f 6e 65 77 28 64 62 29 3b 0a 20 20 20 20 69  r_new(db);.    i
2b90: 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 63  nt i;.    char c
2ba0: 53 65 70 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  Sep = '\'';.    
2bb0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
2bc0: 6e 64 66 28 78 2c 20 22 3c 70 6f 6c 79 6c 69 6e  ndf(x, "<polylin
2bd0: 65 20 70 6f 69 6e 74 73 3d 22 29 3b 0a 20 20 20  e points=");.   
2be0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
2bf0: 56 65 72 74 65 78 3b 20 69 2b 2b 29 7b 0a 20 20  Vertex; i++){.  
2c00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
2c10: 61 70 70 65 6e 64 66 28 78 2c 20 22 25 63 25 67  appendf(x, "%c%g
2c20: 2c 25 67 22 2c 20 63 53 65 70 2c 20 70 2d 3e 61  ,%g", cSep, p->a
2c30: 5b 69 2a 32 5d 2c 20 70 2d 3e 61 5b 69 2a 32 2b  [i*2], p->a[i*2+
2c40: 31 5d 29 3b 0a 20 20 20 20 20 20 63 53 65 70 20  1]);.      cSep 
2c50: 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = ' ';.    }.   
2c60: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
2c70: 65 6e 64 66 28 78 2c 20 22 20 25 67 2c 25 67 27  endf(x, " %g,%g'
2c80: 22 2c 20 70 2d 3e 61 5b 30 5d 2c 20 70 2d 3e 61  ", p->a[0], p->a
2c90: 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [1]);.    for(i=
2ca0: 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
2cb0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2cc0: 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
2cd0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
2ce0: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b  e_text(argv[i]);
2cf0: 0a 20 20 20 20 20 20 69 66 28 20 7a 20 26 26 20  .      if( z && 
2d00: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  z[0] ){.        
2d10: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
2d20: 6e 64 66 28 78 2c 20 22 20 25 73 22 2c 20 7a 29  ndf(x, " %s", z)
2d30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2d40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
2d50: 61 70 70 65 6e 64 66 28 78 2c 20 22 3e 3c 2f 70  appendf(x, "></p
2d60: 6f 6c 79 6c 69 6e 65 3e 22 29 3b 0a 20 20 20 20  olyline>");.    
2d70: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
2d80: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  ext(context, sql
2d90: 69 74 65 33 5f 73 74 72 5f 66 69 6e 69 73 68 28  ite3_str_finish(
2da0: 78 29 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f  x), -1, sqlite3_
2db0: 66 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  free);.    sqlit
2dc0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
2dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 46 75 6e  }../*.** SQL Fun
2de0: 63 74 69 6f 6e 3a 20 20 20 20 20 20 67 65 6f 70  ction:      geop
2df0: 6f 6c 79 5f 78 66 6f 72 6d 28 70 6f 6c 79 2c 20  oly_xform(poly, 
2e00: 41 2c 20 42 2c 20 43 2c 20 44 2c 20 45 2c 20 46  A, B, C, D, E, F
2e10: 29 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72  ).**.** Transfor
2e20: 6d 20 61 6e 64 2f 6f 72 20 74 72 61 6e 73 6c 61  m and/or transla
2e30: 74 65 20 61 20 70 6f 6c 79 67 6f 6e 20 61 73 20  te a polygon as 
2e40: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2e50: 20 20 20 20 78 31 20 3d 20 41 2a 78 30 20 2b 20      x1 = A*x0 + 
2e60: 42 2a 79 30 20 2b 20 45 0a 2a 2a 20 20 20 20 20  B*y0 + E.**     
2e70: 20 79 31 20 3d 20 43 2a 78 30 20 2b 20 44 2a 79   y1 = C*x0 + D*y
2e80: 30 20 2b 20 46 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  0 + F.**.** For 
2e90: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 3a 0a 2a  a translation:.*
2ea0: 2a 0a 2a 2a 20 20 20 20 20 20 67 65 6f 70 6f 6c  *.**      geopol
2eb0: 79 5f 78 66 6f 72 6d 28 70 6f 6c 79 2c 20 31 2c  y_xform(poly, 1,
2ec0: 20 30 2c 20 30 2c 20 31 2c 20 78 2d 6f 66 66 73   0, 0, 1, x-offs
2ed0: 65 74 2c 20 79 2d 6f 66 66 73 65 74 29 0a 2a 2a  et, y-offset).**
2ee0: 0a 2a 2a 20 52 6f 74 61 74 65 20 62 79 20 52 20  .** Rotate by R 
2ef0: 61 72 6f 75 6e 64 20 74 68 65 20 70 6f 69 6e 74  around the point
2f00: 20 28 30 2c 30 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   (0,0):.**.**   
2f10: 20 20 20 67 65 6f 70 6f 6c 79 5f 78 66 6f 72 6d     geopoly_xform
2f20: 28 70 6f 6c 79 2c 20 63 6f 73 28 52 29 2c 20 73  (poly, cos(R), s
2f30: 69 6e 28 52 29 2c 20 73 69 6e 28 52 29 2c 20 63  in(R), sin(R), c
2f40: 6f 73 28 52 29 2c 20 30 2c 20 30 29 0a 2a 2f 0a  os(R), 0, 0).*/.
2f50: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f 70  static void geop
2f60: 6f 6c 79 58 66 6f 72 6d 46 75 6e 63 28 0a 20 20  olyXformFunc(.  
2f70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2f80: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
2f90: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
2fa0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
2fb0: 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20 3d 20 67    GeoPoly *p = g
2fc0: 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28  eopolyFuncParam(
2fd0: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
2fe0: 2c 20 30 29 3b 0a 20 20 64 6f 75 62 6c 65 20 41  , 0);.  double A
2ff0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
3000: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29  _double(argv[1])
3010: 3b 0a 20 20 64 6f 75 62 6c 65 20 42 20 3d 20 73  ;.  double B = s
3020: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
3030: 62 6c 65 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ble(argv[2]);.  
3040: 64 6f 75 62 6c 65 20 43 20 3d 20 73 71 6c 69 74  double C = sqlit
3050: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
3060: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 64 6f 75 62  argv[3]);.  doub
3070: 6c 65 20 44 20 3d 20 73 71 6c 69 74 65 33 5f 76  le D = sqlite3_v
3080: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
3090: 5b 34 5d 29 3b 0a 20 20 64 6f 75 62 6c 65 20 45  [4]);.  double E
30a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
30b0: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 35 5d 29  _double(argv[5])
30c0: 3b 0a 20 20 64 6f 75 62 6c 65 20 46 20 3d 20 73  ;.  double F = s
30d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
30e0: 62 6c 65 28 61 72 67 76 5b 37 5d 29 3b 0a 20 20  ble(argv[7]);.  
30f0: 47 65 6f 43 6f 6f 72 64 20 78 31 2c 20 79 31 2c  GeoCoord x1, y1,
3100: 20 78 30 2c 20 79 30 3b 0a 20 20 69 6e 74 20 69   x0, y0;.  int i
3110: 69 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  i;.  if( p ){.  
3120: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
3130: 2d 3e 6e 56 65 72 74 65 78 3b 20 69 69 2b 2b 29  ->nVertex; ii++)
3140: 7b 0a 20 20 20 20 20 20 78 30 20 3d 20 70 2d 3e  {.      x0 = p->
3150: 61 5b 69 69 2a 32 5d 3b 0a 20 20 20 20 20 20 79  a[ii*2];.      y
3160: 30 20 3d 20 70 2d 3e 61 5b 69 69 2a 32 2b 31 5d  0 = p->a[ii*2+1]
3170: 3b 0a 20 20 20 20 20 20 78 31 20 3d 20 41 2a 78  ;.      x1 = A*x
3180: 30 20 2b 20 42 2a 79 30 20 2b 20 45 3b 0a 20 20  0 + B*y0 + E;.  
3190: 20 20 20 20 79 31 20 3d 20 43 2a 78 30 20 2b 20      y1 = C*x0 + 
31a0: 44 2a 79 30 20 2b 20 46 3b 0a 20 20 20 20 20 20  D*y0 + F;.      
31b0: 70 2d 3e 61 5b 69 69 2a 32 5d 20 3d 20 78 31 3b  p->a[ii*2] = x1;
31c0: 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 69 2a 32  .      p->a[ii*2
31d0: 2b 31 5d 20 3d 20 79 31 3b 0a 20 20 20 20 7d 0a  +1] = y1;.    }.
31e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
31f0: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
3200: 20 70 2d 3e 68 64 72 2c 20 0a 20 20 20 20 20 20   p->hdr, .      
3210: 20 34 2b 38 2a 70 2d 3e 6e 56 65 72 74 65 78 2c   4+8*p->nVertex,
3220: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
3230: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  T);.    sqlite3_
3240: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
3250: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
3260: 74 69 6f 6e 20 6f 66 20 74 68 65 20 67 65 6f 70  tion of the geop
3270: 6f 6c 79 5f 61 72 65 61 28 58 29 20 66 75 6e 63  oly_area(X) func
3280: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
3290: 68 65 20 69 6e 70 75 74 20 69 73 20 61 20 77 65  he input is a we
32a0: 6c 6c 2d 66 6f 72 6d 65 64 20 47 65 6f 70 6f 6c  ll-formed Geopol
32b0: 79 20 42 4c 4f 42 20 74 68 65 6e 20 72 65 74 75  y BLOB then retu
32c0: 72 6e 20 74 68 65 20 61 72 65 61 0a 2a 2a 20 65  rn the area.** e
32d0: 6e 63 6c 6f 73 65 64 20 62 79 20 74 68 65 20 70  nclosed by the p
32e0: 6f 6c 79 67 6f 6e 2e 20 20 49 66 20 74 68 65 20  olygon.  If the 
32f0: 70 6f 6c 79 67 6f 6e 20 63 69 72 63 75 6c 61 74  polygon circulat
3300: 65 73 20 63 6c 6f 63 6b 77 69 73 65 20 69 6e 73  es clockwise ins
3310: 74 65 61 64 0a 2a 2a 20 6f 66 20 63 6f 75 6e 74  tead.** of count
3320: 65 72 63 6c 6f 63 6b 77 69 73 65 20 28 61 73 20  erclockwise (as 
3330: 69 74 20 73 68 6f 75 6c 64 29 20 74 68 65 6e 20  it should) then 
3340: 72 65 74 75 72 6e 20 74 68 65 20 6e 65 67 61 74  return the negat
3350: 69 76 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 6e  ive of the.** en
3360: 63 6c 6f 73 65 64 20 61 72 65 61 2e 20 20 4f 74  closed area.  Ot
3370: 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e  herwise return N
3380: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ULL..*/.static v
3390: 6f 69 64 20 67 65 6f 70 6f 6c 79 41 72 65 61 46  oid geopolyAreaF
33a0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
33b0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
33c0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
33d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
33e0: 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79  rgv.){.  GeoPoly
33f0: 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e   *p = geopolyFun
3400: 63 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20  cParam(context, 
3410: 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 69  argv[0], 0);.  i
3420: 66 28 20 70 20 29 7b 0a 20 20 20 20 64 6f 75 62  f( p ){.    doub
3430: 6c 65 20 72 41 72 65 61 20 3d 20 30 2e 30 3b 0a  le rArea = 0.0;.
3440: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
3450: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
3460: 6e 56 65 72 74 65 78 2d 31 3b 20 69 69 2b 2b 29  nVertex-1; ii++)
3470: 7b 0a 20 20 20 20 20 20 72 41 72 65 61 20 2b 3d  {.      rArea +=
3480: 20 28 70 2d 3e 61 5b 69 69 2a 32 5d 20 2d 20 70   (p->a[ii*2] - p
3490: 2d 3e 61 5b 69 69 2a 32 2b 32 5d 29 20 20 20 20  ->a[ii*2+2])    
34a0: 20 20 20 20 20 20 20 2f 2a 20 28 78 30 20 2d 20         /* (x0 - 
34b0: 78 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x1) */.         
34c0: 20 20 20 20 20 20 20 2a 20 28 70 2d 3e 61 5b 69         * (p->a[i
34d0: 69 2a 32 2b 31 5d 20 2b 20 70 2d 3e 61 5b 69 69  i*2+1] + p->a[ii
34e0: 2a 32 2b 33 5d 29 20 20 20 20 20 20 2f 2a 20 28  *2+3])      /* (
34f0: 79 30 20 2b 20 79 31 29 20 2a 2f 0a 20 20 20 20  y0 + y1) */.    
3500: 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 30 2e              * 0.
3510: 35 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 41 72  5;.    }.    rAr
3520: 65 61 20 2b 3d 20 28 70 2d 3e 61 5b 69 69 2a 32  ea += (p->a[ii*2
3530: 5d 20 2d 20 70 2d 3e 61 5b 30 5d 29 20 20 20 20  ] - p->a[0])    
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3550: 20 28 78 4e 20 2d 20 78 30 29 20 2a 2f 0a 20 20   (xN - x0) */.  
3560: 20 20 20 20 20 20 20 20 20 20 20 2a 20 28 70 2d             * (p-
3570: 3e 61 5b 69 69 2a 32 2b 31 5d 20 2b 20 70 2d 3e  >a[ii*2+1] + p->
3580: 61 5b 31 5d 29 20 20 20 20 20 20 20 20 20 20 20  a[1])           
3590: 20 20 20 2f 2a 20 28 79 4e 20 2b 20 79 30 29 20     /* (yN + y0) 
35a0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
35b0: 2a 20 30 2e 35 3b 0a 20 20 20 20 73 71 6c 69 74  * 0.5;.    sqlit
35c0: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
35d0: 28 63 6f 6e 74 65 78 74 2c 20 72 41 72 65 61 29  (context, rArea)
35e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
35f0: 65 65 28 70 29 3b 0a 20 20 7d 20 20 20 20 20 20  ee(p);.  }      
3600: 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20        .}../*.** 
3610: 43 6f 6d 70 75 74 65 20 61 20 62 6f 75 6e 64 2d  Compute a bound-
3620: 62 6f 78 20 6f 6e 20 61 20 70 6f 6c 79 67 6f 6e  box on a polygon
3630: 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20  .  Return a new 
3640: 47 65 6f 50 6f 6c 79 20 6f 62 6a 65 63 74 0a 2a  GeoPoly object.*
3650: 2a 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  * that describes
3660: 20 74 68 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f   the bounding bo
3670: 78 2e 20 20 4f 72 2c 20 69 66 20 61 43 6f 6f 72  x.  Or, if aCoor
3680: 64 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20  d is not a NULL 
3690: 70 6f 69 6e 74 65 72 0a 2a 2a 20 66 69 6c 6c 20  pointer.** fill 
36a0: 69 74 20 69 6e 20 77 69 74 68 20 74 68 65 20 62  it in with the b
36b0: 6f 75 6e 64 69 6e 67 20 62 6f 78 20 69 6e 73 74  ounding box inst
36c0: 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47  ead..*/.static G
36d0: 65 6f 50 6f 6c 79 20 2a 67 65 6f 70 6f 6c 79 42  eoPoly *geopolyB
36e0: 42 6f 78 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  Box(.  sqlite3_c
36f0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
3700: 20 20 20 2f 2a 20 46 6f 72 20 72 65 63 6f 72 64     /* For record
3710: 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 2a 2f  ing the error */
3720: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3730: 20 2a 70 50 6f 6c 79 2c 20 20 20 20 20 20 20 2f   *pPoly,       /
3740: 2a 20 54 68 65 20 70 6f 6c 79 67 6f 6e 20 2a 2f  * The polygon */
3750: 0a 20 20 52 74 72 65 65 43 6f 6f 72 64 20 2a 61  .  RtreeCoord *a
3760: 43 6f 6f 72 64 2c 20 20 20 20 20 20 20 20 20 2f  Coord,         /
3770: 2a 20 52 65 73 75 6c 74 73 20 68 65 72 65 20 2a  * Results here *
3780: 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20  /.  int *pRc    
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a0: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 68 65  /* Error code he
37b0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 47 65 6f 50 6f  re */.){.  GeoPo
37c0: 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79 46  ly *p = geopolyF
37d0: 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78 74  uncParam(context
37e0: 2c 20 70 50 6f 6c 79 2c 20 70 52 63 29 3b 0a 20  , pPoly, pRc);. 
37f0: 20 47 65 6f 50 6f 6c 79 20 2a 70 4f 75 74 20 3d   GeoPoly *pOut =
3800: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
3810: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
3820: 6c 6f 61 74 20 6d 6e 58 2c 20 6d 78 58 2c 20 6d  loat mnX, mxX, m
3830: 6e 59 2c 20 6d 78 59 3b 0a 20 20 20 20 6d 6e 58  nY, mxY;.    mnX
3840: 20 3d 20 6d 78 58 20 3d 20 70 2d 3e 61 5b 30 5d   = mxX = p->a[0]
3850: 3b 0a 20 20 20 20 6d 6e 59 20 3d 20 6d 78 59 20  ;.    mnY = mxY 
3860: 3d 20 70 2d 3e 61 5b 31 5d 3b 0a 20 20 20 20 66  = p->a[1];.    f
3870: 6f 72 28 69 69 3d 31 3b 20 69 69 3c 70 2d 3e 6e  or(ii=1; ii<p->n
3880: 56 65 72 74 65 78 3b 20 69 69 2b 2b 29 7b 0a 20  Vertex; ii++){. 
3890: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
38a0: 70 2d 3e 61 5b 69 69 2a 32 5d 3b 0a 20 20 20 20  p->a[ii*2];.    
38b0: 20 20 69 66 28 20 72 3c 6d 6e 58 20 29 20 6d 6e    if( r<mnX ) mn
38c0: 58 20 3d 20 72 3b 0a 20 20 20 20 20 20 65 6c 73  X = r;.      els
38d0: 65 20 69 66 28 20 72 3e 6d 78 58 20 29 20 6d 78  e if( r>mxX ) mx
38e0: 58 20 3d 20 72 3b 0a 20 20 20 20 20 20 72 20 3d  X = r;.      r =
38f0: 20 70 2d 3e 61 5b 69 69 2a 32 2b 31 5d 3b 0a 20   p->a[ii*2+1];. 
3900: 20 20 20 20 20 69 66 28 20 72 3c 6d 6e 59 20 29       if( r<mnY )
3910: 20 6d 6e 59 20 3d 20 72 3b 0a 20 20 20 20 20 20   mnY = r;.      
3920: 65 6c 73 65 20 69 66 28 20 72 3e 6d 78 59 20 29  else if( r>mxY )
3930: 20 6d 78 59 20 3d 20 72 3b 0a 20 20 20 20 7d 0a   mxY = r;.    }.
3940: 20 20 20 20 69 66 28 20 70 52 63 20 29 20 2a 70      if( pRc ) *p
3950: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  Rc = SQLITE_OK;.
3960: 20 20 20 20 69 66 28 20 61 43 6f 6f 72 64 3d 3d      if( aCoord==
3970: 30 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 20  0 ){.      pOut 
3980: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
3990: 63 28 70 2c 20 73 69 7a 65 6f 66 28 47 65 6f 50  c(p, sizeof(GeoP
39a0: 6f 6c 79 29 2b 73 69 7a 65 6f 66 28 47 65 6f 43  oly)+sizeof(GeoC
39b0: 6f 6f 72 64 29 2a 36 29 3b 0a 20 20 20 20 20 20  oord)*6);.      
39c0: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 7b 0a 20  if( pOut==0 ){. 
39d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
39e0: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
39f0: 69 66 28 20 63 6f 6e 74 65 78 74 20 29 20 73 71  if( context ) sq
3a00: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
3a10: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
3a20: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
3a30: 52 63 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49  Rc ) *pRc = SQLI
3a40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
3a50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
3a60: 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e    }.      pOut->
3a70: 6e 56 65 72 74 65 78 20 3d 20 34 3b 0a 20 20 20  nVertex = 4;.   
3a80: 20 20 20 70 4f 75 74 2d 3e 68 64 72 5b 31 5d 20     pOut->hdr[1] 
3a90: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  = 0;.      pOut-
3aa0: 3e 68 64 72 5b 32 5d 20 3d 20 30 3b 0a 20 20 20  >hdr[2] = 0;.   
3ab0: 20 20 20 70 4f 75 74 2d 3e 68 64 72 5b 33 5d 20     pOut->hdr[3] 
3ac0: 3d 20 34 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  = 4;.      pOut-
3ad0: 3e 61 5b 30 5d 20 3d 20 6d 6e 58 3b 0a 20 20 20  >a[0] = mnX;.   
3ae0: 20 20 20 70 4f 75 74 2d 3e 61 5b 31 5d 20 3d 20     pOut->a[1] = 
3af0: 6d 6e 59 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  mnY;.      pOut-
3b00: 3e 61 5b 32 5d 20 3d 20 6d 78 58 3b 0a 20 20 20  >a[2] = mxX;.   
3b10: 20 20 20 70 4f 75 74 2d 3e 61 5b 33 5d 20 3d 20     pOut->a[3] = 
3b20: 6d 6e 59 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  mnY;.      pOut-
3b30: 3e 61 5b 34 5d 20 3d 20 6d 78 58 3b 0a 20 20 20  >a[4] = mxX;.   
3b40: 20 20 20 70 4f 75 74 2d 3e 61 5b 35 5d 20 3d 20     pOut->a[5] = 
3b50: 6d 78 59 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  mxY;.      pOut-
3b60: 3e 61 5b 36 5d 20 3d 20 6d 6e 58 3b 0a 20 20 20  >a[6] = mnX;.   
3b70: 20 20 20 70 4f 75 74 2d 3e 61 5b 37 5d 20 3d 20     pOut->a[7] = 
3b80: 6d 78 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  mxY;.    }else{.
3b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
3ba0: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 61 43 6f  ee(p);.      aCo
3bb0: 6f 72 64 5b 30 5d 2e 66 20 3d 20 6d 6e 58 3b 0a  ord[0].f = mnX;.
3bc0: 20 20 20 20 20 20 61 43 6f 6f 72 64 5b 31 5d 2e        aCoord[1].
3bd0: 66 20 3d 20 6d 78 58 3b 0a 20 20 20 20 20 20 61  f = mxX;.      a
3be0: 43 6f 6f 72 64 5b 32 5d 2e 66 20 3d 20 6d 6e 59  Coord[2].f = mnY
3bf0: 3b 0a 20 20 20 20 20 20 61 43 6f 6f 72 64 5b 33  ;.      aCoord[3
3c00: 5d 2e 66 20 3d 20 6d 78 59 3b 0a 20 20 20 20 7d  ].f = mxY;.    }
3c10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4f  .  }.  return pO
3c20: 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  ut;.}../*.** Imp
3c30: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
3c40: 68 65 20 67 65 6f 70 6f 6c 79 5f 62 62 6f 78 28  he geopoly_bbox(
3c50: 58 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  X) SQL function.
3c60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3c70: 67 65 6f 70 6f 6c 79 42 42 6f 78 46 75 6e 63 28  geopolyBBoxFunc(
3c80: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
3c90: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
3ca0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
3cb0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
3cc0: 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20  ){.  GeoPoly *p 
3cd0: 3d 20 67 65 6f 70 6f 6c 79 42 42 6f 78 28 63 6f  = geopolyBBox(co
3ce0: 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 2c 20  ntext, argv[0], 
3cf0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29  0, 0);.  if( p )
3d00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
3d10: 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78  sult_blob(contex
3d20: 74 2c 20 70 2d 3e 68 64 72 2c 20 0a 20 20 20 20  t, p->hdr, .    
3d30: 20 20 20 34 2b 38 2a 70 2d 3e 6e 56 65 72 74 65     4+8*p->nVerte
3d40: 78 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  x, SQLITE_TRANSI
3d50: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
3d60: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
3d70: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
3d80: 65 20 69 66 20 70 6f 69 6e 74 20 28 78 30 2c 79  e if point (x0,y
3d90: 30 29 20 69 73 20 62 65 6e 65 61 74 68 20 6c 69  0) is beneath li
3da0: 6e 65 20 73 65 67 6d 65 6e 74 20 28 78 31 2c 79  ne segment (x1,y
3db0: 31 29 2d 3e 28 78 32 2c 79 32 29 2e 0a 2a 2a 20  1)->(x2,y2)..** 
3dc0: 52 65 74 75 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  Returns:.**.**  
3dd0: 20 20 2b 32 20 20 78 30 2c 79 30 20 69 73 20 6f    +2  x0,y0 is o
3de0: 6e 20 74 68 65 20 6c 69 6e 65 20 73 65 67 65 6d  n the line segem
3df0: 65 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 2b 31 20  ent.**.**    +1 
3e00: 20 78 30 2c 79 30 20 69 73 20 62 65 6e 65 61 74   x0,y0 is beneat
3e10: 68 20 6c 69 6e 65 20 73 65 67 6d 65 6e 74 0a 2a  h line segment.*
3e20: 2a 0a 2a 2a 20 20 20 20 30 20 20 20 78 30 2c 79  *.**    0   x0,y
3e30: 30 20 69 73 20 6e 6f 74 20 6f 6e 20 6f 72 20 62  0 is not on or b
3e40: 65 6e 65 61 74 68 20 74 68 65 20 6c 69 6e 65 20  eneath the line 
3e50: 73 65 67 6d 65 6e 74 20 6f 72 20 74 68 65 20 6c  segment or the l
3e60: 69 6e 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 20  ine segment.**  
3e70: 20 20 20 20 20 20 69 73 20 76 65 72 74 69 63 61        is vertica
3e80: 6c 20 61 6e 64 20 78 30 2c 79 30 20 69 73 20 6e  l and x0,y0 is n
3e90: 6f 74 20 6f 6e 20 74 68 65 20 6c 69 6e 65 20 73  ot on the line s
3ea0: 65 67 6d 65 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65  egment.**.** The
3eb0: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6f 72 64   left-most coord
3ec0: 69 6e 61 74 65 20 6d 69 6e 28 78 31 2c 78 32 29  inate min(x1,x2)
3ed0: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
3ee0: 65 64 20 74 6f 20 62 65 20 70 61 72 74 20 6f 66  ed to be part of
3ef0: 0a 2a 2a 20 74 68 65 20 6c 69 6e 65 20 73 65 67  .** the line seg
3f00: 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72  ment for the pur
3f10: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 61 6e  poses of this an
3f20: 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  alysis..*/.stati
3f30: 63 20 69 6e 74 20 70 6f 69 6e 74 42 65 6e 65 61  c int pointBenea
3f40: 74 68 4c 69 6e 65 28 0a 20 20 64 6f 75 62 6c 65  thLine(.  double
3f50: 20 78 30 2c 20 64 6f 75 62 6c 65 20 79 30 2c 0a   x0, double y0,.
3f60: 20 20 64 6f 75 62 6c 65 20 78 31 2c 20 64 6f 75    double x1, dou
3f70: 62 6c 65 20 79 31 2c 0a 20 20 64 6f 75 62 6c 65  ble y1,.  double
3f80: 20 78 32 2c 20 64 6f 75 62 6c 65 20 79 32 0a 29   x2, double y2.)
3f90: 7b 0a 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20  {.  double y;.  
3fa0: 69 66 28 20 78 30 3d 3d 78 31 20 26 26 20 79 30  if( x0==x1 && y0
3fb0: 3d 3d 79 31 20 29 20 72 65 74 75 72 6e 20 32 3b  ==y1 ) return 2;
3fc0: 0a 20 20 69 66 28 20 78 31 3c 78 32 20 29 7b 0a  .  if( x1<x2 ){.
3fd0: 20 20 20 20 69 66 28 20 78 30 3c 3d 78 31 20 7c      if( x0<=x1 |
3fe0: 7c 20 78 30 3e 78 32 20 29 20 72 65 74 75 72 6e  | x0>x2 ) return
3ff0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
4000: 78 31 3e 78 32 20 29 7b 0a 20 20 20 20 69 66 28  x1>x2 ){.    if(
4010: 20 78 30 3c 3d 78 32 20 7c 7c 20 78 30 3e 78 31   x0<=x2 || x0>x1
4020: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
4030: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 56 65 72  else{.    /* Ver
4040: 74 69 63 61 6c 20 6c 69 6e 65 20 73 65 67 6d 65  tical line segme
4050: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 78 30  nt */.    if( x0
4060: 21 3d 78 31 20 29 20 72 65 74 75 72 6e 20 30 3b  !=x1 ) return 0;
4070: 0a 20 20 20 20 69 66 28 20 79 30 3c 79 31 20 26  .    if( y0<y1 &
4080: 26 20 79 30 3c 79 32 20 29 20 72 65 74 75 72 6e  & y0<y2 ) return
4090: 20 30 3b 0a 20 20 20 20 69 66 28 20 79 30 3e 79   0;.    if( y0>y
40a0: 31 20 26 26 20 79 30 3e 79 32 20 29 20 72 65 74  1 && y0>y2 ) ret
40b0: 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72  urn 0;.    retur
40c0: 6e 20 32 3b 0a 20 20 7d 0a 20 20 79 20 3d 20 79  n 2;.  }.  y = y
40d0: 31 20 2b 20 28 79 32 2d 79 31 29 2a 28 78 30 2d  1 + (y2-y1)*(x0-
40e0: 78 31 29 2f 28 78 32 2d 78 31 29 3b 0a 20 20 69  x1)/(x2-x1);.  i
40f0: 66 28 20 79 30 3d 3d 79 20 29 20 72 65 74 75 72  f( y0==y ) retur
4100: 6e 20 32 3b 0a 20 20 69 66 28 20 79 30 3c 79 20  n 2;.  if( y0<y 
4110: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
4120: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4130: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
4140: 20 20 67 65 6f 70 6f 6c 79 5f 77 69 74 68 69 6e    geopoly_within
4150: 28 50 2c 58 2c 59 29 0a 2a 2a 0a 2a 2a 20 52 65  (P,X,Y).**.** Re
4160: 74 75 72 6e 20 2b 32 20 69 66 20 70 6f 69 6e 74  turn +2 if point
4170: 20 58 2c 59 20 69 73 20 77 69 74 68 69 6e 20 70   X,Y is within p
4180: 6f 6c 79 67 6f 6e 20 50 2e 0a 2a 2a 20 52 65 74  olygon P..** Ret
4190: 75 72 6e 20 2b 31 20 69 66 20 70 6f 69 6e 74 20  urn +1 if point 
41a0: 58 2c 59 20 69 73 20 6f 6e 20 74 68 65 20 70 6f  X,Y is on the po
41b0: 6c 79 67 6f 6e 20 62 6f 75 6e 64 61 72 79 2e 0a  lygon boundary..
41c0: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 70  ** Return 0 if p
41d0: 6f 69 6e 74 20 58 2c 59 20 69 73 20 6f 75 74 73  oint X,Y is outs
41e0: 69 64 65 20 74 68 65 20 70 6f 6c 79 67 6f 6e 0a  ide the polygon.
41f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
4200: 65 6f 70 6f 6c 79 57 69 74 68 69 6e 46 75 6e 63  eopolyWithinFunc
4210: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
4220: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
4230: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
4240: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
4250: 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70  .){.  GeoPoly *p
4260: 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61   = geopolyFuncPa
4270: 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  ram(context, arg
4280: 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 64 6f 75 62  v[0], 0);.  doub
4290: 6c 65 20 78 30 20 3d 20 73 71 6c 69 74 65 33 5f  le x0 = sqlite3_
42a0: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
42b0: 76 5b 31 5d 29 3b 0a 20 20 64 6f 75 62 6c 65 20  v[1]);.  double 
42c0: 79 30 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  y0 = sqlite3_val
42d0: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 32  ue_double(argv[2
42e0: 5d 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ]);.  if( p ){. 
42f0: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20     int v = 0;.  
4300: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
4310: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
4320: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 6e  or(ii=0; ii<p->n
4330: 56 65 72 74 65 78 2d 31 3b 20 69 69 2b 2b 29 7b  Vertex-1; ii++){
4340: 0a 20 20 20 20 20 20 76 20 3d 20 70 6f 69 6e 74  .      v = point
4350: 42 65 6e 65 61 74 68 4c 69 6e 65 28 78 30 2c 79  BeneathLine(x0,y
4360: 30 2c 70 2d 3e 61 5b 69 69 2a 32 5d 2c 70 2d 3e  0,p->a[ii*2],p->
4370: 61 5b 69 69 2a 32 2b 31 5d 2c 0a 20 20 20 20 20  a[ii*2+1],.     
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4390: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61              p->a
43a0: 5b 69 69 2a 32 2b 32 5d 2c 70 2d 3e 61 5b 69 69  [ii*2+2],p->a[ii
43b0: 2a 32 2b 33 5d 29 3b 0a 20 20 20 20 20 20 69 66  *2+3]);.      if
43c0: 28 20 76 3d 3d 32 20 29 20 62 72 65 61 6b 3b 0a  ( v==2 ) break;.
43d0: 20 20 20 20 20 20 63 6e 74 20 2b 3d 20 76 3b 0a        cnt += v;.
43e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 76 21      }.    if( v!
43f0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =2 ){.      v = 
4400: 70 6f 69 6e 74 42 65 6e 65 61 74 68 4c 69 6e 65  pointBeneathLine
4410: 28 78 30 2c 79 30 2c 70 2d 3e 61 5b 69 69 2a 32  (x0,y0,p->a[ii*2
4420: 5d 2c 70 2d 3e 61 5b 69 69 2a 32 2b 31 5d 2c 0a  ],p->a[ii*2+1],.
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 70 2d 3e 61 5b 30 5d 2c 70 2d 3e 61 5b 31 5d   p->a[0],p->a[1]
4460: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4470: 20 76 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73   v==2 ){.      s
4480: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
4490: 74 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20  t(context, 1);. 
44a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 28 76     }else if( ((v
44b0: 2b 63 6e 74 29 26 31 29 3d 3d 30 20 29 7b 0a 20  +cnt)&1)==0 ){. 
44c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
44d0: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
44e0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
44f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4500: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
4510: 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 2);.    }.    
4520: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
4530: 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  .  }            
4540: 0a 7d 0a 0a 2f 2a 20 4f 62 6a 65 63 74 73 20 75  .}../* Objects u
4550: 73 65 64 20 62 79 20 74 68 65 20 6f 76 65 72 6c  sed by the overl
4560: 61 70 20 61 6c 67 6f 72 69 68 6d 2e 20 2a 2f 0a  ap algorihm. */.
4570: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 47  typedef struct G
4580: 65 6f 45 76 65 6e 74 20 47 65 6f 45 76 65 6e 74  eoEvent GeoEvent
4590: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
45a0: 20 47 65 6f 53 65 67 6d 65 6e 74 20 47 65 6f 53   GeoSegment GeoS
45b0: 65 67 6d 65 6e 74 3b 0a 74 79 70 65 64 65 66 20  egment;.typedef 
45c0: 73 74 72 75 63 74 20 47 65 6f 4f 76 65 72 6c 61  struct GeoOverla
45d0: 70 20 47 65 6f 4f 76 65 72 6c 61 70 3b 0a 73 74  p GeoOverlap;.st
45e0: 72 75 63 74 20 47 65 6f 45 76 65 6e 74 20 7b 0a  ruct GeoEvent {.
45f0: 20 20 64 6f 75 62 6c 65 20 78 3b 20 20 20 20 20    double x;     
4600: 20 20 20 20 20 20 20 20 20 2f 2a 20 58 20 63 6f           /* X co
4610: 6f 72 64 69 6e 61 74 65 20 61 74 20 77 68 69 63  ordinate at whic
4620: 68 20 65 76 65 6e 74 20 6f 63 63 75 72 73 20 2a  h event occurs *
4630: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
4640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
4650: 66 6f 72 20 41 44 44 2c 20 31 20 66 6f 72 20 52  for ADD, 1 for R
4660: 45 4d 4f 56 45 20 2a 2f 0a 20 20 47 65 6f 53 65  EMOVE */.  GeoSe
4670: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
4680: 20 20 2f 2a 20 54 68 65 20 73 65 67 6d 65 6e 74    /* The segment
4690: 20 74 6f 20 62 65 20 61 64 64 65 64 20 6f 72 20   to be added or 
46a0: 72 65 6d 6f 76 65 64 20 2a 2f 0a 20 20 47 65 6f  removed */.  Geo
46b0: 45 76 65 6e 74 20 2a 70 4e 65 78 74 3b 20 20 20  Event *pNext;   
46c0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 76 65 6e      /* Next even
46d0: 74 20 69 6e 20 74 68 65 20 73 6f 72 74 65 64 20  t in the sorted 
46e0: 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63  list */.};.struc
46f0: 74 20 47 65 6f 53 65 67 6d 65 6e 74 20 7b 0a 20  t GeoSegment {. 
4700: 20 64 6f 75 62 6c 65 20 43 2c 20 42 3b 20 20 20   double C, B;   
4710: 20 20 20 20 20 20 20 20 2f 2a 20 79 20 3d 20 43          /* y = C
4720: 2a 78 20 2b 20 42 20 2a 2f 0a 20 20 64 6f 75 62  *x + B */.  doub
4730: 6c 65 20 79 3b 20 20 20 20 20 20 20 20 20 20 20  le y;           
4740: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 79 20     /* Current y 
4750: 76 61 6c 75 65 20 2a 2f 0a 20 20 66 6c 6f 61 74  value */.  float
4760: 20 79 30 3b 20 20 20 20 20 20 20 20 20 20 20 20   y0;            
4770: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 79 20 76    /* Initial y v
4780: 61 6c 75 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  alue */.  unsign
4790: 65 64 20 63 68 61 72 20 73 69 64 65 3b 20 20 20  ed char side;   
47a0: 20 2f 2a 20 31 20 66 6f 72 20 70 31 2c 20 32 20   /* 1 for p1, 2 
47b0: 66 6f 72 20 70 32 20 2a 2f 0a 20 20 75 6e 73 69  for p2 */.  unsi
47c0: 67 6e 65 64 20 69 6e 74 20 69 64 78 3b 20 20 20  gned int idx;   
47d0: 20 20 20 2f 2a 20 57 68 69 63 68 20 73 65 67 6d     /* Which segm
47e0: 65 6e 74 20 77 69 74 68 69 6e 20 74 68 65 20 73  ent within the s
47f0: 69 64 65 20 2a 2f 0a 20 20 47 65 6f 53 65 67 6d  ide */.  GeoSegm
4800: 65 6e 74 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ent *pNext;     
4810: 2f 2a 20 4e 65 78 74 20 73 65 67 6d 65 6e 74 20  /* Next segment 
4820: 69 6e 20 61 20 6c 69 73 74 20 73 6f 72 74 65 64  in a list sorted
4830: 20 62 79 20 79 20 2a 2f 0a 7d 3b 0a 73 74 72 75   by y */.};.stru
4840: 63 74 20 47 65 6f 4f 76 65 72 6c 61 70 20 7b 0a  ct GeoOverlap {.
4850: 20 20 47 65 6f 45 76 65 6e 74 20 2a 61 45 76 65    GeoEvent *aEve
4860: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
4870: 41 72 72 61 79 20 6f 66 20 61 6c 6c 20 65 76 65  Array of all eve
4880: 6e 74 73 20 2a 2f 0a 20 20 47 65 6f 53 65 67 6d  nts */.  GeoSegm
4890: 65 6e 74 20 2a 61 53 65 67 6d 65 6e 74 3b 20 20  ent *aSegment;  
48a0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
48b0: 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  all segments */.
48c0: 20 20 69 6e 74 20 6e 45 76 65 6e 74 3b 20 20 20    int nEvent;   
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
48e0: 4e 75 6d 62 65 72 20 6f 66 20 65 76 65 6e 74 73  Number of events
48f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
4900: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
4910: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
4920: 67 6d 65 6e 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  gments */.};../*
4930: 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
4940: 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 69 74 73   segment and its
4950: 20 61 73 73 6f 63 69 61 74 65 64 20 65 76 65 6e   associated even
4960: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
4970: 69 64 20 67 65 6f 70 6f 6c 79 41 64 64 4f 6e 65  id geopolyAddOne
4980: 53 65 67 6d 65 6e 74 28 0a 20 20 47 65 6f 4f 76  Segment(.  GeoOv
4990: 65 72 6c 61 70 20 2a 70 2c 0a 20 20 47 65 6f 43  erlap *p,.  GeoC
49a0: 6f 6f 72 64 20 78 30 2c 0a 20 20 47 65 6f 43 6f  oord x0,.  GeoCo
49b0: 6f 72 64 20 79 30 2c 0a 20 20 47 65 6f 43 6f 6f  ord y0,.  GeoCoo
49c0: 72 64 20 78 31 2c 0a 20 20 47 65 6f 43 6f 6f 72  rd x1,.  GeoCoor
49d0: 64 20 79 31 2c 0a 20 20 75 6e 73 69 67 6e 65 64  d y1,.  unsigned
49e0: 20 63 68 61 72 20 73 69 64 65 2c 0a 20 20 75 6e   char side,.  un
49f0: 73 69 67 6e 65 64 20 69 6e 74 20 69 64 78 0a 29  signed int idx.)
4a00: 7b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a  {.  GeoSegment *
4a10: 70 53 65 67 3b 0a 20 20 47 65 6f 45 76 65 6e 74  pSeg;.  GeoEvent
4a20: 20 2a 70 45 76 65 6e 74 3b 0a 20 20 69 66 28 20   *pEvent;.  if( 
4a30: 78 30 3d 3d 78 31 20 29 20 72 65 74 75 72 6e 3b  x0==x1 ) return;
4a40: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 76 65 72 74    /* Ignore vert
4a50: 69 63 61 6c 20 73 65 67 6d 65 6e 74 73 20 2a 2f  ical segments */
4a60: 0a 20 20 69 66 28 20 78 30 3e 78 31 20 29 7b 0a  .  if( x0>x1 ){.
4a70: 20 20 20 20 47 65 6f 43 6f 6f 72 64 20 74 20 3d      GeoCoord t =
4a80: 20 78 30 3b 0a 20 20 20 20 78 30 20 3d 20 78 31   x0;.    x0 = x1
4a90: 3b 0a 20 20 20 20 78 31 20 3d 20 74 3b 0a 20 20  ;.    x1 = t;.  
4aa0: 20 20 74 20 3d 20 79 30 3b 0a 20 20 20 20 79 30    t = y0;.    y0
4ab0: 20 3d 20 79 31 3b 0a 20 20 20 20 79 31 20 3d 20   = y1;.    y1 = 
4ac0: 74 3b 0a 20 20 7d 0a 20 20 70 53 65 67 20 3d 20  t;.  }.  pSeg = 
4ad0: 70 2d 3e 61 53 65 67 6d 65 6e 74 20 2b 20 70 2d  p->aSegment + p-
4ae0: 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 70 2d 3e  >nSegment;.  p->
4af0: 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 70 53  nSegment++;.  pS
4b00: 65 67 2d 3e 43 20 3d 20 28 79 31 2d 79 30 29 2f  eg->C = (y1-y0)/
4b10: 28 78 31 2d 78 30 29 3b 0a 20 20 70 53 65 67 2d  (x1-x0);.  pSeg-
4b20: 3e 42 20 3d 20 79 31 20 2d 20 78 31 2a 70 53 65  >B = y1 - x1*pSe
4b30: 67 2d 3e 43 3b 0a 20 20 70 53 65 67 2d 3e 79 30  g->C;.  pSeg->y0
4b40: 20 3d 20 79 30 3b 0a 20 20 70 53 65 67 2d 3e 73   = y0;.  pSeg->s
4b50: 69 64 65 20 3d 20 73 69 64 65 3b 0a 20 20 70 53  ide = side;.  pS
4b60: 65 67 2d 3e 69 64 78 20 3d 20 69 64 78 3b 0a 20  eg->idx = idx;. 
4b70: 20 70 45 76 65 6e 74 20 3d 20 70 2d 3e 61 45 76   pEvent = p->aEv
4b80: 65 6e 74 20 2b 20 70 2d 3e 6e 45 76 65 6e 74 3b  ent + p->nEvent;
4b90: 0a 20 20 70 2d 3e 6e 45 76 65 6e 74 2b 2b 3b 0a  .  p->nEvent++;.
4ba0: 20 20 70 45 76 65 6e 74 2d 3e 78 20 3d 20 78 30    pEvent->x = x0
4bb0: 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 65 54 79 70  ;.  pEvent->eTyp
4bc0: 65 20 3d 20 30 3b 0a 20 20 70 45 76 65 6e 74 2d  e = 0;.  pEvent-
4bd0: 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20  >pSeg = pSeg;.  
4be0: 70 45 76 65 6e 74 20 3d 20 70 2d 3e 61 45 76 65  pEvent = p->aEve
4bf0: 6e 74 20 2b 20 70 2d 3e 6e 45 76 65 6e 74 3b 0a  nt + p->nEvent;.
4c00: 20 20 70 2d 3e 6e 45 76 65 6e 74 2b 2b 3b 0a 20    p->nEvent++;. 
4c10: 20 70 45 76 65 6e 74 2d 3e 78 20 3d 20 78 31 3b   pEvent->x = x1;
4c20: 0a 20 20 70 45 76 65 6e 74 2d 3e 65 54 79 70 65  .  pEvent->eType
4c30: 20 3d 20 31 3b 0a 20 20 70 45 76 65 6e 74 2d 3e   = 1;.  pEvent->
4c40: 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 7d 0a 20  pSeg = pSeg;.}. 
4c50: 20 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74   .../*.** Insert
4c60: 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 61 6e   all segments an
4c70: 64 20 65 76 65 6e 74 73 20 66 6f 72 20 70 6f 6c  d events for pol
4c80: 79 67 6f 6e 20 70 50 6f 6c 79 2e 0a 2a 2f 0a 73  ygon pPoly..*/.s
4c90: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f 70 6f  tatic void geopo
4ca0: 6c 79 41 64 64 53 65 67 6d 65 6e 74 73 28 0a 20  lyAddSegments(. 
4cb0: 20 47 65 6f 4f 76 65 72 6c 61 70 20 2a 70 2c 20   GeoOverlap *p, 
4cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
4cd0: 73 65 67 6d 65 6e 74 73 20 74 6f 20 74 68 69 73  segments to this
4ce0: 20 4f 76 65 72 6c 61 70 20 6f 62 6a 65 63 74 20   Overlap object 
4cf0: 2a 2f 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 50  */.  GeoPoly *pP
4d00: 6f 6c 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  oly,         /* 
4d10: 54 61 6b 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74  Take all segment
4d20: 73 20 66 72 6f 6d 20 74 68 69 73 20 70 6f 6c 79  s from this poly
4d30: 67 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  gon */.  unsigne
4d40: 64 20 63 68 61 72 20 73 69 64 65 20 20 20 20 20  d char side     
4d50: 20 2f 2a 20 54 68 65 20 73 69 64 65 20 6f 66 20   /* The side of 
4d60: 70 50 6f 6c 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e  pPoly */.){.  un
4d70: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
4d80: 47 65 6f 43 6f 6f 72 64 20 2a 78 3b 0a 20 20 66  GeoCoord *x;.  f
4d90: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 6f 6c 79 2d  or(i=0; i<pPoly-
4da0: 3e 6e 56 65 72 74 65 78 2d 31 3b 20 69 2b 2b 29  >nVertex-1; i++)
4db0: 7b 0a 20 20 20 20 78 20 3d 20 70 50 6f 6c 79 2d  {.    x = pPoly-
4dc0: 3e 61 20 2b 20 28 69 2a 32 29 3b 0a 20 20 20 20  >a + (i*2);.    
4dd0: 67 65 6f 70 6f 6c 79 41 64 64 4f 6e 65 53 65 67  geopolyAddOneSeg
4de0: 6d 65 6e 74 28 70 2c 20 78 5b 30 5d 2c 20 78 5b  ment(p, x[0], x[
4df0: 31 5d 2c 20 78 5b 32 5d 2c 20 78 5b 33 5d 2c 20  1], x[2], x[3], 
4e00: 73 69 64 65 2c 20 69 29 3b 0a 20 20 7d 0a 20 20  side, i);.  }.  
4e10: 78 20 3d 20 70 50 6f 6c 79 2d 3e 61 20 2b 20 28  x = pPoly->a + (
4e20: 69 2a 32 29 3b 0a 20 20 67 65 6f 70 6f 6c 79 41  i*2);.  geopolyA
4e30: 64 64 4f 6e 65 53 65 67 6d 65 6e 74 28 70 2c 20  ddOneSegment(p, 
4e40: 78 5b 30 5d 2c 20 78 5b 31 5d 2c 20 70 50 6f 6c  x[0], x[1], pPol
4e50: 79 2d 3e 61 5b 30 5d 2c 20 70 50 6f 6c 79 2d 3e  y->a[0], pPoly->
4e60: 61 5b 31 5d 2c 20 73 69 64 65 2c 20 69 29 3b 0a  a[1], side, i);.
4e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74  }../*.** Merge t
4e80: 77 6f 20 6c 69 73 74 73 20 6f 66 20 73 6f 72 74  wo lists of sort
4e90: 65 64 20 65 76 65 6e 74 73 20 62 79 20 58 20 63  ed events by X c
4ea0: 6f 6f 72 64 69 6e 61 74 65 0a 2a 2f 0a 73 74 61  oordinate.*/.sta
4eb0: 74 69 63 20 47 65 6f 45 76 65 6e 74 20 2a 67 65  tic GeoEvent *ge
4ec0: 6f 70 6f 6c 79 45 76 65 6e 74 4d 65 72 67 65 28  opolyEventMerge(
4ed0: 47 65 6f 45 76 65 6e 74 20 2a 70 4c 65 66 74 2c  GeoEvent *pLeft,
4ee0: 20 47 65 6f 45 76 65 6e 74 20 2a 70 52 69 67 68   GeoEvent *pRigh
4ef0: 74 29 7b 0a 20 20 47 65 6f 45 76 65 6e 74 20 68  t){.  GeoEvent h
4f00: 65 61 64 2c 20 2a 70 4c 61 73 74 3b 0a 20 20 68  ead, *pLast;.  h
4f10: 65 61 64 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ead.pNext = 0;. 
4f20: 20 70 4c 61 73 74 20 3d 20 26 68 65 61 64 3b 0a   pLast = &head;.
4f30: 20 20 77 68 69 6c 65 28 20 70 52 69 67 68 74 20    while( pRight 
4f40: 26 26 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  && pLeft ){.    
4f50: 69 66 28 20 70 52 69 67 68 74 2d 3e 78 20 3c 3d  if( pRight->x <=
4f60: 20 70 4c 65 66 74 2d 3e 78 20 29 7b 0a 20 20 20   pLeft->x ){.   
4f70: 20 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20     pLast->pNext 
4f80: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
4f90: 70 4c 61 73 74 20 3d 20 70 52 69 67 68 74 3b 0a  pLast = pRight;.
4fa0: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
4fb0: 52 69 67 68 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  Right->pNext;.  
4fc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
4fd0: 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Last->pNext = pL
4fe0: 65 66 74 3b 0a 20 20 20 20 20 20 70 4c 61 73 74  eft;.      pLast
4ff0: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
5000: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 2d 3e 70  pLeft = pLeft->p
5010: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
5020: 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d    pLast->pNext =
5030: 20 70 52 69 67 68 74 20 3f 20 70 52 69 67 68 74   pRight ? pRight
5040: 20 3a 20 70 4c 65 66 74 3b 0a 20 20 72 65 74 75   : pLeft;.  retu
5050: 72 6e 20 68 65 61 64 2e 70 4e 65 78 74 3b 20 20  rn head.pNext;  
5060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61  .}../*.** Sort a
5070: 6e 20 61 72 72 61 79 20 6f 66 20 6e 45 76 65 6e  n array of nEven
5080: 74 20 65 76 65 6e 74 20 6f 62 6a 65 63 74 73 20  t event objects 
5090: 69 6e 74 6f 20 61 20 6c 69 73 74 2e 0a 2a 2f 0a  into a list..*/.
50a0: 73 74 61 74 69 63 20 47 65 6f 45 76 65 6e 74 20  static GeoEvent 
50b0: 2a 67 65 6f 70 6f 6c 79 53 6f 72 74 45 76 65 6e  *geopolySortEven
50c0: 74 73 42 79 58 28 47 65 6f 45 76 65 6e 74 20 2a  tsByX(GeoEvent *
50d0: 61 45 76 65 6e 74 2c 20 69 6e 74 20 6e 45 76 65  aEvent, int nEve
50e0: 6e 74 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20  nt){.  int mx = 
50f0: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
5100: 20 47 65 6f 45 76 65 6e 74 20 2a 70 3b 0a 20 20   GeoEvent *p;.  
5110: 47 65 6f 45 76 65 6e 74 20 2a 61 5b 35 30 5d 3b  GeoEvent *a[50];
5120: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45  .  for(i=0; i<nE
5130: 76 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  vent; i++){.    
5140: 70 20 3d 20 26 61 45 76 65 6e 74 5b 69 5d 3b 0a  p = &aEvent[i];.
5150: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30      p->pNext = 0
5160: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
5170: 3c 6d 78 20 26 26 20 61 5b 6a 5d 3b 20 6a 2b 2b  <mx && a[j]; j++
5180: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 67 65 6f  ){.      p = geo
5190: 70 6f 6c 79 45 76 65 6e 74 4d 65 72 67 65 28 61  polyEventMerge(a
51a0: 5b 6a 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 61  [j], p);.      a
51b0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [j] = 0;.    }. 
51c0: 20 20 20 61 5b 6a 5d 20 3d 20 70 3b 0a 20 20 20     a[j] = p;.   
51d0: 20 69 66 28 20 6a 3e 3d 6d 78 20 29 20 6d 78 20   if( j>=mx ) mx 
51e0: 3d 20 6a 2b 31 3b 0a 20 20 7d 0a 20 20 70 20 3d  = j+1;.  }.  p =
51f0: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
5200: 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  <mx; i++){.    p
5210: 20 3d 20 67 65 6f 70 6f 6c 79 45 76 65 6e 74 4d   = geopolyEventM
5220: 65 72 67 65 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  erge(a[i], p);. 
5230: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
5240: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77  ../*.** Merge tw
5250: 6f 20 6c 69 73 74 73 20 6f 66 20 73 6f 72 74 65  o lists of sorte
5260: 64 20 73 65 67 6d 65 6e 74 73 20 62 79 20 59 2c  d segments by Y,
5270: 20 61 6e 64 20 74 68 65 6e 20 62 79 20 43 2e 0a   and then by C..
5280: 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f 53 65 67  */.static GeoSeg
5290: 6d 65 6e 74 20 2a 67 65 6f 70 6f 6c 79 53 65 67  ment *geopolySeg
52a0: 6d 65 6e 74 4d 65 72 67 65 28 47 65 6f 53 65 67  mentMerge(GeoSeg
52b0: 6d 65 6e 74 20 2a 70 4c 65 66 74 2c 20 47 65 6f  ment *pLeft, Geo
52c0: 53 65 67 6d 65 6e 74 20 2a 70 52 69 67 68 74 29  Segment *pRight)
52d0: 7b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 68  {.  GeoSegment h
52e0: 65 61 64 2c 20 2a 70 4c 61 73 74 3b 0a 20 20 68  ead, *pLast;.  h
52f0: 65 61 64 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ead.pNext = 0;. 
5300: 20 70 4c 61 73 74 20 3d 20 26 68 65 61 64 3b 0a   pLast = &head;.
5310: 20 20 77 68 69 6c 65 28 20 70 52 69 67 68 74 20    while( pRight 
5320: 26 26 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  && pLeft ){.    
5330: 64 6f 75 62 6c 65 20 72 20 3d 20 70 52 69 67 68  double r = pRigh
5340: 74 2d 3e 79 20 2d 20 70 4c 65 66 74 2d 3e 79 3b  t->y - pLeft->y;
5350: 0a 20 20 20 20 69 66 28 20 72 3d 3d 30 2e 30 20  .    if( r==0.0 
5360: 29 20 72 20 3d 20 70 52 69 67 68 74 2d 3e 43 20  ) r = pRight->C 
5370: 2d 20 70 4c 65 66 74 2d 3e 43 3b 0a 20 20 20 20  - pLeft->C;.    
5380: 69 66 28 20 72 3c 30 2e 30 20 29 7b 0a 20 20 20  if( r<0.0 ){.   
5390: 20 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20     pLast->pNext 
53a0: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
53b0: 70 4c 61 73 74 20 3d 20 70 52 69 67 68 74 3b 0a  pLast = pRight;.
53c0: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
53d0: 52 69 67 68 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  Right->pNext;.  
53e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
53f0: 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Last->pNext = pL
5400: 65 66 74 3b 0a 20 20 20 20 20 20 70 4c 61 73 74  eft;.      pLast
5410: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
5420: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 2d 3e 70  pLeft = pLeft->p
5430: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
5440: 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d    pLast->pNext =
5450: 20 70 52 69 67 68 74 20 3f 20 70 52 69 67 68 74   pRight ? pRight
5460: 20 3a 20 70 4c 65 66 74 3b 0a 20 20 72 65 74 75   : pLeft;.  retu
5470: 72 6e 20 68 65 61 64 2e 70 4e 65 78 74 3b 20 20  rn head.pNext;  
5480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61  .}../*.** Sort a
5490: 20 6c 69 73 74 20 6f 66 20 47 65 6f 53 65 67 6d   list of GeoSegm
54a0: 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20 6f 66  ents in order of
54b0: 20 69 6e 63 72 65 61 73 69 6e 67 20 59 20 61 6e   increasing Y an
54c0: 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
54d0: 66 0a 2a 2a 20 61 20 74 69 65 2c 20 69 6e 63 72  f.** a tie, incr
54e0: 65 61 73 69 6e 67 20 43 20 28 73 6c 6f 70 65 29  easing C (slope)
54f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f 53  ..*/.static GeoS
5500: 65 67 6d 65 6e 74 20 2a 67 65 6f 70 6f 6c 79 53  egment *geopolyS
5510: 6f 72 74 53 65 67 6d 65 6e 74 73 42 79 59 41 6e  ortSegmentsByYAn
5520: 64 43 28 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70  dC(GeoSegment *p
5530: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 20  List){.  int mx 
5540: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
5550: 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70 3b 0a 20  GeoSegment *p;. 
5560: 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a 61 5b 35   GeoSegment *a[5
5570: 30 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  0];.  while( pLi
5580: 73 74 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 4c  st ){.    p = pL
5590: 69 73 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  ist;.    pList =
55a0: 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20   pList->pNext;. 
55b0: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b     p->pNext = 0;
55c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
55d0: 6d 78 20 26 26 20 61 5b 69 5d 3b 20 69 2b 2b 29  mx && a[i]; i++)
55e0: 7b 0a 20 20 20 20 20 20 70 20 3d 20 67 65 6f 70  {.      p = geop
55f0: 6f 6c 79 53 65 67 6d 65 6e 74 4d 65 72 67 65 28  olySegmentMerge(
5600: 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20  a[i], p);.      
5610: 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  a[i] = 0;.    }.
5620: 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20      a[i] = p;.  
5630: 20 20 69 66 28 20 69 3e 3d 6d 78 20 29 20 6d 78    if( i>=mx ) mx
5640: 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 70 20   = i+1;.  }.  p 
5650: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
5660: 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<mx; i++){.    
5670: 70 20 3d 20 67 65 6f 70 6f 6c 79 53 65 67 6d 65  p = geopolySegme
5680: 6e 74 4d 65 72 67 65 28 61 5b 69 5d 2c 20 70 29  ntMerge(a[i], p)
5690: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
56a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
56b0: 6d 69 6e 65 20 74 68 65 20 6f 76 65 72 6c 61 70  mine the overlap
56c0: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 70 6f 6c   between two pol
56d0: 79 67 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ygons.*/.static 
56e0: 69 6e 74 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c  int geopolyOverl
56f0: 61 70 28 47 65 6f 50 6f 6c 79 20 2a 70 31 2c 20  ap(GeoPoly *p1, 
5700: 47 65 6f 50 6f 6c 79 20 2a 70 32 29 7b 0a 20 20  GeoPoly *p2){.  
5710: 69 6e 74 20 6e 56 65 72 74 65 78 20 3d 20 70 31  int nVertex = p1
5720: 2d 3e 6e 56 65 72 74 65 78 20 2b 20 70 32 2d 3e  ->nVertex + p2->
5730: 6e 56 65 72 74 65 78 20 2b 20 32 3b 0a 20 20 47  nVertex + 2;.  G
5740: 65 6f 4f 76 65 72 6c 61 70 20 2a 70 3b 0a 20 20  eoOverlap *p;.  
5750: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 47 65 6f  int nByte;.  Geo
5760: 45 76 65 6e 74 20 2a 70 54 68 69 73 45 76 65 6e  Event *pThisEven
5770: 74 3b 0a 20 20 64 6f 75 62 6c 65 20 72 58 3b 0a  t;.  double rX;.
5780: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
5790: 69 6e 74 20 6e 65 65 64 53 6f 72 74 20 3d 20 30  int needSort = 0
57a0: 3b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a  ;.  GeoSegment *
57b0: 70 41 63 74 69 76 65 20 3d 20 30 3b 0a 20 20 47  pActive = 0;.  G
57c0: 65 6f 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  eoSegment *pSeg;
57d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
57e0: 20 61 4f 76 65 72 6c 61 70 5b 34 5d 3b 0a 0a 20   aOverlap[4];.. 
57f0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
5800: 47 65 6f 45 76 65 6e 74 29 2a 6e 56 65 72 74 65  GeoEvent)*nVerte
5810: 78 2a 32 20 0a 20 20 20 20 20 20 20 20 20 20 20  x*2 .           
5820: 2b 20 73 69 7a 65 6f 66 28 47 65 6f 53 65 67 6d  + sizeof(GeoSegm
5830: 65 6e 74 29 2a 6e 56 65 72 74 65 78 20 0a 20 20  ent)*nVertex .  
5840: 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
5850: 66 28 47 65 6f 4f 76 65 72 6c 61 70 29 3b 0a 20  f(GeoOverlap);. 
5860: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
5870: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
5880: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5890: 6e 20 2d 31 3b 0a 20 20 70 2d 3e 61 45 76 65 6e  n -1;.  p->aEven
58a0: 74 20 3d 20 28 47 65 6f 45 76 65 6e 74 2a 29 26  t = (GeoEvent*)&
58b0: 70 5b 31 5d 3b 0a 20 20 70 2d 3e 61 53 65 67 6d  p[1];.  p->aSegm
58c0: 65 6e 74 20 3d 20 28 47 65 6f 53 65 67 6d 65 6e  ent = (GeoSegmen
58d0: 74 2a 29 26 70 2d 3e 61 45 76 65 6e 74 5b 6e 56  t*)&p->aEvent[nV
58e0: 65 72 74 65 78 2a 32 5d 3b 0a 20 20 70 2d 3e 6e  ertex*2];.  p->n
58f0: 45 76 65 6e 74 20 3d 20 70 2d 3e 6e 53 65 67 6d  Event = p->nSegm
5900: 65 6e 74 20 3d 20 30 3b 0a 20 20 67 65 6f 70 6f  ent = 0;.  geopo
5910: 6c 79 41 64 64 53 65 67 6d 65 6e 74 73 28 70 2c  lyAddSegments(p,
5920: 20 70 31 2c 20 31 29 3b 0a 20 20 67 65 6f 70 6f   p1, 1);.  geopo
5930: 6c 79 41 64 64 53 65 67 6d 65 6e 74 73 28 70 2c  lyAddSegments(p,
5940: 20 70 32 2c 20 32 29 3b 0a 20 20 70 54 68 69 73   p2, 2);.  pThis
5950: 45 76 65 6e 74 20 3d 20 67 65 6f 70 6f 6c 79 53  Event = geopolyS
5960: 6f 72 74 45 76 65 6e 74 73 42 79 58 28 70 2d 3e  ortEventsByX(p->
5970: 61 45 76 65 6e 74 2c 20 70 2d 3e 6e 45 76 65 6e  aEvent, p->nEven
5980: 74 29 3b 0a 20 20 72 58 20 3d 20 70 54 68 69 73  t);.  rX = pThis
5990: 45 76 65 6e 74 2d 3e 78 3d 3d 30 2e 30 20 3f 20  Event->x==0.0 ? 
59a0: 2d 31 2e 30 20 3a 20 30 2e 30 3b 0a 20 20 6d 65  -1.0 : 0.0;.  me
59b0: 6d 73 65 74 28 61 4f 76 65 72 6c 61 70 2c 20 30  mset(aOverlap, 0
59c0: 2c 20 73 69 7a 65 6f 66 28 61 4f 76 65 72 6c 61  , sizeof(aOverla
59d0: 70 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54  p));.  while( pT
59e0: 68 69 73 45 76 65 6e 74 20 29 7b 0a 20 20 20 20  hisEvent ){.    
59f0: 69 66 28 20 70 54 68 69 73 45 76 65 6e 74 2d 3e  if( pThisEvent->
5a00: 78 21 3d 72 58 20 29 7b 0a 20 20 20 20 20 20 47  x!=rX ){.      G
5a10: 65 6f 53 65 67 6d 65 6e 74 20 2a 70 50 72 65 76  eoSegment *pPrev
5a20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
5a30: 69 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20  iMask = 0;.     
5a40: 20 47 45 4f 44 45 42 55 47 28 28 22 44 69 73 74   GEODEBUG(("Dist
5a50: 69 6e 63 74 20 58 3a 20 25 67 5c 6e 22 2c 20 70  inct X: %g\n", p
5a60: 54 68 69 73 45 76 65 6e 74 2d 3e 78 29 29 3b 0a  ThisEvent->x));.
5a70: 20 20 20 20 20 20 72 58 20 3d 20 70 54 68 69 73        rX = pThis
5a80: 45 76 65 6e 74 2d 3e 78 3b 0a 20 20 20 20 20 20  Event->x;.      
5a90: 69 66 28 20 6e 65 65 64 53 6f 72 74 20 29 7b 0a  if( needSort ){.
5aa0: 20 20 20 20 20 20 20 20 47 45 4f 44 45 42 55 47          GEODEBUG
5ab0: 28 28 22 53 4f 52 54 5c 6e 22 29 29 3b 0a 20 20  (("SORT\n"));.  
5ac0: 20 20 20 20 20 20 70 41 63 74 69 76 65 20 3d 20        pActive = 
5ad0: 67 65 6f 70 6f 6c 79 53 6f 72 74 53 65 67 6d 65  geopolySortSegme
5ae0: 6e 74 73 42 79 59 41 6e 64 43 28 70 41 63 74 69  ntsByYAndC(pActi
5af0: 76 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  ve);.        nee
5b00: 64 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  dSort = 0;.     
5b10: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 70 53 65   }.      for(pSe
5b20: 67 3d 70 41 63 74 69 76 65 3b 20 70 53 65 67 3b  g=pActive; pSeg;
5b30: 20 70 53 65 67 3d 70 53 65 67 2d 3e 70 4e 65 78   pSeg=pSeg->pNex
5b40: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
5b50: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
5b60: 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e 79 21     if( pPrev->y!
5b70: 3d 70 53 65 67 2d 3e 79 20 29 7b 0a 20 20 20 20  =pSeg->y ){.    
5b80: 20 20 20 20 20 20 20 20 47 45 4f 44 45 42 55 47          GEODEBUG
5b90: 28 28 22 4d 41 53 4b 3a 20 25 64 5c 6e 22 2c 20  (("MASK: %d\n", 
5ba0: 69 4d 61 73 6b 29 29 3b 0a 20 20 20 20 20 20 20  iMask));.       
5bb0: 20 20 20 20 20 61 4f 76 65 72 6c 61 70 5b 69 4d       aOverlap[iM
5bc0: 61 73 6b 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20  ask] = 1;.      
5bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
5be0: 20 20 20 20 20 20 20 20 69 4d 61 73 6b 20 5e 3d          iMask ^=
5bf0: 20 70 53 65 67 2d 3e 73 69 64 65 3b 0a 20 20 20   pSeg->side;.   
5c00: 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 53 65       pPrev = pSe
5c10: 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  g;.      }.     
5c20: 20 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20   pPrev = 0;.    
5c30: 20 20 66 6f 72 28 70 53 65 67 3d 70 41 63 74 69    for(pSeg=pActi
5c40: 76 65 3b 20 70 53 65 67 3b 20 70 53 65 67 3d 70  ve; pSeg; pSeg=p
5c50: 53 65 67 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Seg->pNext){.   
5c60: 20 20 20 20 20 64 6f 75 62 6c 65 20 79 20 3d 20       double y = 
5c70: 70 53 65 67 2d 3e 43 2a 72 58 20 2b 20 70 53 65  pSeg->C*rX + pSe
5c80: 67 2d 3e 42 3b 0a 20 20 20 20 20 20 20 20 47 45  g->B;.        GE
5c90: 4f 44 45 42 55 47 28 28 22 53 65 67 6d 65 6e 74  ODEBUG(("Segment
5ca0: 20 25 64 2e 25 64 20 25 67 2d 3e 25 67 5c 6e 22   %d.%d %g->%g\n"
5cb0: 2c 20 70 53 65 67 2d 3e 73 69 64 65 2c 20 70 53  , pSeg->side, pS
5cc0: 65 67 2d 3e 69 64 78 2c 20 70 53 65 67 2d 3e 79  eg->idx, pSeg->y
5cd0: 2c 20 79 29 29 3b 0a 20 20 20 20 20 20 20 20 70  , y));.        p
5ce0: 53 65 67 2d 3e 79 20 3d 20 79 3b 0a 20 20 20 20  Seg->y = y;.    
5cf0: 20 20 20 20 69 66 28 20 70 50 72 65 76 20 29 7b      if( pPrev ){
5d00: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5d10: 50 72 65 76 2d 3e 79 3e 70 53 65 67 2d 3e 79 20  Prev->y>pSeg->y 
5d20: 26 26 20 70 50 72 65 76 2d 3e 73 69 64 65 21 3d  && pPrev->side!=
5d30: 70 53 65 67 2d 3e 73 69 64 65 20 29 7b 0a 20 20  pSeg->side ){.  
5d40: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
5d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 45  ;.            GE
5d60: 4f 44 45 42 55 47 28 28 22 43 72 6f 73 73 69 6e  ODEBUG(("Crossin
5d70: 67 3a 20 25 64 2e 25 64 20 61 6e 64 20 25 64 2e  g: %d.%d and %d.
5d80: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
5d90: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76             pPrev
5da0: 2d 3e 73 69 64 65 2c 20 70 50 72 65 76 2d 3e 69  ->side, pPrev->i
5db0: 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx,.            
5dc0: 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 73 69          pSeg->si
5dd0: 64 65 2c 20 70 53 65 67 2d 3e 69 64 78 29 29 3b  de, pSeg->idx));
5de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
5df0: 6f 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c 61 70  o geopolyOverlap
5e00: 44 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Done;.          
5e10: 7d 65 6c 73 65 20 69 66 28 20 70 50 72 65 76 2d  }else if( pPrev-
5e20: 3e 79 21 3d 70 53 65 67 2d 3e 79 20 29 7b 0a 20  >y!=pSeg->y ){. 
5e30: 20 20 20 20 20 20 20 20 20 20 20 47 45 4f 44 45             GEODE
5e40: 42 55 47 28 28 22 4d 41 53 4b 3a 20 25 64 5c 6e  BUG(("MASK: %d\n
5e50: 22 2c 20 69 4d 61 73 6b 29 29 3b 0a 20 20 20 20  ", iMask));.    
5e60: 20 20 20 20 20 20 20 20 61 4f 76 65 72 6c 61 70          aOverlap
5e70: 5b 69 4d 61 73 6b 5d 20 3d 20 31 3b 0a 20 20 20  [iMask] = 1;.   
5e80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5e90: 20 7d 0a 20 20 20 20 20 20 20 20 69 4d 61 73 6b   }.        iMask
5ea0: 20 5e 3d 20 70 53 65 67 2d 3e 73 69 64 65 3b 0a   ^= pSeg->side;.
5eb0: 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d 20          pPrev = 
5ec0: 70 53 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pSeg;.      }.  
5ed0: 20 20 7d 0a 20 20 20 20 47 45 4f 44 45 42 55 47    }.    GEODEBUG
5ee0: 28 28 22 25 73 20 25 64 2e 25 64 20 43 3d 25 67  (("%s %d.%d C=%g
5ef0: 20 42 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20   B=%g\n",.      
5f00: 70 54 68 69 73 45 76 65 6e 74 2d 3e 65 54 79 70  pThisEvent->eTyp
5f10: 65 20 3f 20 22 52 4d 20 22 20 3a 20 22 41 44 44  e ? "RM " : "ADD
5f20: 22 2c 0a 20 20 20 20 20 20 70 54 68 69 73 45 76  ",.      pThisEv
5f30: 65 6e 74 2d 3e 70 53 65 67 2d 3e 73 69 64 65 2c  ent->pSeg->side,
5f40: 20 70 54 68 69 73 45 76 65 6e 74 2d 3e 70 53 65   pThisEvent->pSe
5f50: 67 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20 70 54  g->idx,.      pT
5f60: 68 69 73 45 76 65 6e 74 2d 3e 70 53 65 67 2d 3e  hisEvent->pSeg->
5f70: 43 2c 0a 20 20 20 20 20 20 70 54 68 69 73 45 76  C,.      pThisEv
5f80: 65 6e 74 2d 3e 70 53 65 67 2d 3e 42 29 29 3b 0a  ent->pSeg->B));.
5f90: 20 20 20 20 69 66 28 20 70 54 68 69 73 45 76 65      if( pThisEve
5fa0: 6e 74 2d 3e 65 54 79 70 65 3d 3d 30 20 29 7b 0a  nt->eType==0 ){.
5fb0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 73        /* Add a s
5fc0: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  egment */.      
5fd0: 70 53 65 67 20 3d 20 70 54 68 69 73 45 76 65 6e  pSeg = pThisEven
5fe0: 74 2d 3e 70 53 65 67 3b 0a 20 20 20 20 20 20 70  t->pSeg;.      p
5ff0: 53 65 67 2d 3e 79 20 3d 20 70 53 65 67 2d 3e 79  Seg->y = pSeg->y
6000: 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  0;.      pSeg->p
6010: 4e 65 78 74 20 3d 20 70 41 63 74 69 76 65 3b 0a  Next = pActive;.
6020: 20 20 20 20 20 20 70 41 63 74 69 76 65 20 3d 20        pActive = 
6030: 70 53 65 67 3b 0a 20 20 20 20 20 20 6e 65 65 64  pSeg;.      need
6040: 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65  Sort = 1;.    }e
6050: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  lse{.      /* Re
6060: 6d 6f 76 65 20 61 20 73 65 67 6d 65 6e 74 20 2a  move a segment *
6070: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 63 74  /.      if( pAct
6080: 69 76 65 3d 3d 70 54 68 69 73 45 76 65 6e 74 2d  ive==pThisEvent-
6090: 3e 70 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20  >pSeg ){.       
60a0: 20 70 41 63 74 69 76 65 20 3d 20 70 41 63 74 69   pActive = pActi
60b0: 76 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ve->pNext;.     
60c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
60d0: 66 6f 72 28 70 53 65 67 3d 70 41 63 74 69 76 65  for(pSeg=pActive
60e0: 3b 20 70 53 65 67 3b 20 70 53 65 67 3d 70 53 65  ; pSeg; pSeg=pSe
60f0: 67 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  g->pNext){.     
6100: 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70       if( pSeg->p
6110: 4e 65 78 74 3d 3d 70 54 68 69 73 45 76 65 6e 74  Next==pThisEvent
6120: 2d 3e 70 53 65 67 20 29 7b 0a 20 20 20 20 20 20  ->pSeg ){.      
6130: 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4e 65 78        pSeg->pNex
6140: 74 20 3d 20 70 53 65 67 2d 3e 70 4e 65 78 74 2d  t = pSeg->pNext-
6150: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
6160: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6180: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6190: 20 20 20 70 54 68 69 73 45 76 65 6e 74 20 3d 20     pThisEvent = 
61a0: 70 54 68 69 73 45 76 65 6e 74 2d 3e 70 4e 65 78  pThisEvent->pNex
61b0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 4f 76  t;.  }.  if( aOv
61c0: 65 72 6c 61 70 5b 33 5d 3d 3d 30 20 29 7b 0a 20  erlap[3]==0 ){. 
61d0: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 65 6c     rc = 0;.  }el
61e0: 73 65 20 69 66 28 20 61 4f 76 65 72 6c 61 70 5b  se if( aOverlap[
61f0: 31 5d 21 3d 30 20 26 26 20 61 4f 76 65 72 6c 61  1]!=0 && aOverla
6200: 70 5b 32 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72  p[2]==0 ){.    r
6210: 63 20 3d 20 33 3b 0a 20 20 7d 65 6c 73 65 20 69  c = 3;.  }else i
6220: 66 28 20 61 4f 76 65 72 6c 61 70 5b 31 5d 3d 3d  f( aOverlap[1]==
6230: 30 20 26 26 20 61 4f 76 65 72 6c 61 70 5b 32 5d  0 && aOverlap[2]
6240: 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
6250: 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  2;.  }else if( a
6260: 4f 76 65 72 6c 61 70 5b 31 5d 3d 3d 30 20 26 26  Overlap[1]==0 &&
6270: 20 61 4f 76 65 72 6c 61 70 5b 32 5d 3d 3d 30 20   aOverlap[2]==0 
6280: 29 7b 0a 20 20 20 20 72 63 20 3d 20 34 3b 0a 20  ){.    rc = 4;. 
6290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
62a0: 20 31 3b 0a 20 20 7d 0a 0a 67 65 6f 70 6f 6c 79   1;.  }..geopoly
62b0: 4f 76 65 72 6c 61 70 44 6f 6e 65 3a 0a 20 20 73  OverlapDone:.  s
62c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
62d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
62e0: 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  /*.** SQL functi
62f0: 6f 6e 3a 20 20 20 20 67 65 6f 70 6f 6c 79 5f 6f  on:    geopoly_o
6300: 76 65 72 6c 61 70 28 50 31 2c 50 32 29 0a 2a 2a  verlap(P1,P2).**
6310: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
6320: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 50 31 20  ether or not P1 
6330: 61 6e 64 20 50 32 20 6f 76 65 72 6c 61 70 2e 20  and P2 overlap. 
6340: 52 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a  Return value:.**
6350: 0a 2a 2a 20 20 20 30 20 20 20 20 20 54 68 65 20  .**   0     The 
6360: 74 77 6f 20 70 6f 6c 79 67 6f 6e 73 20 61 72 65  two polygons are
6370: 20 64 69 73 6a 6f 69 6e 74 0a 2a 2a 20 20 20 31   disjoint.**   1
6380: 20 20 20 20 20 54 68 65 79 20 6f 76 65 72 6c 61       They overla
6390: 70 0a 2a 2a 20 20 20 32 20 20 20 20 20 50 31 20  p.**   2     P1 
63a0: 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f  is completely co
63b0: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 50  ntained within P
63c0: 32 0a 2a 2a 20 20 20 33 20 20 20 20 20 50 32 20  2.**   3     P2 
63d0: 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f  is completely co
63e0: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 50  ntained within P
63f0: 31 0a 2a 2a 20 20 20 34 20 20 20 20 20 50 31 20  1.**   4     P1 
6400: 61 6e 64 20 50 32 20 61 72 65 20 74 68 65 20 73  and P2 are the s
6410: 61 6d 65 20 70 6f 6c 79 67 6f 6e 0a 2a 2a 20 20  ame polygon.**  
6420: 20 4e 55 4c 4c 20 20 45 69 74 68 65 72 20 50 31   NULL  Either P1
6430: 20 6f 72 20 50 32 20 6f 72 20 62 6f 74 68 20 61   or P2 or both a
6440: 72 65 20 6e 6f 74 20 76 61 6c 69 64 20 70 6f 6c  re not valid pol
6450: 79 67 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ygons.*/.static 
6460: 76 6f 69 64 20 67 65 6f 70 6f 6c 79 4f 76 65 72  void geopolyOver
6470: 6c 61 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  lapFunc(.  sqlit
6480: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
6490: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
64a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
64b0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65 6f   **argv.){.  Geo
64c0: 50 6f 6c 79 20 2a 70 31 20 3d 20 67 65 6f 70 6f  Poly *p1 = geopo
64d0: 6c 79 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74  lyFuncParam(cont
64e0: 65 78 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29  ext, argv[0], 0)
64f0: 3b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 32 20  ;.  GeoPoly *p2 
6500: 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72  = geopolyFuncPar
6510: 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  am(context, argv
6520: 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  [1], 0);.  if( p
6530: 31 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20 69  1 && p2 ){.    i
6540: 6e 74 20 78 20 3d 20 67 65 6f 70 6f 6c 79 4f 76  nt x = geopolyOv
6550: 65 72 6c 61 70 28 70 31 2c 20 70 32 29 3b 0a 20  erlap(p1, p2);. 
6560: 20 20 20 69 66 28 20 78 3c 30 20 29 7b 0a 20 20     if( x<0 ){.  
6570: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6580: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
6590: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c  ontext);.    }el
65a0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
65b0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
65c0: 74 65 78 74 2c 20 78 29 3b 0a 20 20 20 20 7d 0a  text, x);.    }.
65d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
65e0: 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p1);.  sqlite
65f0: 33 5f 66 72 65 65 28 70 32 29 3b 0a 7d 0a 0a 2f  3_free(p2);.}../
6600: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
6610: 69 73 61 62 6c 65 20 64 65 62 75 67 67 69 6e 67  isable debugging
6620: 20 6f 75 74 70 75 74 0a 2a 2f 0a 73 74 61 74 69   output.*/.stati
6630: 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 44 65  c void geopolyDe
6640: 62 75 67 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  bugFunc(.  sqlit
6650: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
6660: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
6670: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
6680: 20 2a 2a 61 72 67 76 0a 29 7b 0a 23 69 66 64 65   **argv.){.#ifde
6690: 66 20 47 45 4f 50 4f 4c 59 5f 45 4e 41 42 4c 45  f GEOPOLY_ENABLE
66a0: 5f 44 45 42 55 47 0a 20 20 67 65 6f 5f 64 65 62  _DEBUG.  geo_deb
66b0: 75 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ug = sqlite3_val
66c0: 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b  ue_int(argv[0]);
66d0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a  .#endif.}../* .*
66e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
66f0: 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  is the implement
6700: 61 74 69 6f 6e 20 6f 66 20 62 6f 74 68 20 74 68  ation of both th
6710: 65 20 78 43 6f 6e 6e 65 63 74 20 61 6e 64 20 78  e xConnect and x
6720: 43 72 65 61 74 65 0a 2a 2a 20 6d 65 74 68 6f 64  Create.** method
6730: 73 20 6f 66 20 74 68 65 20 67 65 6f 70 6f 6c 79  s of the geopoly
6740: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
6750: 2a 2a 0a 2a 2a 20 20 20 61 72 67 76 5b 30 5d 20  **.**   argv[0] 
6760: 20 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e 61 6d 65    -> module name
6770: 0a 2a 2a 20 20 20 61 72 67 76 5b 31 5d 20 20 20  .**   argv[1]   
6780: 2d 3e 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  -> database name
6790: 0a 2a 2a 20 20 20 61 72 67 76 5b 32 5d 20 20 20  .**   argv[2]   
67a0: 2d 3e 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a  -> table name.**
67b0: 20 20 20 61 72 67 76 5b 2e 2e 2e 5d 20 2d 3e 20     argv[...] -> 
67c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 2e 2e 0a  column names....
67d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
67e0: 6f 70 6f 6c 79 49 6e 69 74 28 0a 20 20 73 71 6c  opolyInit(.  sql
67f0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6810: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
6820: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  nection */.  voi
6830: 64 20 2a 70 41 75 78 2c 20 20 20 20 20 20 20 20  d *pAux,        
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6850: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 52   /* One of the R
6860: 54 52 45 45 5f 43 4f 4f 52 44 5f 2a 20 63 6f 6e  TREE_COORD_* con
6870: 73 74 61 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  stants */.  int 
6880: 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
6890: 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 20 20 20   *const*argv,   
68a0: 2f 2a 20 50 61 72 61 6d 65 74 65 72 73 20 74 6f  /* Parameters to
68b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
68c0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  atement */.  sql
68d0: 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74  ite3_vtab **ppVt
68e0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
68f0: 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 76 69 72   /* OUT: New vir
6900: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
6910: 63 68 61 72 20 2a 2a 70 7a 45 72 72 2c 20 20 20  char **pzErr,   
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6930: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f      /* OUT: Erro
6940: 72 20 6d 65 73 73 61 67 65 2c 20 69 66 20 61 6e  r message, if an
6950: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 72 65  y */.  int isCre
6960: 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ate             
6970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
6980: 75 65 20 66 6f 72 20 78 43 72 65 61 74 65 2c 20  ue for xCreate, 
6990: 66 61 6c 73 65 20 66 6f 72 20 78 43 6f 6e 6e 65  false for xConne
69a0: 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ct */.){.  int r
69b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
69c0: 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 3b 0a   Rtree *pRtree;.
69d0: 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20    int nDb;      
69e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
69f0: 68 20 6f 66 20 73 74 72 69 6e 67 20 61 72 67 76  h of string argv
6a00: 5b 31 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  [1] */.  int nNa
6a10: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
6a20: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69  * Length of stri
6a30: 6e 67 20 61 72 67 76 5b 32 5d 20 2a 2f 0a 20 20  ng argv[2] */.  
6a40: 73 71 6c 69 74 65 33 5f 73 74 72 20 2a 70 53 71  sqlite3_str *pSq
6a50: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  l;.  char *zSql;
6a60: 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 73 71  .  int ii;..  sq
6a70: 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66 69  lite3_vtab_confi
6a80: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 56 54 41  g(db, SQLITE_VTA
6a90: 42 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 53 55 50  B_CONSTRAINT_SUP
6aa0: 50 4f 52 54 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20  PORT, 1);..  /* 
6ab0: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
6ac0: 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74  ite3_vtab struct
6ad0: 75 72 65 20 2a 2f 0a 20 20 6e 44 62 20 3d 20 28  ure */.  nDb = (
6ae0: 69 6e 74 29 73 74 72 6c 65 6e 28 61 72 67 76 5b  int)strlen(argv[
6af0: 31 5d 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 28  1]);.  nName = (
6b00: 69 6e 74 29 73 74 72 6c 65 6e 28 61 72 67 76 5b  int)strlen(argv[
6b10: 32 5d 29 3b 0a 20 20 70 52 74 72 65 65 20 3d 20  2]);.  pRtree = 
6b20: 28 52 74 72 65 65 20 2a 29 73 71 6c 69 74 65 33  (Rtree *)sqlite3
6b30: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 52  _malloc(sizeof(R
6b40: 74 72 65 65 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b  tree)+nDb+nName+
6b50: 32 29 3b 0a 20 20 69 66 28 20 21 70 52 74 72 65  2);.  if( !pRtre
6b60: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
6b70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6b80: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 52 74 72 65  }.  memset(pRtre
6b90: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72  e, 0, sizeof(Rtr
6ba0: 65 65 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b 32 29  ee)+nDb+nName+2)
6bb0: 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e 42 75 73  ;.  pRtree->nBus
6bc0: 79 20 3d 20 31 3b 0a 20 20 70 52 74 72 65 65 2d  y = 1;.  pRtree-
6bd0: 3e 62 61 73 65 2e 70 4d 6f 64 75 6c 65 20 3d 20  >base.pModule = 
6be0: 26 72 74 72 65 65 4d 6f 64 75 6c 65 3b 0a 20 20  &rtreeModule;.  
6bf0: 70 52 74 72 65 65 2d 3e 7a 44 62 20 3d 20 28 63  pRtree->zDb = (c
6c00: 68 61 72 20 2a 29 26 70 52 74 72 65 65 5b 31 5d  har *)&pRtree[1]
6c10: 3b 0a 20 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d  ;.  pRtree->zNam
6c20: 65 20 3d 20 26 70 52 74 72 65 65 2d 3e 7a 44 62  e = &pRtree->zDb
6c30: 5b 6e 44 62 2b 31 5d 3b 0a 20 20 70 52 74 72 65  [nDb+1];.  pRtre
6c40: 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65 20 3d 20  e->eCoordType = 
6c50: 52 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c  RTREE_COORD_REAL
6c60: 33 32 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e 44  32;.  pRtree->nD
6c70: 69 6d 20 3d 20 32 3b 0a 20 20 70 52 74 72 65 65  im = 2;.  pRtree
6c80: 2d 3e 6e 44 69 6d 32 20 3d 20 34 3b 0a 20 20 6d  ->nDim2 = 4;.  m
6c90: 65 6d 63 70 79 28 70 52 74 72 65 65 2d 3e 7a 44  emcpy(pRtree->zD
6ca0: 62 2c 20 61 72 67 76 5b 31 5d 2c 20 6e 44 62 29  b, argv[1], nDb)
6cb0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 52 74 72 65  ;.  memcpy(pRtre
6cc0: 65 2d 3e 7a 4e 61 6d 65 2c 20 61 72 67 76 5b 32  e->zName, argv[2
6cd0: 5d 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 0a 20 20 2f  ], nName);...  /
6ce0: 2a 20 43 72 65 61 74 65 2f 43 6f 6e 6e 65 63 74  * Create/Connect
6cf0: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
6d00: 6e 67 20 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61  ng relational da
6d10: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
6d20: 66 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 73  f.  ** that is s
6d30: 75 63 63 65 73 73 66 75 6c 2c 20 63 61 6c 6c 20  uccessful, call 
6d40: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
6d50: 76 74 61 62 28 29 20 74 6f 20 63 6f 6e 66 69 67  vtab() to config
6d60: 75 72 65 0a 20 20 2a 2a 20 74 68 65 20 72 2d 74  ure.  ** the r-t
6d70: 72 65 65 20 74 61 62 6c 65 20 73 63 68 65 6d 61  ree table schema
6d80: 2e 0a 20 20 2a 2f 0a 20 20 70 53 71 6c 20 3d 20  ..  */.  pSql = 
6d90: 73 71 6c 69 74 65 33 5f 73 74 72 5f 6e 65 77 28  sqlite3_str_new(
6da0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  db);.  sqlite3_s
6db0: 74 72 5f 61 70 70 65 6e 64 66 28 70 53 71 6c 2c  tr_appendf(pSql,
6dc0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78   "CREATE TABLE x
6dd0: 28 5f 73 68 61 70 65 22 29 3b 0a 20 20 70 52 74  (_shape");.  pRt
6de0: 72 65 65 2d 3e 6e 41 75 78 20 3d 20 31 3b 20 20  ree->nAux = 1;  
6df0: 20 2f 2a 20 41 64 64 20 6f 6e 65 20 66 6f 72 20   /* Add one for 
6e00: 5f 73 68 61 70 65 20 2a 2f 0a 20 20 66 6f 72 28  _shape */.  for(
6e10: 69 69 3d 33 3b 20 69 69 3c 61 72 67 63 3b 20 69  ii=3; ii<argc; i
6e20: 69 2b 2b 29 7b 0a 20 20 20 20 70 52 74 72 65 65  i++){.    pRtree
6e30: 2d 3e 6e 41 75 78 2b 2b 3b 0a 20 20 20 20 73 71  ->nAux++;.    sq
6e40: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
6e50: 66 28 70 53 71 6c 2c 20 22 2c 25 73 22 2c 20 61  f(pSql, ",%s", a
6e60: 72 67 76 5b 69 69 5d 2b 31 29 3b 0a 20 20 7d 0a  rgv[ii]+1);.  }.
6e70: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
6e80: 70 65 6e 64 66 28 70 53 71 6c 2c 20 22 2c 5f 62  pendf(pSql, ",_b
6e90: 62 6f 78 20 48 49 44 44 45 4e 29 3b 22 29 3b 0a  box HIDDEN);");.
6ea0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
6eb0: 5f 73 74 72 5f 66 69 6e 69 73 68 28 70 53 71 6c  _str_finish(pSql
6ec0: 29 3b 0a 20 20 69 66 28 20 21 7a 53 71 6c 20 29  );.  if( !zSql )
6ed0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
6ee0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
6ef0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
6f00: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65  (rc = sqlite3_de
6f10: 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 7a  clare_vtab(db, z
6f20: 53 71 6c 29 29 20 29 7b 0a 20 20 20 20 2a 70 7a  Sql)) ){.    *pz
6f30: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
6f40: 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
6f50: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
6f60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
6f70: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28  ree(zSql);.  if(
6f80: 20 72 63 20 29 20 67 6f 74 6f 20 67 65 6f 70 6f   rc ) goto geopo
6f90: 6c 79 49 6e 69 74 5f 66 61 69 6c 3b 0a 20 20 70  lyInit_fail;.  p
6fa0: 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72  Rtree->nBytesPer
6fb0: 43 65 6c 6c 20 3d 20 38 20 2b 20 70 52 74 72 65  Cell = 8 + pRtre
6fc0: 65 2d 3e 6e 44 69 6d 32 2a 34 3b 0a 0a 20 20 2f  e->nDim2*4;..  /
6fd0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
6fe0: 20 6e 6f 64 65 20 73 69 7a 65 20 74 6f 20 75 73   node size to us
6ff0: 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 67 65 74  e. */.  rc = get
7000: 4e 6f 64 65 53 69 7a 65 28 64 62 2c 20 70 52 74  NodeSize(db, pRt
7010: 72 65 65 2c 20 69 73 43 72 65 61 74 65 2c 20 70  ree, isCreate, p
7020: 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72 63 20  zErr);.  if( rc 
7030: 29 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79 49 6e  ) goto geopolyIn
7040: 69 74 5f 66 61 69 6c 3b 0a 20 20 72 63 20 3d 20  it_fail;.  rc = 
7050: 72 74 72 65 65 53 71 6c 49 6e 69 74 28 70 52 74  rtreeSqlInit(pRt
7060: 72 65 65 2c 20 64 62 2c 20 61 72 67 76 5b 31 5d  ree, db, argv[1]
7070: 2c 20 61 72 67 76 5b 32 5d 2c 20 69 73 43 72 65  , argv[2], isCre
7080: 61 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ate);.  if( rc )
7090: 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73  {.    *pzErr = s
70a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
70b0: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
70c0: 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 67 6f  msg(db));.    go
70d0: 74 6f 20 67 65 6f 70 6f 6c 79 49 6e 69 74 5f 66  to geopolyInit_f
70e0: 61 69 6c 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56  ail;.  }..  *ppV
70f0: 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  tab = (sqlite3_v
7100: 74 61 62 20 2a 29 70 52 74 72 65 65 3b 0a 20 20  tab *)pRtree;.  
7110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7120: 3b 0a 0a 67 65 6f 70 6f 6c 79 49 6e 69 74 5f 66  ;..geopolyInit_f
7130: 61 69 6c 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ail:.  if( rc==S
7140: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
7150: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
7160: 61 73 73 65 72 74 28 20 2a 70 70 56 74 61 62 3d  assert( *ppVtab=
7170: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7180: 70 52 74 72 65 65 2d 3e 6e 42 75 73 79 3d 3d 31  pRtree->nBusy==1
7190: 20 29 3b 0a 20 20 72 74 72 65 65 52 65 6c 65 61   );.  rtreeRelea
71a0: 73 65 28 70 52 74 72 65 65 29 3b 0a 20 20 72 65  se(pRtree);.  re
71b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 20  turn rc;.}.../* 
71c0: 0a 2a 2a 20 47 45 4f 50 4f 4c 59 20 76 69 72 74  .** GEOPOLY virt
71d0: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
71e0: 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64 2e   xCreate method.
71f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
7200: 65 6f 70 6f 6c 79 43 72 65 61 74 65 28 0a 20 20  eopolyCreate(.  
7210: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
7220: 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
7230: 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
7240: 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
7250: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
7260: 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVtab,.  char *
7270: 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74 75  *pzErr.){.  retu
7280: 72 6e 20 67 65 6f 70 6f 6c 79 49 6e 69 74 28 64  rn geopolyInit(d
7290: 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20 61  b, pAux, argc, a
72a0: 72 67 76 2c 20 70 70 56 74 61 62 2c 20 70 7a 45  rgv, ppVtab, pzE
72b0: 72 72 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  rr, 1);.}../* .*
72c0: 2a 20 47 45 4f 50 4f 4c 59 20 76 69 72 74 75 61  * GEOPOLY virtua
72d0: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
72e0: 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a  Connect method..
72f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
7300: 6f 70 6f 6c 79 43 6f 6e 6e 65 63 74 28 0a 20 20  opolyConnect(.  
7310: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
7320: 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
7330: 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
7340: 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
7350: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
7360: 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVtab,.  char *
7370: 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74 75  *pzErr.){.  retu
7380: 72 6e 20 67 65 6f 70 6f 6c 79 49 6e 69 74 28 64  rn geopolyInit(d
7390: 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20 61  b, pAux, argc, a
73a0: 72 67 76 2c 20 70 70 56 74 61 62 2c 20 70 7a 45  rgv, ppVtab, pzE
73b0: 72 72 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 20 0a  rr, 0);.}.../* .
73c0: 2a 2a 20 47 45 4f 50 4f 4c 59 20 76 69 72 74 75  ** GEOPOLY virtu
73d0: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
73e0: 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a  xFilter method..
73f0: 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 70 6c 61 6e  **.** Query plan
7400: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 20  s:.**.**      1 
7410: 20 20 20 20 20 20 20 20 72 6f 77 69 64 20 6c 6f          rowid lo
7420: 6f 6b 75 70 0a 2a 2a 20 20 20 20 20 20 32 20 20  okup.**      2  
7430: 20 20 20 20 20 20 20 73 65 61 72 63 68 20 66 6f         search fo
7440: 72 20 6f 62 6a 65 63 74 73 20 6f 76 65 72 6c 61  r objects overla
7450: 70 70 69 6e 67 20 74 68 65 20 73 61 6d 65 20 62  pping the same b
7460: 6f 75 6e 64 69 6e 67 20 62 6f 78 0a 2a 2a 20 20  ounding box.**  
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
7480: 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 6f 6c 79  at contains poly
7490: 67 6f 6e 20 61 72 67 76 5b 30 5d 0a 2a 2a 20 20  gon argv[0].**  
74a0: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 66 75      3         fu
74b0: 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2f  ll table scan.*/
74c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6f 70  .static int geop
74d0: 6f 6c 79 46 69 6c 74 65 72 28 0a 20 20 73 71 6c  olyFilter(.  sql
74e0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
74f0: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20 20   *pVtabCursor,  
7500: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
7510: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a   to initialize *
7520: 2f 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20  /.  int idxNum, 
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65            /* Que
7550: 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 63 6f 6e  ry plan */.  con
7560: 73 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c  st char *idxStr,
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 20 20 20 2f 2a 20 4e 6f 74 20 55 73 65 64 20 2a     /* Not Used *
7590: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71  /.  int argc, sq
75a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
75b0: 67 76 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  gv        /* Par
75c0: 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 71  ameters to the q
75d0: 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a  uery plan */.){.
75e0: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 20    Rtree *pRtree 
75f0: 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74 61 62  = (Rtree *)pVtab
7600: 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20  Cursor->pVtab;. 
7610: 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43   RtreeCursor *pC
7620: 73 72 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f  sr = (RtreeCurso
7630: 72 20 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  r *)pVtabCursor;
7640: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 52  .  RtreeNode *pR
7650: 6f 6f 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  oot = 0;.  int r
7660: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
7670: 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20 30 3b 0a   int iCell = 0;.
7680: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
7690: 70 53 74 6d 74 3b 0a 0a 20 20 72 74 72 65 65 52  pStmt;..  rtreeR
76a0: 65 66 65 72 65 6e 63 65 28 70 52 74 72 65 65 29  eference(pRtree)
76b0: 3b 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68  ;..  /* Reset th
76c0: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
76d0: 73 61 6d 65 20 73 74 61 74 65 20 61 73 20 72 74  same state as rt
76e0: 72 65 65 4f 70 65 6e 28 29 20 6c 65 61 76 65 73  reeOpen() leaves
76f0: 20 69 74 20 69 6e 2e 20 2a 2f 0a 20 20 66 72 65   it in. */.  fre
7700: 65 43 75 72 73 6f 72 43 6f 6e 73 74 72 61 69 6e  eCursorConstrain
7710: 74 73 28 70 43 73 72 29 3b 0a 20 20 73 71 6c 69  ts(pCsr);.  sqli
7720: 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61  te3_free(pCsr->a
7730: 50 6f 69 6e 74 29 3b 0a 20 20 70 53 74 6d 74 20  Point);.  pStmt 
7740: 3d 20 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78  = pCsr->pReadAux
7750: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c  ;.  memset(pCsr,
7760: 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65   0, sizeof(Rtree
7770: 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72  Cursor));.  pCsr
7780: 2d 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20 28  ->base.pVtab = (
7790: 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 52  sqlite3_vtab*)pR
77a0: 74 72 65 65 3b 0a 20 20 70 43 73 72 2d 3e 70 52  tree;.  pCsr->pR
77b0: 65 61 64 41 75 78 20 3d 20 70 53 74 6d 74 3b 0a  eadAux = pStmt;.
77c0: 0a 20 20 70 43 73 72 2d 3e 69 53 74 72 61 74 65  .  pCsr->iStrate
77d0: 67 79 20 3d 20 69 64 78 4e 75 6d 3b 0a 20 20 69  gy = idxNum;.  i
77e0: 66 28 20 69 64 78 4e 75 6d 3d 3d 31 20 29 7b 0a  f( idxNum==1 ){.
77f0: 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63      /* Special c
7800: 61 73 65 20 2d 20 6c 6f 6f 6b 75 70 20 62 79 20  ase - lookup by 
7810: 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20 52 74  rowid. */.    Rt
7820: 72 65 65 4e 6f 64 65 20 2a 70 4c 65 61 66 3b 20  reeNode *pLeaf; 
7830: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 6f         /* Leaf o
7840: 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 71 75  n which the requ
7850: 69 72 65 64 20 63 65 6c 6c 20 72 65 73 69 64 65  ired cell reside
7860: 73 20 2a 2f 0a 20 20 20 20 52 74 72 65 65 53 65  s */.    RtreeSe
7870: 61 72 63 68 50 6f 69 6e 74 20 2a 70 3b 20 20 20  archPoint *p;   
7880: 20 20 2f 2a 20 53 65 61 72 63 68 20 70 6f 69 6e    /* Search poin
7890: 74 20 66 6f 72 20 74 68 65 20 6c 65 61 66 20 2a  t for the leaf *
78a0: 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
78b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
78c0: 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b  _int64(argv[0]);
78d0: 0a 20 20 20 20 69 36 34 20 69 4e 6f 64 65 20 3d  .    i64 iNode =
78e0: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e   0;.    rc = fin
78f0: 64 4c 65 61 66 4e 6f 64 65 28 70 52 74 72 65 65  dLeafNode(pRtree
7900: 2c 20 69 52 6f 77 69 64 2c 20 26 70 4c 65 61 66  , iRowid, &pLeaf
7910: 2c 20 26 69 4e 6f 64 65 29 3b 0a 20 20 20 20 69  , &iNode);.    i
7920: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7930: 20 26 26 20 70 4c 65 61 66 21 3d 30 20 29 7b 0a   && pLeaf!=0 ){.
7940: 20 20 20 20 20 20 70 20 3d 20 72 74 72 65 65 53        p = rtreeS
7950: 65 61 72 63 68 50 6f 69 6e 74 4e 65 77 28 70 43  earchPointNew(pC
7960: 73 72 2c 20 52 54 52 45 45 5f 5a 45 52 4f 2c 20  sr, RTREE_ZERO, 
7970: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
7980: 28 20 70 21 3d 30 20 29 3b 20 20 2f 2a 20 41 6c  ( p!=0 );  /* Al
7990: 77 61 79 73 20 72 65 74 75 72 6e 73 20 70 43 73  ways returns pCs
79a0: 72 2d 3e 73 50 6f 69 6e 74 20 2a 2f 0a 20 20 20  r->sPoint */.   
79b0: 20 20 20 70 43 73 72 2d 3e 61 4e 6f 64 65 5b 30     pCsr->aNode[0
79c0: 5d 20 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20 20  ] = pLeaf;.     
79d0: 20 70 2d 3e 69 64 20 3d 20 69 4e 6f 64 65 3b 0a   p->id = iNode;.
79e0: 20 20 20 20 20 20 70 2d 3e 65 57 69 74 68 69 6e        p->eWithin
79f0: 20 3d 20 50 41 52 54 4c 59 5f 57 49 54 48 49 4e   = PARTLY_WITHIN
7a00: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 64  ;.      rc = nod
7a10: 65 52 6f 77 69 64 49 6e 64 65 78 28 70 52 74 72  eRowidIndex(pRtr
7a20: 65 65 2c 20 70 4c 65 61 66 2c 20 69 52 6f 77 69  ee, pLeaf, iRowi
7a30: 64 2c 20 26 69 43 65 6c 6c 29 3b 0a 20 20 20 20  d, &iCell);.    
7a40: 20 20 70 2d 3e 69 43 65 6c 6c 20 3d 20 28 75 38    p->iCell = (u8
7a50: 29 69 43 65 6c 6c 3b 0a 20 20 20 20 20 20 52 54  )iCell;.      RT
7a60: 52 45 45 5f 51 55 45 55 45 5f 54 52 41 43 45 28  REE_QUEUE_TRACE(
7a70: 70 43 73 72 2c 20 22 50 55 53 48 2d 46 31 3a 22  pCsr, "PUSH-F1:"
7a80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7a90: 20 20 20 20 70 43 73 72 2d 3e 61 74 45 4f 46 20      pCsr->atEOF 
7aa0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
7ab0: 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 6f 72 6d 61  se{.    /* Norma
7ac0: 6c 20 63 61 73 65 20 2d 20 72 2d 74 72 65 65 20  l case - r-tree 
7ad0: 73 63 61 6e 2e 20 53 65 74 20 75 70 20 74 68 65  scan. Set up the
7ae0: 20 52 74 72 65 65 43 75 72 73 6f 72 2e 61 43 6f   RtreeCursor.aCo
7af0: 6e 73 74 72 61 69 6e 74 20 61 72 72 61 79 20 0a  nstraint array .
7b00: 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
7b10: 63 6f 6e 66 69 67 75 72 65 64 20 63 6f 6e 73 74  configured const
7b20: 72 61 69 6e 74 73 2e 20 0a 20 20 20 20 2a 2f 0a  raints. .    */.
7b30: 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71      rc = nodeAcq
7b40: 75 69 72 65 28 70 52 74 72 65 65 2c 20 31 2c 20  uire(pRtree, 1, 
7b50: 30 2c 20 26 70 52 6f 6f 74 29 3b 0a 20 20 20 20  0, &pRoot);.    
7b60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7b70: 4b 20 26 26 20 69 64 78 4e 75 6d 3d 3d 32 20 29  K && idxNum==2 )
7b80: 7b 0a 20 20 20 20 20 20 52 74 72 65 65 43 6f 6f  {.      RtreeCoo
7b90: 72 64 20 62 62 6f 78 5b 34 5d 3b 0a 20 20 20 20  rd bbox[4];.    
7ba0: 20 20 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e    RtreeConstrain
7bb0: 74 20 2a 70 3b 0a 20 20 20 20 20 20 61 73 73 65  t *p;.      asse
7bc0: 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20  rt( argc==1 );. 
7bd0: 20 20 20 20 20 67 65 6f 70 6f 6c 79 42 42 6f 78       geopolyBBox
7be0: 28 30 2c 20 61 72 67 76 5b 30 5d 2c 20 62 62 6f  (0, argv[0], bbo
7bf0: 78 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  x, &rc);.      i
7c00: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
7c10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
7c20: 20 20 7d 0a 20 20 20 20 20 20 70 43 73 72 2d 3e    }.      pCsr->
7c30: 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 20  aConstraint = p 
7c40: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
7c50: 28 73 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6e  (sizeof(RtreeCon
7c60: 73 74 72 61 69 6e 74 29 2a 34 29 3b 0a 20 20 20  straint)*4);.   
7c70: 20 20 20 70 43 73 72 2d 3e 6e 43 6f 6e 73 74 72     pCsr->nConstr
7c80: 61 69 6e 74 20 3d 20 34 3b 0a 20 20 20 20 20 20  aint = 4;.      
7c90: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
7ca0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7cb0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
7cc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
7cd0: 65 74 28 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72  et(pCsr->aConstr
7ce0: 61 69 6e 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aint, 0, sizeof(
7cf0: 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 29  RtreeConstraint)
7d00: 2a 61 72 67 63 29 3b 0a 20 20 20 20 20 20 20 20  *argc);.        
7d10: 6d 65 6d 73 65 74 28 70 43 73 72 2d 3e 61 6e 51  memset(pCsr->anQ
7d20: 75 65 75 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ueue, 0, sizeof(
7d30: 75 33 32 29 2a 28 70 52 74 72 65 65 2d 3e 69 44  u32)*(pRtree->iD
7d40: 65 70 74 68 20 2b 20 31 29 29 3b 0a 20 20 20 20  epth + 1));.    
7d50: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27 42 27 3b      p->op = 'B';
7d60: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f  .        p->iCoo
7d70: 72 64 20 3d 20 27 61 27 3b 0a 20 20 20 20 20 20  rd = 'a';.      
7d80: 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20 3d 20    p->u.rValue = 
7d90: 62 62 6f 78 5b 30 5d 2e 66 3b 0a 20 20 20 20 20  bbox[0].f;.     
7da0: 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20     p++;.        
7db0: 70 2d 3e 6f 70 20 3d 20 27 44 27 3b 0a 20 20 20  p->op = 'D';.   
7dc0: 20 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64 20 3d       p->iCoord =
7dd0: 20 27 62 27 3b 0a 20 20 20 20 20 20 20 20 70 2d   'b';.        p-
7de0: 3e 75 2e 72 56 61 6c 75 65 20 3d 20 62 62 6f 78  >u.rValue = bbox
7df0: 5b 31 5d 2e 66 3b 0a 20 20 20 20 20 20 20 20 70  [1].f;.        p
7e00: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f  ++;.        p->o
7e10: 70 20 3d 20 27 42 27 3b 0a 20 20 20 20 20 20 20  p = 'B';.       
7e20: 20 70 2d 3e 69 43 6f 6f 72 64 20 3d 20 27 63 27   p->iCoord = 'c'
7e30: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 72  ;.        p->u.r
7e40: 56 61 6c 75 65 20 3d 20 62 62 6f 78 5b 32 5d 2e  Value = bbox[2].
7e50: 66 3b 0a 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a  f;.        p++;.
7e60: 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20          p->op = 
7e70: 27 44 27 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  'D';.        p->
7e80: 69 43 6f 6f 72 64 20 3d 20 27 64 27 3b 0a 20 20  iCoord = 'd';.  
7e90: 20 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75        p->u.rValu
7ea0: 65 20 3d 20 62 62 6f 78 5b 33 5d 2e 66 3b 0a 20  e = bbox[3].f;. 
7eb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7ec0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7ed0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 52 74 72 65  OK ){.      Rtre
7ee0: 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70 4e  eSearchPoint *pN
7ef0: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  ew;.      pNew =
7f00: 20 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   rtreeSearchPoin
7f10: 74 4e 65 77 28 70 43 73 72 2c 20 52 54 52 45 45  tNew(pCsr, RTREE
7f20: 5f 5a 45 52 4f 2c 20 28 75 38 29 28 70 52 74 72  _ZERO, (u8)(pRtr
7f30: 65 65 2d 3e 69 44 65 70 74 68 2b 31 29 29 3b 0a  ee->iDepth+1));.
7f40: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d        if( pNew==
7f50: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
7f60: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 70  E_NOMEM;.      p
7f70: 4e 65 77 2d 3e 69 64 20 3d 20 31 3b 0a 20 20 20  New->id = 1;.   
7f80: 20 20 20 70 4e 65 77 2d 3e 69 43 65 6c 6c 20 3d     pNew->iCell =
7f90: 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
7fa0: 65 57 69 74 68 69 6e 20 3d 20 50 41 52 54 4c 59  eWithin = PARTLY
7fb0: 5f 57 49 54 48 49 4e 3b 0a 20 20 20 20 20 20 61  _WITHIN;.      a
7fc0: 73 73 65 72 74 28 20 70 43 73 72 2d 3e 62 50 6f  ssert( pCsr->bPo
7fd0: 69 6e 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  int==1 );.      
7fe0: 70 43 73 72 2d 3e 61 4e 6f 64 65 5b 30 5d 20 3d  pCsr->aNode[0] =
7ff0: 20 70 52 6f 6f 74 3b 0a 20 20 20 20 20 20 70 52   pRoot;.      pR
8000: 6f 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 52  oot = 0;.      R
8010: 54 52 45 45 5f 51 55 45 55 45 5f 54 52 41 43 45  TREE_QUEUE_TRACE
8020: 28 70 43 73 72 2c 20 22 50 55 53 48 2d 46 6d 3a  (pCsr, "PUSH-Fm:
8030: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  ");.      rc = r
8040: 74 72 65 65 53 74 65 70 54 6f 4c 65 61 66 28 70  treeStepToLeaf(p
8050: 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Csr);.    }.  }.
8060: 0a 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70  .  nodeRelease(p
8070: 52 74 72 65 65 2c 20 70 52 6f 6f 74 29 3b 0a 20  Rtree, pRoot);. 
8080: 20 72 74 72 65 65 52 65 6c 65 61 73 65 28 70 52   rtreeRelease(pR
8090: 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  tree);.  return 
80a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 74 72  rc;.}../*.** Rtr
80b0: 65 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ee virtual table
80c0: 20 6d 6f 64 75 6c 65 20 78 42 65 73 74 49 6e 64   module xBestInd
80d0: 65 78 20 6d 65 74 68 6f 64 2e 20 54 68 65 72 65  ex method. There
80e0: 20 61 72 65 20 74 68 72 65 65 0a 2a 2a 20 74 61   are three.** ta
80f0: 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67  ble scan strateg
8100: 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 66 72  ies to choose fr
8110: 6f 6d 20 28 69 6e 20 6f 72 64 65 72 20 66 72 6f  om (in order fro
8120: 6d 20 6d 6f 73 74 20 74 6f 20 0a 2a 2a 20 6c 65  m most to .** le
8130: 61 73 74 20 64 65 73 69 72 61 62 6c 65 29 3a 0a  ast desirable):.
8140: 2a 2a 0a 2a 2a 20 20 20 69 64 78 4e 75 6d 20 20  **.**   idxNum  
8150: 20 20 20 69 64 78 53 74 72 20 20 20 20 20 20 20     idxStr       
8160: 20 53 74 72 61 74 65 67 79 0a 2a 2a 20 20 20 2d   Strategy.**   -
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
81a0: 2a 2a 20 20 20 20 20 31 20 20 20 20 20 20 20 20  **     1        
81b0: 55 6e 75 73 65 64 20 20 20 20 20 20 20 20 44 69  Unused        Di
81c0: 72 65 63 74 20 6c 6f 6f 6b 75 70 20 62 79 20 72  rect lookup by r
81d0: 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20 32 20 20  owid..**     2  
81e0: 20 20 20 20 20 20 55 6e 75 73 65 64 20 20 20 20        Unused    
81f0: 20 20 20 20 52 2d 74 72 65 65 20 71 75 65 72 79      R-tree query
8200: 0a 2a 2a 20 20 20 20 20 33 20 20 20 20 20 20 20  .**     3       
8210: 20 55 6e 75 73 65 64 20 20 20 20 20 20 20 20 66   Unused        f
8220: 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 2e 0a  ull-table scan..
8230: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8260: 2d 2d 2d 2d 2d 0a 2a 2f 0a 73 74 61 74 69 63 20  -----.*/.static 
8270: 69 6e 74 20 67 65 6f 70 6f 6c 79 42 65 73 74 49  int geopolyBestI
8280: 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61  ndex(sqlite3_vta
8290: 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f  b *tab, sqlite3_
82a0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
82b0: 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b  Info){.  int ii;
82c0: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 54 65 72  .  int iRowidTer
82d0: 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 46  m = -1;.  int iF
82e0: 75 6e 63 54 65 72 6d 20 3d 20 2d 31 3b 0a 0a 20  uncTerm = -1;.. 
82f0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49   for(ii=0; ii<pI
8300: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
8310: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
8320: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
8330: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
8340: 2a 70 20 3d 20 26 70 49 64 78 49 6e 66 6f 2d 3e  *p = &pIdxInfo->
8350: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 69 5d 3b  aConstraint[ii];
8360: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73 61  .    if( !p->usa
8370: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
8380: 20 20 20 20 69 66 28 20 70 2d 3e 69 43 6f 6c 75      if( p->iColu
8390: 6d 6e 3c 30 20 26 26 20 70 2d 3e 6f 70 3d 3d 53  mn<0 && p->op==S
83a0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
83b0: 54 52 41 49 4e 54 5f 45 51 20 20 29 7b 0a 20 20  TRAINT_EQ  ){.  
83c0: 20 20 20 20 69 52 6f 77 69 64 54 65 72 6d 20 3d      iRowidTerm =
83d0: 20 69 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   ii;.      break
83e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
83f0: 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26  p->iColumn==0 &&
8400: 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49   p->op==SQLITE_I
8410: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
8420: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
8430: 20 20 69 46 75 6e 63 54 65 72 6d 20 3d 20 69 69    iFuncTerm = ii
8440: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
8450: 66 28 20 69 52 6f 77 69 64 54 65 72 6d 3e 3d 30  f( iRowidTerm>=0
8460: 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   ){.    pIdxInfo
8470: 2d 3e 69 64 78 4e 75 6d 20 3d 20 31 3b 0a 20 20  ->idxNum = 1;.  
8480: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
8490: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 52 6f  straintUsage[iRo
84a0: 77 69 64 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64  widTerm].argvInd
84b0: 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78  ex = 1;.    pIdx
84c0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
84d0: 74 55 73 61 67 65 5b 69 52 6f 77 69 64 54 65 72  tUsage[iRowidTer
84e0: 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20  m].omit = 1;.   
84f0: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
8500: 61 74 65 64 43 6f 73 74 20 3d 20 33 30 2e 30 3b  atedCost = 30.0;
8510: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
8520: 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 31  stimatedRows = 1
8530: 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
8540: 69 64 78 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  idxFlags = SQLIT
8550: 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49  E_INDEX_SCAN_UNI
8560: 51 55 45 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  QUE;.    return 
8570: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
8580: 20 69 66 28 20 69 46 75 6e 63 54 65 72 6d 3e 3d   if( iFuncTerm>=
8590: 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66  0 ){.    pIdxInf
85a0: 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 32 3b 0a 20  o->idxNum = 2;. 
85b0: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
85c0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 52  nstraintUsage[iR
85d0: 6f 77 69 64 54 65 72 6d 5d 2e 61 72 67 76 49 6e  owidTerm].argvIn
85e0: 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 64  dex = 1;.    pId
85f0: 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
8600: 43 6f 73 74 20 3d 20 33 30 30 2e 30 3b 0a 20 20  Cost = 300.0;.  
8610: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
8620: 6d 61 74 65 64 52 6f 77 73 20 3d 20 31 30 3b 0a  matedRows = 10;.
8630: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8640: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 49 64 78  E_OK;.  }.  pIdx
8650: 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 33  Info->idxNum = 3
8660: 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
8670: 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 33 30  timatedCost = 30
8680: 30 30 30 30 30 2e 30 3b 0a 20 20 70 49 64 78 49  00000.0;.  pIdxI
8690: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
86a0: 77 73 20 3d 20 31 30 30 30 30 30 3b 0a 20 20 72  ws = 100000;.  r
86b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
86c0: 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 47 45 4f 50  .}.../* .** GEOP
86d0: 4f 4c 59 20 76 69 72 74 75 61 6c 20 74 61 62 6c  OLY virtual tabl
86e0: 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6c 75 6d 6e  e module xColumn
86f0: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
8700: 69 63 20 69 6e 74 20 67 65 6f 70 6f 6c 79 43 6f  ic int geopolyCo
8710: 6c 75 6d 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  lumn(sqlite3_vta
8720: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73  b_cursor *cur, s
8730: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
8740: 63 74 78 2c 20 69 6e 74 20 69 29 7b 0a 20 20 52  ctx, int i){.  R
8750: 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28  tree *pRtree = (
8760: 52 74 72 65 65 20 2a 29 63 75 72 2d 3e 70 56 74  Rtree *)cur->pVt
8770: 61 62 3b 0a 20 20 52 74 72 65 65 43 75 72 73 6f  ab;.  RtreeCurso
8780: 72 20 2a 70 43 73 72 20 3d 20 28 52 74 72 65 65  r *pCsr = (Rtree
8790: 43 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20  Cursor *)cur;.  
87a0: 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  RtreeSearchPoint
87b0: 20 2a 70 20 3d 20 72 74 72 65 65 53 65 61 72 63   *p = rtreeSearc
87c0: 68 50 6f 69 6e 74 46 69 72 73 74 28 70 43 73 72  hPointFirst(pCsr
87d0: 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  );.  int rc = SQ
87e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65  LITE_OK;.  Rtree
87f0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 72 74  Node *pNode = rt
8800: 72 65 65 4e 6f 64 65 4f 66 46 69 72 73 74 53 65  reeNodeOfFirstSe
8810: 61 72 63 68 50 6f 69 6e 74 28 70 43 73 72 2c 20  archPoint(pCsr, 
8820: 26 72 63 29 3b 0a 0a 20 20 69 66 28 20 72 63 20  &rc);..  if( rc 
8830: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
8840: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
8850: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
8860: 28 20 69 3c 3d 70 52 74 72 65 65 2d 3e 6e 41 75  ( i<=pRtree->nAu
8870: 78 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 43  x ){.    if( !pC
8880: 73 72 2d 3e 62 41 75 78 56 61 6c 69 64 20 29 7b  sr->bAuxValid ){
8890: 0a 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d  .      if( pCsr-
88a0: 3e 70 52 65 61 64 41 75 78 3d 3d 30 20 29 7b 0a  >pReadAux==0 ){.
88b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
88c0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28  ite3_prepare_v3(
88d0: 70 52 74 72 65 65 2d 3e 64 62 2c 20 70 52 74 72  pRtree->db, pRtr
88e0: 65 65 2d 3e 7a 52 65 61 64 41 75 78 53 71 6c 2c  ee->zReadAuxSql,
88f0: 20 2d 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20   -1, 0,.        
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 20 20 20 20 20 20 20 20 26 70 43 73 72 2d 3e 70          &pCsr->p
8920: 52 65 61 64 41 75 78 2c 20 30 29 3b 0a 20 20 20  ReadAux, 0);.   
8930: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
8940: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
8950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
8960: 69 6e 64 5f 69 6e 74 36 34 28 70 43 73 72 2d 3e  ind_int64(pCsr->
8970: 70 52 65 61 64 41 75 78 2c 20 31 2c 20 0a 20 20  pReadAux, 1, .  
8980: 20 20 20 20 20 20 20 20 6e 6f 64 65 47 65 74 52          nodeGetR
8990: 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70 4e 6f  owid(pRtree, pNo
89a0: 64 65 2c 20 70 2d 3e 69 43 65 6c 6c 29 29 3b 0a  de, p->iCell));.
89b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
89c0: 65 33 5f 73 74 65 70 28 70 43 73 72 2d 3e 70 52  e3_step(pCsr->pR
89d0: 65 61 64 41 75 78 29 3b 0a 20 20 20 20 20 20 69  eadAux);.      i
89e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f  f( rc==SQLITE_RO
89f0: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 73  W ){.        pCs
8a00: 72 2d 3e 62 41 75 78 56 61 6c 69 64 20 3d 20 31  r->bAuxValid = 1
8a10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8a20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
8a30: 65 73 65 74 28 70 43 73 72 2d 3e 70 52 65 61 64  eset(pCsr->pRead
8a40: 41 75 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Aux);.        if
8a50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
8a60: 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  E ) rc = SQLITE_
8a70: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  OK;.        retu
8a80: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
8a90: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8aa0: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74  _result_value(ct
8ab0: 78 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  x,.         sqli
8ac0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
8ad0: 28 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78 2c  (pCsr->pReadAux,
8ae0: 20 69 20 2d 20 70 52 74 72 65 65 2d 3e 6e 44 69   i - pRtree->nDi
8af0: 6d 32 20 2b 20 31 29 29 3b 0a 20 20 7d 65 6c 73  m2 + 1));.  }els
8b00: 65 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 62  e{.    /* Must b
8b10: 65 20 74 68 65 20 5f 62 62 6f 78 20 63 6f 6c 75  e the _bbox colu
8b20: 6d 6e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  mn */.  }.  retu
8b30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8b40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 55 70 64  ../*.** The xUpd
8b50: 61 74 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 47  ate method for G
8b60: 45 4f 50 4f 4c 59 20 6d 6f 64 75 6c 65 20 76 69  EOPOLY module vi
8b70: 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2a  rtual tables..**
8b80: 0a 2a 2a 20 46 6f 72 20 44 45 4c 45 54 45 3a 0a  .** For DELETE:.
8b90: 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 30  **.**     argv[0
8ba0: 5d 20 3d 20 74 68 65 20 72 6f 77 69 64 20 74 6f  ] = the rowid to
8bb0: 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 0a 2a   be deleted.**.*
8bc0: 2a 20 46 6f 72 20 49 4e 53 45 52 54 3a 0a 2a 2a  * For INSERT:.**
8bd0: 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 30 5d 20  .**     argv[0] 
8be0: 3d 20 53 51 4c 20 4e 55 4c 4c 0a 2a 2a 20 20 20  = SQL NULL.**   
8bf0: 20 20 61 72 67 76 5b 31 5d 20 3d 20 72 6f 77 69    argv[1] = rowi
8c00: 64 20 74 6f 20 69 6e 73 65 72 74 2c 20 6f 72 20  d to insert, or 
8c10: 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 74 6f 20 73  an SQL NULL to s
8c20: 65 6c 65 63 74 20 61 75 74 6f 6d 61 74 69 63 61  elect automatica
8c30: 6c 6c 79 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  lly.**     argv[
8c40: 32 5d 20 3d 20 5f 73 68 61 70 65 20 63 6f 6c 75  2] = _shape colu
8c50: 6d 6e 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 33  mn.**     argv[3
8c60: 5d 20 3d 20 66 69 72 73 74 20 61 70 70 6c 69 63  ] = first applic
8c70: 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 63 6f  ation-defined co
8c80: 6c 75 6d 6e 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 46  lumn.....**.** F
8c90: 6f 72 20 55 50 44 41 54 45 3a 0a 2a 2a 0a 2a 2a  or UPDATE:.**.**
8ca0: 20 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20 72       argv[0] = r
8cb0: 6f 77 69 64 20 74 6f 20 6d 6f 64 69 66 79 2e 20  owid to modify. 
8cc0: 20 4e 65 76 65 72 20 4e 55 4c 4c 0a 2a 2a 20 20   Never NULL.**  
8cd0: 20 20 20 61 72 67 76 5b 31 5d 20 3d 20 72 6f 77     argv[1] = row
8ce0: 69 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61  id after the cha
8cf0: 6e 67 65 2e 20 20 4e 65 76 65 72 20 4e 55 4c 4c  nge.  Never NULL
8d00: 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 32 5d 20  .**     argv[2] 
8d10: 3d 20 6e 65 77 20 76 61 6c 75 65 20 66 6f 72 20  = new value for 
8d20: 5f 73 68 61 70 65 0a 2a 2a 20 20 20 20 20 61 72  _shape.**     ar
8d30: 67 76 5b 33 5d 20 3d 20 6e 65 77 20 76 61 6c 75  gv[3] = new valu
8d40: 65 20 66 6f 72 20 66 69 72 73 74 20 61 70 70 6c  e for first appl
8d50: 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  ication-defined 
8d60: 63 6f 6c 75 6d 6e 2e 2e 2e 2e 0a 2a 2f 0a 73 74  column.....*/.st
8d70: 61 74 69 63 20 69 6e 74 20 67 65 6f 70 6f 6c 79  atic int geopoly
8d80: 55 70 64 61 74 65 28 0a 20 20 73 71 6c 69 74 65  Update(.  sqlite
8d90: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 0a  3_vtab *pVtab, .
8da0: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 0a 20 20    int nData, .  
8db0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8dc0: 61 44 61 74 61 2c 20 0a 20 20 73 71 6c 69 74 65  aData, .  sqlite
8dd0: 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 0a 29  _int64 *pRowid.)
8de0: 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  {.  Rtree *pRtre
8df0: 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74  e = (Rtree *)pVt
8e00: 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ab;.  int rc = S
8e10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65  QLITE_OK;.  Rtre
8e20: 65 43 65 6c 6c 20 63 65 6c 6c 3b 20 20 20 20 20  eCell cell;     
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8e40: 65 77 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72  ew cell to inser
8e50: 74 20 69 66 20 6e 44 61 74 61 3e 31 20 2a 2f 0a  t if nData>1 */.
8e60: 20 20 69 36 34 20 6f 6c 64 52 6f 77 69 64 3b 20    i64 oldRowid; 
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 20 2f 2a 20 54 68 65 20 6f 6c 64 20 72 6f 77    /* The old row
8e90: 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6c 64 52  id */.  int oldR
8ea0: 6f 77 69 64 56 61 6c 69 64 3b 20 20 20 20 20 20  owidValid;      
8eb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
8ec0: 69 66 20 6f 6c 64 52 6f 77 69 64 20 69 73 20 76  if oldRowid is v
8ed0: 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 6e 65  alid */.  i64 ne
8ee0: 77 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  wRowid;         
8ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
8f00: 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20   new rowid */.  
8f10: 69 6e 74 20 6e 65 77 52 6f 77 69 64 56 61 6c 69  int newRowidVali
8f20: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8f30: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 77 52 6f  /* True if newRo
8f40: 77 69 64 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  wid is valid */.
8f50: 20 20 69 6e 74 20 63 6f 6f 72 64 43 68 61 6e 67    int coordChang
8f60: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
8f70: 20 20 2f 2a 20 43 68 61 6e 67 65 20 69 6e 20 63    /* Change in c
8f80: 6f 6f 72 64 69 6e 61 74 65 73 20 2a 2f 0a 0a 20  oordinates */.. 
8f90: 20 69 66 28 20 70 52 74 72 65 65 2d 3e 6e 4e 6f   if( pRtree->nNo
8fa0: 64 65 52 65 66 20 29 7b 0a 20 20 20 20 2f 2a 20  deRef ){.    /* 
8fb0: 55 6e 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20  Unable to write 
8fc0: 74 6f 20 74 68 65 20 62 74 72 65 65 20 77 68 69  to the btree whi
8fd0: 6c 65 20 61 6e 6f 74 68 65 72 20 63 75 72 73 6f  le another curso
8fe0: 72 20 69 73 20 72 65 61 64 69 6e 67 20 66 72 6f  r is reading fro
8ff0: 6d 20 69 74 2c 0a 20 20 20 20 2a 2a 20 73 69 6e  m it,.    ** sin
9000: 63 65 20 74 68 65 20 77 72 69 74 65 20 6d 69 67  ce the write mig
9010: 68 74 20 64 6f 20 61 20 72 65 62 61 6c 61 6e 63  ht do a rebalanc
9020: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 64 69  e which would di
9030: 73 72 75 70 74 20 74 68 65 20 72 65 61 64 0a 20  srupt the read. 
9040: 20 20 20 2a 2a 20 63 75 72 73 6f 72 2e 20 2a 2f     ** cursor. */
9050: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9060: 54 45 5f 4c 4f 43 4b 45 44 5f 56 54 41 42 3b 0a  TE_LOCKED_VTAB;.
9070: 20 20 7d 0a 20 20 72 74 72 65 65 52 65 66 65 72    }.  rtreeRefer
9080: 65 6e 63 65 28 70 52 74 72 65 65 29 3b 0a 20 20  ence(pRtree);.  
9090: 61 73 73 65 72 74 28 6e 44 61 74 61 3e 3d 31 29  assert(nData>=1)
90a0: 3b 0a 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  ;..  rc = SQLITE
90b0: 5f 45 52 52 4f 52 3b 0a 20 20 6f 6c 64 52 6f 77  _ERROR;.  oldRow
90c0: 69 64 56 61 6c 69 64 20 3d 20 73 71 6c 69 74 65  idValid = sqlite
90d0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 44 61  3_value_type(aDa
90e0: 74 61 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e  ta[0])!=SQLITE_N
90f0: 55 4c 4c 3b 3b 0a 20 20 6f 6c 64 52 6f 77 69 64  ULL;;.  oldRowid
9100: 20 3d 20 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64   = oldRowidValid
9110: 20 3f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   ? sqlite3_value
9120: 5f 69 6e 74 36 34 28 61 44 61 74 61 5b 30 5d 29  _int64(aData[0])
9130: 20 3a 20 30 3b 0a 20 20 6e 65 77 52 6f 77 69 64   : 0;.  newRowid
9140: 56 61 6c 69 64 20 3d 20 6e 44 61 74 61 3e 31 20  Valid = nData>1 
9150: 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
9160: 5f 74 79 70 65 28 61 44 61 74 61 5b 31 5d 29 21  _type(aData[1])!
9170: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20  =SQLITE_NULL;.  
9180: 6e 65 77 52 6f 77 69 64 20 3d 20 6e 65 77 52 6f  newRowid = newRo
9190: 77 69 64 56 61 6c 69 64 20 3f 20 73 71 6c 69 74  widValid ? sqlit
91a0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
91b0: 44 61 74 61 5b 31 5d 29 20 3a 20 30 3b 0a 20 20  Data[1]) : 0;.  
91c0: 63 65 6c 6c 2e 69 52 6f 77 69 64 20 3d 20 6e 65  cell.iRowid = ne
91d0: 77 52 6f 77 69 64 3b 0a 0a 20 20 69 66 28 20 6e  wRowid;..  if( n
91e0: 44 61 74 61 3e 31 20 20 20 20 20 20 20 20 20 20  Data>1          
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 20 20 20 20 20 20 2f 2a 20 6e 6f 74 20 61 20         /* not a 
9210: 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20 26 26 20  DELETE */.   && 
9220: 28 21 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64 20  (!oldRowidValid 
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 53 45 52          /* INSER
9250: 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 7c 7c 20  T */.        || 
9260: 21 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e  !sqlite3_value_n
9270: 6f 63 68 61 6e 67 65 28 61 44 61 74 61 5b 32 5d  ochange(aData[2]
9280: 29 20 20 2f 2a 20 55 50 44 41 54 45 20 5f 73 68  )  /* UPDATE _sh
9290: 61 70 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7c  ape */.        |
92a0: 7c 20 6f 6c 64 52 6f 77 69 64 21 3d 6e 65 77 52  | oldRowid!=newR
92b0: 6f 77 69 64 29 20 20 20 20 20 20 20 20 20 20 20  owid)           
92c0: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 68       /* Rowid ch
92d0: 61 6e 67 65 20 2a 2f 0a 20 20 29 7b 0a 20 20 20  ange */.  ){.   
92e0: 20 67 65 6f 70 6f 6c 79 42 42 6f 78 28 30 2c 20   geopolyBBox(0, 
92f0: 61 44 61 74 61 5b 32 5d 2c 20 63 65 6c 6c 2e 61  aData[2], cell.a
9300: 43 6f 6f 72 64 2c 20 26 72 63 29 3b 0a 20 20 20  Coord, &rc);.   
9310: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
9320: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9330: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20  ERROR ){.       
9340: 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
9350: 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
9360: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5f 73 68  te3_mprintf("_sh
9370: 61 70 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ape does not con
9380: 74 61 69 6e 20 61 20 76 61 6c 69 64 20 70 6f 6c  tain a valid pol
9390: 79 67 6f 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ygon");.      }.
93a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
93b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 6f 72 64  .    }.    coord
93c0: 43 68 61 6e 67 65 20 3d 20 31 3b 0a 0a 20 20 20  Change = 1;..   
93d0: 20 2f 2a 20 49 66 20 61 20 72 6f 77 69 64 20 76   /* If a rowid v
93e0: 61 6c 75 65 20 77 61 73 20 73 75 70 70 6c 69 65  alue was supplie
93f0: 64 2c 20 63 68 65 63 6b 20 69 66 20 69 74 20 69  d, check if it i
9400: 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
9410: 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  t in .    ** the
9420: 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 74   table. If so, t
9430: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  he constraint ha
9440: 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 20  s failed. */.   
9450: 20 69 66 28 20 6e 65 77 52 6f 77 69 64 56 61 6c   if( newRowidVal
9460: 69 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  id ){.      int 
9470: 73 74 65 70 72 63 3b 0a 20 20 20 20 20 20 73 71  steprc;.      sq
9480: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
9490: 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f  (pRtree->pReadRo
94a0: 77 69 64 2c 20 31 2c 20 63 65 6c 6c 2e 69 52 6f  wid, 1, cell.iRo
94b0: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 74 65 70  wid);.      step
94c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
94d0: 70 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52  p(pRtree->pReadR
94e0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 72 63 20  owid);.      rc 
94f0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
9500: 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77  pRtree->pReadRow
9510: 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  id);.      if( S
9520: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 74 65 70 72  QLITE_ROW==stepr
9530: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  c ){.        if(
9540: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e   sqlite3_vtab_on
9550: 5f 63 6f 6e 66 6c 69 63 74 28 70 52 74 72 65 65  _conflict(pRtree
9560: 2d 3e 64 62 29 3d 3d 53 51 4c 49 54 45 5f 52 45  ->db)==SQLITE_RE
9570: 50 4c 41 43 45 20 29 7b 0a 20 20 20 20 20 20 20  PLACE ){.       
9580: 20 20 20 72 63 20 3d 20 72 74 72 65 65 44 65 6c     rc = rtreeDel
9590: 65 74 65 52 6f 77 69 64 28 70 52 74 72 65 65 2c  eteRowid(pRtree,
95a0: 20 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a 20   cell.iRowid);. 
95b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
95c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 74 72          rc = rtr
95d0: 65 65 43 6f 6e 73 74 72 61 69 6e 74 45 72 72 6f  eeConstraintErro
95e0: 72 28 70 52 74 72 65 65 2c 20 30 29 3b 0a 20 20  r(pRtree, 0);.  
95f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9600: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9610: 49 66 20 61 44 61 74 61 5b 30 5d 20 69 73 20 6e  If aData[0] is n
9620: 6f 74 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 76  ot an SQL NULL v
9630: 61 6c 75 65 2c 20 69 74 20 69 73 20 74 68 65 20  alue, it is the 
9640: 72 6f 77 69 64 20 6f 66 20 61 0a 20 20 2a 2a 20  rowid of a.  ** 
9650: 72 65 63 6f 72 64 20 74 6f 20 64 65 6c 65 74 65  record to delete
9660: 20 66 72 6f 6d 20 74 68 65 20 72 2d 74 72 65 65   from the r-tree
9670: 20 74 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c   table. The foll
9680: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 6f 65 73  owing block does
9690: 0a 20 20 2a 2a 20 6a 75 73 74 20 74 68 61 74 2e  .  ** just that.
96a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
96b0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6e 44  SQLITE_OK && (nD
96c0: 61 74 61 3d 3d 31 20 7c 7c 20 63 6f 6f 72 64 43  ata==1 || coordC
96d0: 68 61 6e 67 65 29 20 29 7b 0a 20 20 20 20 72 63  hange) ){.    rc
96e0: 20 3d 20 72 74 72 65 65 44 65 6c 65 74 65 52 6f   = rtreeDeleteRo
96f0: 77 69 64 28 70 52 74 72 65 65 2c 20 6f 6c 64 52  wid(pRtree, oldR
9700: 6f 77 69 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  owid);.  }..  /*
9710: 20 49 66 20 74 68 65 20 61 44 61 74 61 5b 5d 20   If the aData[] 
9720: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 6d  array contains m
9730: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
9740: 6d 65 6e 74 2c 20 65 6c 65 6d 65 6e 74 73 0a 20  ment, elements. 
9750: 20 2a 2a 20 28 61 44 61 74 61 5b 32 5d 2e 2e 61   ** (aData[2]..a
9760: 44 61 74 61 5b 61 72 67 63 2d 31 5d 29 20 63 6f  Data[argc-1]) co
9770: 6e 74 61 69 6e 20 61 20 6e 65 77 20 72 65 63 6f  ntain a new reco
9780: 72 64 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  rd to insert int
9790: 6f 0a 20 20 2a 2a 20 74 68 65 20 72 2d 74 72 65  o.  ** the r-tre
97a0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
97b0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
97c0: 54 45 5f 4f 4b 20 26 26 20 6e 44 61 74 61 3e 31  TE_OK && nData>1
97d0: 20 26 26 20 63 6f 6f 72 64 43 68 61 6e 67 65 20   && coordChange 
97e0: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  ){.    /* Insert
97f0: 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
9800: 69 6e 74 6f 20 74 68 65 20 72 2d 74 72 65 65 20  into the r-tree 
9810: 2a 2f 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65  */.    RtreeNode
9820: 20 2a 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20   *pLeaf = 0;.   
9830: 20 2a 70 52 6f 77 69 64 20 3d 20 63 65 6c 6c 2e   *pRowid = cell.
9840: 69 52 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20  iRowid;.    if( 
9850: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9860: 0a 20 20 20 20 20 20 72 63 20 3d 20 43 68 6f 6f  .      rc = Choo
9870: 73 65 4c 65 61 66 28 70 52 74 72 65 65 2c 20 26  seLeaf(pRtree, &
9880: 63 65 6c 6c 2c 20 30 2c 20 26 70 4c 65 61 66 29  cell, 0, &pLeaf)
9890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
98a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
98b0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  .      int rc2;.
98c0: 20 20 20 20 20 20 70 52 74 72 65 65 2d 3e 69 52        pRtree->iR
98d0: 65 69 6e 73 65 72 74 48 65 69 67 68 74 20 3d 20  einsertHeight = 
98e0: 2d 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  -1;.      rc = r
98f0: 74 72 65 65 49 6e 73 65 72 74 43 65 6c 6c 28 70  treeInsertCell(p
9900: 52 74 72 65 65 2c 20 70 4c 65 61 66 2c 20 26 63  Rtree, pLeaf, &c
9910: 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ell, 0);.      r
9920: 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65  c2 = nodeRelease
9930: 28 70 52 74 72 65 65 2c 20 70 4c 65 61 66 29 3b  (pRtree, pLeaf);
9940: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
9950: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9960: 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
9970: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9980: 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65  .  /* Change the
9990: 20 64 61 74 61 20 2a 2f 0a 20 20 69 66 28 20 72   data */.  if( r
99a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
99b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
99c0: 20 2a 70 55 70 20 3d 20 70 52 74 72 65 65 2d 3e   *pUp = pRtree->
99d0: 70 57 72 69 74 65 41 75 78 3b 0a 20 20 20 20 69  pWriteAux;.    i
99e0: 6e 74 20 6a 6a 3b 0a 20 20 20 20 69 6e 74 20 6e  nt jj;.    int n
99f0: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
9a00: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
9a10: 36 34 28 70 55 70 2c 20 31 2c 20 6e 65 77 52 6f  64(pUp, 1, newRo
9a20: 77 69 64 29 3b 0a 20 20 20 20 66 6f 72 28 6a 6a  wid);.    for(jj
9a30: 3d 30 3b 20 6a 6a 3c 70 52 74 72 65 65 2d 3e 6e  =0; jj<pRtree->n
9a40: 41 75 78 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Aux; jj++){.    
9a50: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 76    if( !sqlite3_v
9a60: 61 6c 75 65 5f 6e 6f 63 68 61 6e 67 65 28 61 44  alue_nochange(aD
9a70: 61 74 61 5b 6a 6a 2b 32 5d 29 20 29 20 6e 43 68  ata[jj+2]) ) nCh
9a80: 61 6e 67 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ange++;.      sq
9a90: 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
9aa0: 28 70 55 70 2c 20 6a 6a 2b 32 2c 20 61 44 61 74  (pUp, jj+2, aDat
9ab0: 61 5b 6a 6a 2b 32 5d 29 3b 0a 20 20 20 20 7d 0a  a[jj+2]);.    }.
9ac0: 20 20 20 20 69 66 28 20 6e 43 68 61 6e 67 65 20      if( nChange 
9ad0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9ae0: 5f 73 74 65 70 28 70 55 70 29 3b 0a 20 20 20 20  _step(pUp);.    
9af0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
9b00: 65 73 65 74 28 70 55 70 29 3b 0a 20 20 20 20 7d  eset(pUp);.    }
9b10: 0a 20 20 7d 0a 0a 20 20 72 74 72 65 65 52 65 6c  .  }..  rtreeRel
9b20: 65 61 73 65 28 70 52 74 72 65 65 29 3b 0a 20 20  ease(pRtree);.  
9b30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9b40: 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 61 74 20  .** Report that 
9b50: 67 65 6f 70 6f 6c 79 5f 6f 76 65 72 6c 61 70 28  geopoly_overlap(
9b60: 29 20 69 73 20 61 6e 20 6f 76 65 72 6c 6f 61 64  ) is an overload
9b70: 65 64 20 66 75 6e 63 74 69 6f 6e 20 73 75 69 74  ed function suit
9b80: 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 75 73 65 20  able.** for use 
9b90: 69 6e 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a  in xBestIndex..*
9ba0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6f  /.static int geo
9bb0: 70 6f 6c 79 46 69 6e 64 46 75 6e 63 74 69 6f 6e  polyFindFunction
9bc0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
9bd0: 20 2a 70 56 74 61 62 2c 0a 20 20 69 6e 74 20 6e   *pVtab,.  int n
9be0: 41 72 67 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Arg,.  const cha
9bf0: 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 76 6f 69 64  r *zName,.  void
9c00: 20 28 2a 2a 70 78 46 75 6e 63 29 28 73 71 6c 69   (**pxFunc)(sqli
9c10: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
9c20: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
9c30: 29 2c 0a 20 20 76 6f 69 64 20 2a 2a 70 70 41 72  ),.  void **ppAr
9c40: 67 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  g.){.  if( sqlit
9c50: 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65  e3_stricmp(zName
9c60: 2c 20 22 67 65 6f 70 6f 6c 79 5f 6f 76 65 72 6c  , "geopoly_overl
9c70: 61 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  ap")==0 ){.    *
9c80: 70 78 46 75 6e 63 20 3d 20 67 65 6f 70 6f 6c 79  pxFunc = geopoly
9c90: 4f 76 65 72 6c 61 70 46 75 6e 63 3b 0a 20 20 20  OverlapFunc;.   
9ca0: 20 2a 70 70 41 72 67 20 3d 20 30 3b 0a 20 20 20   *ppArg = 0;.   
9cb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9cc0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
9cd0: 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 7d 0a 20 20  FUNCTION;.  }.  
9ce0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 73 74  return 0;.}...st
9cf0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64  atic sqlite3_mod
9d00: 75 6c 65 20 67 65 6f 70 6f 6c 79 4d 6f 64 75 6c  ule geopolyModul
9d10: 65 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20 20  e = {.  2,      
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
9d40: 2a 2f 0a 20 20 67 65 6f 70 6f 6c 79 43 72 65 61  */.  geopolyCrea
9d50: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
9d60: 20 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 63 72   /* xCreate - cr
9d70: 65 61 74 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a  eate a table */.
9d80: 20 20 67 65 6f 70 6f 6c 79 43 6f 6e 6e 65 63 74    geopolyConnect
9d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
9da0: 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e   xConnect - conn
9db0: 65 63 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69  ect to an existi
9dc0: 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 67 65  ng table */.  ge
9dd0: 6f 70 6f 6c 79 42 65 73 74 49 6e 64 65 78 2c 20  opolyBestIndex, 
9de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65            /* xBe
9df0: 73 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72 6d  stIndex - Determ
9e00: 69 6e 65 20 73 65 61 72 63 68 20 73 74 72 61 74  ine search strat
9e10: 65 67 79 20 2a 2f 0a 20 20 72 74 72 65 65 44 69  egy */.  rtreeDi
9e20: 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  sconnect,       
9e30: 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e       /* xDisconn
9e40: 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65 63 74  ect - Disconnect
9e50: 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 2a 2f   from a table */
9e60: 0a 20 20 72 74 72 65 65 44 65 73 74 72 6f 79 2c  .  rtreeDestroy,
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e80: 2a 20 78 44 65 73 74 72 6f 79 20 2d 20 44 72 6f  * xDestroy - Dro
9e90: 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72  p a table */.  r
9ea0: 74 72 65 65 4f 70 65 6e 2c 20 20 20 20 20 20 20  treeOpen,       
9eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
9ec0: 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72  pen - open a cur
9ed0: 73 6f 72 20 2a 2f 0a 20 20 72 74 72 65 65 43 6c  sor */.  rtreeCl
9ee0: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
9ef0: 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d       /* xClose -
9f00: 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20   close a cursor 
9f10: 2a 2f 0a 20 20 67 65 6f 70 6f 6c 79 46 69 6c 74  */.  geopolyFilt
9f20: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
9f30: 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f   /* xFilter - co
9f40: 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e  nfigure scan con
9f50: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 72 74  straints */.  rt
9f60: 72 65 65 4e 65 78 74 2c 20 20 20 20 20 20 20 20  reeNext,        
9f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65            /* xNe
9f80: 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63  xt - advance a c
9f90: 75 72 73 6f 72 20 2a 2f 0a 20 20 72 74 72 65 65  ursor */.  rtree
9fa0: 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Eof,            
9fb0: 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a         /* xEof *
9fc0: 2f 0a 20 20 67 65 6f 70 6f 6c 79 43 6f 6c 75 6d  /.  geopolyColum
9fd0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
9fe0: 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61  /* xColumn - rea
9ff0: 64 20 64 61 74 61 20 2a 2f 0a 20 20 72 74 72 65  d data */.  rtre
a000: 65 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  eRowid,         
a010: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69          /* xRowi
a020: 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  d - read data */
a030: 0a 20 20 67 65 6f 70 6f 6c 79 55 70 64 61 74 65  .  geopolyUpdate
a040: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a050: 2a 20 78 55 70 64 61 74 65 20 2d 20 77 72 69 74  * xUpdate - writ
a060: 65 20 64 61 74 61 20 2a 2f 0a 20 20 72 74 72 65  e data */.  rtre
a070: 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  eBeginTransactio
a080: 6e 2c 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69  n,      /* xBegi
a090: 6e 20 2d 20 62 65 67 69 6e 20 74 72 61 6e 73 61  n - begin transa
a0a0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65  ction */.  rtree
a0b0: 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  EndTransaction, 
a0c0: 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
a0d0: 2d 20 73 79 6e 63 20 74 72 61 6e 73 61 63 74 69  - sync transacti
a0e0: 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65 45 6e 64  on */.  rtreeEnd
a0f0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
a100: 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d      /* xCommit -
a110: 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74   commit transact
a120: 69 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65 45 6e  ion */.  rtreeEn
a130: 64 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  dTransaction,   
a140: 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63       /* xRollbac
a150: 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61  k - rollback tra
a160: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 67 65  nsaction */.  ge
a170: 6f 70 6f 6c 79 46 69 6e 64 46 75 6e 63 74 69 6f  opolyFindFunctio
a180: 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69  n,        /* xFi
a190: 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e  ndFunction - fun
a1a0: 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
a1b0: 67 20 2a 2f 0a 20 20 72 74 72 65 65 52 65 6e 61  g */.  rtreeRena
a1c0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
a1d0: 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d 20     /* xRename - 
a1e0: 72 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c 65  rename the table
a1f0: 20 2a 2f 0a 20 20 72 74 72 65 65 53 61 76 65 70   */.  rtreeSavep
a200: 6f 69 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  oint,           
a210: 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20    /* xSavepoint 
a220: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a   /* xRelease */.
a250: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a270: 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a   xRollbackTo */.
a280: 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  };..static int s
a290: 71 6c 69 74 65 33 5f 67 65 6f 70 6f 6c 79 5f 69  qlite3_geopoly_i
a2a0: 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nit(sqlite3 *db)
a2b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
a2c0: 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  ITE_OK;.  static
a2d0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
a2e0: 20 20 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63      void (*xFunc
a2f0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
a300: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
a310: 61 6c 75 65 2a 2a 29 3b 0a 20 20 20 20 69 6e 74  alue**);.    int
a320: 20 6e 41 72 67 3b 0a 20 20 20 20 63 6f 6e 73 74   nArg;.    const
a330: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
a340: 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20  } aFunc[] = {.  
a350: 20 20 20 7b 20 67 65 6f 70 6f 6c 79 41 72 65 61     { geopolyArea
a360: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 31  Func,          1
a370: 2c 20 20 20 20 22 67 65 6f 70 6f 6c 79 5f 61 72  ,    "geopoly_ar
a380: 65 61 22 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  ea"     },.     
a390: 7b 20 67 65 6f 70 6f 6c 79 42 6c 6f 62 46 75 6e  { geopolyBlobFun
a3a0: 63 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 20  c,          1,  
a3b0: 20 20 22 67 65 6f 70 6f 6c 79 5f 62 6c 6f 62 22    "geopoly_blob"
a3c0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67       },.     { g
a3d0: 65 6f 70 6f 6c 79 4a 73 6f 6e 46 75 6e 63 2c 20  eopolyJsonFunc, 
a3e0: 20 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 22           1,    "
a3f0: 67 65 6f 70 6f 6c 79 5f 6a 73 6f 6e 22 20 20 20  geopoly_json"   
a400: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67 65 6f 70    },.     { geop
a410: 6f 6c 79 53 76 67 46 75 6e 63 2c 20 20 20 20 20  olySvgFunc,     
a420: 20 20 20 20 20 2d 31 2c 20 20 20 20 22 67 65 6f       -1,    "geo
a430: 70 6f 6c 79 5f 73 76 67 22 20 20 20 20 20 20 7d  poly_svg"      }
a440: 2c 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79  ,.     { geopoly
a450: 57 69 74 68 69 6e 46 75 6e 63 2c 20 20 20 20 20  WithinFunc,     
a460: 20 20 20 33 2c 20 20 20 20 22 67 65 6f 70 6f 6c     3,    "geopol
a470: 79 5f 77 69 74 68 69 6e 22 20 20 20 7d 2c 0a 20  y_within"   },. 
a480: 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 4f 76 65      { geopolyOve
a490: 72 6c 61 70 46 75 6e 63 2c 20 20 20 20 20 20 20  rlapFunc,       
a4a0: 32 2c 20 20 20 20 22 67 65 6f 70 6f 6c 79 5f 6f  2,    "geopoly_o
a4b0: 76 65 72 6c 61 70 22 20 20 7d 2c 0a 20 20 20 20  verlap"  },.    
a4c0: 20 7b 20 67 65 6f 70 6f 6c 79 44 65 62 75 67 46   { geopolyDebugF
a4d0: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 31 2c 20  unc,         1, 
a4e0: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 64 65 62 75     "geopoly_debu
a4f0: 67 22 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  g"    },.     { 
a500: 67 65 6f 70 6f 6c 79 42 42 6f 78 46 75 6e 63 2c  geopolyBBoxFunc,
a510: 20 20 20 20 20 20 20 20 20 20 31 2c 20 20 20 20            1,    
a520: 22 67 65 6f 70 6f 6c 79 5f 62 62 6f 78 22 20 20  "geopoly_bbox"  
a530: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67 65 6f     },.     { geo
a540: 70 6f 6c 79 58 66 6f 72 6d 46 75 6e 63 2c 20 20  polyXformFunc,  
a550: 20 20 20 20 20 20 20 37 2c 20 20 20 20 22 67 65         7,    "ge
a560: 6f 70 6f 6c 79 5f 78 66 6f 72 6d 22 20 20 20 20  opoly_xform"    
a570: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  },.  };.  int i;
a580: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
a590: 7a 65 6f 66 28 61 46 75 6e 63 29 2f 73 69 7a 65  zeof(aFunc)/size
a5a0: 6f 66 28 61 46 75 6e 63 5b 30 5d 29 20 26 26 20  of(aFunc[0]) && 
a5b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
a5c0: 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ++){.    rc = sq
a5d0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
a5e0: 63 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 5b  ction(db, aFunc[
a5f0: 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 5b  i].zName, aFunc[
a600: 69 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20  i].nArg,.       
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a620: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
a630: 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 20 20 20 20 20 20 20 20 61 46 75 6e 63             aFunc
a660: 5b 69 5d 2e 78 46 75 6e 63 2c 20 30 2c 20 30 29  [i].xFunc, 0, 0)
a670: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
a680: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a690: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
a6a0: 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 64  eate_module_v2(d
a6b0: 62 2c 20 22 67 65 6f 70 6f 6c 79 22 2c 20 26 67  b, "geopoly", &g
a6c0: 65 6f 70 6f 6c 79 4d 6f 64 75 6c 65 2c 20 30 2c  eopolyModule, 0,
a6d0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
a6e0: 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.