/ Hex Artifact Content
Login

Artifact c591164125808f8bba9659e92665b78412cd263e654b6f05294f3a8da7cdd9fb:


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 2a 0a 2a 2a 20 45   integer.**.** E
0f00: 6e 6f 75 67 68 20 73 70 61 63 65 20 69 73 20 61  nough space is a
0f10: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 34 20 63  llocated for 4 c
0f20: 6f 6f 72 64 69 6e 61 74 65 73 2c 20 74 6f 20 77  oordinates, to w
0f30: 6f 72 6b 20 61 72 6f 75 6e 64 20 6f 76 65 72 2d  ork around over-
0f40: 7a 65 61 6c 6f 75 73 0a 2a 2a 20 77 61 72 6e 69  zealous.** warni
0f50: 6e 67 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  ngs coming from 
0f60: 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 20 28 6e  some compiler (n
0f70: 6f 74 61 62 6c 79 2c 20 63 6c 61 6e 67 29 2e 20  otably, clang). 
0f80: 49 6e 20 72 65 61 6c 69 74 79 2c 20 74 68 65 20  In reality, the 
0f90: 73 69 7a 65 0a 2a 2a 20 6f 66 20 65 61 63 68 20  size.** of each 
0fa0: 47 65 6f 50 6f 6c 79 20 6d 65 6d 6f 72 79 20 61  GeoPoly memory a
0fb0: 6c 6c 6f 63 61 74 65 20 69 73 20 61 64 6a 75 73  llocate is adjus
0fc0: 74 65 64 20 61 73 20 6e 65 63 65 73 73 61 72 79  ted as necessary
0fd0: 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
0fe0: 47 65 6f 50 6f 6c 79 2e 61 5b 5d 20 61 72 72 61  GeoPoly.a[] arra
0ff0: 79 20 61 74 20 74 68 65 20 65 6e 64 20 69 73 20  y at the end is 
1000: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
1010: 73 69 7a 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  size..*/.typedef
1020: 20 73 74 72 75 63 74 20 47 65 6f 50 6f 6c 79 20   struct GeoPoly 
1030: 47 65 6f 50 6f 6c 79 3b 0a 73 74 72 75 63 74 20  GeoPoly;.struct 
1040: 47 65 6f 50 6f 6c 79 20 7b 0a 20 20 69 6e 74 20  GeoPoly {.  int 
1050: 6e 56 65 72 74 65 78 3b 20 20 20 20 20 20 20 20  nVertex;        
1060: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
1070: 65 72 74 65 78 65 73 20 2a 2f 0a 20 20 75 6e 73  ertexes */.  uns
1080: 69 67 6e 65 64 20 63 68 61 72 20 68 64 72 5b 34  igned char hdr[4
1090: 5d 3b 20 2f 2a 20 48 65 61 64 65 72 20 66 6f 72  ]; /* Header for
10a0: 20 6f 6e 2d 64 69 73 6b 20 72 65 70 72 65 73 65   on-disk represe
10b0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 47 65 6f  ntation */.  Geo
10c0: 43 6f 6f 72 64 20 61 5b 38 5d 3b 20 20 20 20 20  Coord a[8];     
10d0: 20 20 20 2f 2a 20 32 2a 6e 56 65 72 74 65 78 20     /* 2*nVertex 
10e0: 76 61 6c 75 65 73 2e 20 58 20 28 6c 6f 6e 67 69  values. X (longi
10f0: 74 75 64 65 29 20 66 69 72 73 74 2c 20 74 68 65  tude) first, the
1100: 6e 20 59 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  n Y */.};../* Th
1110: 65 20 73 69 7a 65 20 6f 66 20 61 20 6d 65 6d 6f  e size of a memo
1120: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e 65  ry allocation ne
1130: 65 64 65 64 20 66 6f 72 20 61 20 47 65 6f 50 6f  eded for a GeoPo
1140: 6c 79 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63  ly object suffic
1150: 69 65 6e 74 0a 2a 2a 20 74 6f 20 68 6f 6c 64 20  ient.** to hold 
1160: 4e 20 63 6f 6f 72 64 69 6e 61 74 65 20 70 61 69  N coordinate pai
1170: 72 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  rs..*/.#define G
1180: 45 4f 50 4f 4c 59 5f 53 5a 28 4e 29 20 20 28 73  EOPOLY_SZ(N)  (s
1190: 69 7a 65 6f 66 28 47 65 6f 50 6f 6c 79 29 20 2b  izeof(GeoPoly) +
11a0: 20 73 69 7a 65 6f 66 28 47 65 6f 43 6f 6f 72 64   sizeof(GeoCoord
11b0: 29 2a 32 2a 28 28 4e 29 2d 34 29 29 0a 0a 2f 2a  )*2*((N)-4))../*
11c0: 20 4d 61 63 72 6f 73 20 74 6f 20 61 63 63 65 73   Macros to acces
11d0: 73 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 6f 66  s coordinates of
11e0: 20 61 20 47 65 6f 50 6f 6c 79 2e 0a 2a 2a 20 57   a GeoPoly..** W
11f0: 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68  e have to use th
1200: 65 73 65 20 6d 61 63 72 6f 73 2c 20 72 61 74 68  ese macros, rath
1210: 65 72 20 74 68 61 6e 20 6a 75 73 74 20 73 61 79  er than just say
1220: 20 70 2d 3e 61 5b 69 5d 20 69 6e 20 6f 72 64 65   p->a[i] in orde
1230: 72 0a 2a 2a 20 74 6f 20 73 69 6c 65 6e 63 65 20  r.** to silence 
1240: 28 69 6e 63 6f 72 72 65 63 74 29 20 55 42 53 41  (incorrect) UBSA
1250: 4e 20 77 61 72 6e 69 6e 67 73 20 69 66 20 74 68  N warnings if th
1260: 65 20 61 72 72 61 79 20 69 6e 64 65 78 20 69 73  e array index is
1270: 20 74 6f 6f 20 6c 61 72 67 65 2e 0a 2a 2f 0a 23   too large..*/.#
1280: 64 65 66 69 6e 65 20 47 65 6f 58 28 50 2c 49 29  define GeoX(P,I)
1290: 20 20 28 28 28 47 65 6f 43 6f 6f 72 64 2a 29 28    (((GeoCoord*)(
12a0: 50 29 2d 3e 61 29 5b 28 49 29 2a 32 5d 29 0a 23  P)->a)[(I)*2]).#
12b0: 64 65 66 69 6e 65 20 47 65 6f 59 28 50 2c 49 29  define GeoY(P,I)
12c0: 20 20 28 28 28 47 65 6f 43 6f 6f 72 64 2a 29 28    (((GeoCoord*)(
12d0: 50 29 2d 3e 61 29 5b 28 49 29 2a 32 2b 31 5d 29  P)->a)[(I)*2+1])
12e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 6f  .../*.** State o
12f0: 66 20 61 20 70 61 72 73 65 20 6f 66 20 61 20 47  f a parse of a G
1300: 65 6f 4a 53 4f 4e 20 69 6e 70 75 74 2e 0a 2a 2f  eoJSON input..*/
1310: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1320: 47 65 6f 50 61 72 73 65 20 47 65 6f 50 61 72 73  GeoParse GeoPars
1330: 65 3b 0a 73 74 72 75 63 74 20 47 65 6f 50 61 72  e;.struct GeoPar
1340: 73 65 20 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  se {.  const uns
1350: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 20 20  igned char *z;  
1360: 20 2f 2a 20 55 6e 70 61 72 73 65 64 20 69 6e 70   /* Unparsed inp
1370: 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 72  ut */.  int nVer
1380: 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
1390: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
13a0: 65 72 74 65 78 65 73 20 69 6e 20 61 5b 5d 20 2a  ertexes in a[] *
13b0: 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20  /.  int nAlloc; 
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13d0: 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   Space allocated
13e0: 20 74 6f 20 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   to a[] */.  int
13f0: 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20 20   nErr;          
1400: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1410: 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
1420: 6e 74 65 72 65 64 20 2a 2f 0a 20 20 47 65 6f 43  ntered */.  GeoC
1430: 6f 6f 72 64 20 2a 61 3b 20 20 20 20 20 20 20 20  oord *a;        
1440: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 76 65    /* Array of ve
1450: 72 74 65 78 65 73 2e 20 20 46 72 6f 6d 20 73 71  rtexes.  From sq
1460: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
1470: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 44 6f 20 61 20   */.};../* Do a 
1480: 34 2d 62 79 74 65 20 62 79 74 65 20 73 77 61 70  4-byte byte swap
1490: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
14a0: 67 65 6f 70 6f 6c 79 53 77 61 62 33 32 28 75 6e  geopolySwab32(un
14b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b  signed char *a){
14c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
14d0: 20 74 20 3d 20 61 5b 30 5d 3b 0a 20 20 61 5b 30   t = a[0];.  a[0
14e0: 5d 20 3d 20 61 5b 33 5d 3b 0a 20 20 61 5b 33 5d  ] = a[3];.  a[3]
14f0: 20 3d 20 74 3b 0a 20 20 74 20 3d 20 61 5b 31 5d   = t;.  t = a[1]
1500: 3b 0a 20 20 61 5b 31 5d 20 3d 20 61 5b 32 5d 3b  ;.  a[1] = a[2];
1510: 0a 20 20 61 5b 32 5d 20 3d 20 74 3b 0a 7d 0a 0a  .  a[2] = t;.}..
1520: 2f 2a 20 53 6b 69 70 20 77 68 69 74 65 73 70 61  /* Skip whitespa
1530: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
1540: 6e 65 78 74 20 6e 6f 6e 2d 77 68 69 74 65 73 70  next non-whitesp
1550: 61 63 65 20 63 68 61 72 61 63 74 65 72 2e 20 2a  ace character. *
1560: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 67 65  /.static char ge
1570: 6f 70 6f 6c 79 53 6b 69 70 53 70 61 63 65 28 47  opolySkipSpace(G
1580: 65 6f 50 61 72 73 65 20 2a 70 29 7b 0a 20 20 77  eoParse *p){.  w
1590: 68 69 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61  hile( safe_isspa
15a0: 63 65 28 70 2d 3e 7a 5b 30 5d 29 20 29 20 70 2d  ce(p->z[0]) ) p-
15b0: 3e 7a 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70  >z++;.  return p
15c0: 2d 3e 7a 5b 30 5d 3b 0a 7d 0a 0a 2f 2a 20 50 61  ->z[0];.}../* Pa
15d0: 72 73 65 20 6f 75 74 20 61 20 6e 75 6d 62 65 72  rse out a number
15e0: 2e 20 20 57 72 69 74 65 20 74 68 65 20 76 61 6c  .  Write the val
15f0: 75 65 20 69 6e 74 6f 20 2a 70 56 61 6c 20 69 66  ue into *pVal if
1600: 20 70 56 61 6c 21 3d 30 2e 0a 2a 2a 20 72 65 74   pVal!=0..** ret
1610: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
1620: 73 75 63 63 65 73 73 20 61 6e 64 20 7a 65 72 6f  success and zero
1630: 20 69 66 20 74 68 65 20 6e 65 78 74 20 74 6f 6b   if the next tok
1640: 65 6e 20 69 73 20 6e 6f 74 20 61 20 6e 75 6d 62  en is not a numb
1650: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1660: 74 20 67 65 6f 70 6f 6c 79 50 61 72 73 65 4e 75  t geopolyParseNu
1670: 6d 62 65 72 28 47 65 6f 50 61 72 73 65 20 2a 70  mber(GeoParse *p
1680: 2c 20 47 65 6f 43 6f 6f 72 64 20 2a 70 56 61 6c  , GeoCoord *pVal
1690: 29 7b 0a 20 20 63 68 61 72 20 63 20 3d 20 67 65  ){.  char c = ge
16a0: 6f 70 6f 6c 79 53 6b 69 70 53 70 61 63 65 28 70  opolySkipSpace(p
16b0: 29 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  );.  const unsig
16c0: 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 70 2d  ned char *z = p-
16d0: 3e 7a 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b  >z;.  int j = 0;
16e0: 0a 20 20 69 6e 74 20 73 65 65 6e 44 50 20 3d 20  .  int seenDP = 
16f0: 30 3b 0a 20 20 69 6e 74 20 73 65 65 6e 45 20 3d  0;.  int seenE =
1700: 20 30 3b 0a 20 20 69 66 28 20 63 3d 3d 27 2d 27   0;.  if( c=='-'
1710: 20 29 7b 0a 20 20 20 20 6a 20 3d 20 31 3b 0a 20   ){.    j = 1;. 
1720: 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 7d     c = z[j];.  }
1730: 0a 20 20 69 66 28 20 63 3d 3d 27 30 27 20 26 26  .  if( c=='0' &&
1740: 20 7a 5b 6a 2b 31 5d 3e 3d 27 30 27 20 26 26 20   z[j+1]>='0' && 
1750: 7a 5b 6a 2b 31 5d 3c 3d 27 39 27 20 29 20 72 65  z[j+1]<='9' ) re
1760: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 3b 3b  turn 0;.  for(;;
1770: 20 6a 2b 2b 29 7b 0a 20 20 20 20 63 20 3d 20 7a   j++){.    c = z
1780: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 73 61 66  [j];.    if( saf
1790: 65 5f 69 73 64 69 67 69 74 28 63 29 20 29 20 63  e_isdigit(c) ) c
17a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
17b0: 20 63 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20   c=='.' ){.     
17c0: 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 2d 27   if( z[j-1]=='-'
17d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
17e0: 20 20 20 69 66 28 20 73 65 65 6e 44 50 20 29 20     if( seenDP ) 
17f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1800: 73 65 65 6e 44 50 20 3d 20 31 3b 0a 20 20 20 20  seenDP = 1;.    
1810: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1820: 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 65 27  }.    if( c=='e'
1830: 20 7c 7c 20 63 3d 3d 27 45 27 20 29 7b 0a 20 20   || c=='E' ){.  
1840: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c 27      if( z[j-1]<'
1850: 30 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0' ) return 0;. 
1860: 20 20 20 20 20 69 66 28 20 73 65 65 6e 45 20 29       if( seenE )
1870: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1880: 20 20 73 65 65 6e 44 50 20 3d 20 73 65 65 6e 45    seenDP = seenE
1890: 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 20 3d 20   = 1;.      c = 
18a0: 7a 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20 69 66  z[j+1];.      if
18b0: 28 20 63 3d 3d 27 2b 27 20 7c 7c 20 63 3d 3d 27  ( c=='+' || c=='
18c0: 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 2b  -' ){.        j+
18d0: 2b 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  +;.        c = z
18e0: 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  [j+1];.      }. 
18f0: 20 20 20 20 20 69 66 28 20 63 3c 27 30 27 20 7c       if( c<'0' |
1900: 7c 20 63 3e 27 39 27 20 29 20 72 65 74 75 72 6e  | c>'9' ) return
1910: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
1920: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  ue;.    }.    br
1930: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  eak;.  }.  if( z
1940: 5b 6a 2d 31 5d 3c 27 30 27 20 29 20 72 65 74 75  [j-1]<'0' ) retu
1950: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 56 61 6c  rn 0;.  if( pVal
1960: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
1970: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 20  E_AMALGAMATION. 
1980: 20 20 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74      /* The sqlit
1990: 65 33 41 74 6f 46 28 29 20 72 6f 75 74 69 6e 65  e3AtoF() routine
19a0: 20 69 73 20 6d 75 63 68 20 6d 75 63 68 20 66 61   is much much fa
19b0: 73 74 65 72 20 74 68 61 6e 20 61 74 6f 66 28 29  ster than atof()
19c0: 2c 20 69 66 20 69 74 0a 20 20 20 20 20 2a 2a 20  , if it.     ** 
19d0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  is available */.
19e0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
19f0: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
1a00: 33 41 74 6f 46 28 28 63 6f 6e 73 74 20 63 68 61  3AtoF((const cha
1a10: 72 2a 29 70 2d 3e 7a 2c 20 26 72 2c 20 6a 2c 20  r*)p->z, &r, j, 
1a20: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
1a30: 20 20 20 2a 70 56 61 6c 20 3d 20 72 3b 0a 23 65     *pVal = r;.#e
1a40: 6c 73 65 0a 20 20 20 20 20 2a 70 56 61 6c 20 3d  lse.     *pVal =
1a50: 20 28 47 65 6f 43 6f 6f 72 64 29 61 74 6f 66 28   (GeoCoord)atof(
1a60: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 2d 3e  (const char*)p->
1a70: 7a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  z);.#endif.  }. 
1a80: 20 70 2d 3e 7a 20 2b 3d 20 6a 3b 0a 20 20 72 65   p->z += j;.  re
1a90: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
1aa0: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73   If the input is
1ab0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a   a well-formed J
1ac0: 53 4f 4e 20 61 72 72 61 79 20 6f 66 20 63 6f 6f  SON array of coo
1ad0: 72 64 69 6e 61 74 65 73 20 77 69 74 68 20 61 74  rdinates with at
1ae0: 20 6c 65 61 73 74 0a 2a 2a 20 66 6f 75 72 20 63   least.** four c
1af0: 6f 6f 72 64 69 6e 61 74 65 73 20 61 6e 64 20 77  oordinates and w
1b00: 68 65 72 65 20 65 61 63 68 20 63 6f 6f 72 64 69  here each coordi
1b10: 6e 61 74 65 20 69 73 20 69 74 73 65 6c 66 20 61  nate is itself a
1b20: 20 74 77 6f 2d 76 61 6c 75 65 20 61 72 72 61 79   two-value array
1b30: 2c 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 76 65 72  ,.** then conver
1b40: 74 20 74 68 65 20 4a 53 4f 4e 20 69 6e 74 6f 20  t the JSON into 
1b50: 61 20 47 65 6f 50 6f 6c 79 20 6f 62 6a 65 63 74  a GeoPoly object
1b60: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
1b70: 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74  inter to.** that
1b80: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49   object..**.** I
1b90: 66 20 61 6e 79 20 65 72 72 6f 72 20 6f 63 63 75  f any error occu
1ba0: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  rs, return NULL.
1bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f 50 6f  .*/.static GeoPo
1bc0: 6c 79 20 2a 67 65 6f 70 6f 6c 79 50 61 72 73 65  ly *geopolyParse
1bd0: 4a 73 6f 6e 28 63 6f 6e 73 74 20 75 6e 73 69 67  Json(const unsig
1be0: 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  ned char *z, int
1bf0: 20 2a 70 52 63 29 7b 0a 20 20 47 65 6f 50 61 72   *pRc){.  GeoPar
1c00: 73 65 20 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  se s;.  int rc =
1c10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
1c20: 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65  mset(&s, 0, size
1c30: 6f 66 28 73 29 29 3b 0a 20 20 73 2e 7a 20 3d 20  of(s));.  s.z = 
1c40: 7a 3b 0a 20 20 69 66 28 20 67 65 6f 70 6f 6c 79  z;.  if( geopoly
1c50: 53 6b 69 70 53 70 61 63 65 28 26 73 29 3d 3d 27  SkipSpace(&s)=='
1c60: 5b 27 20 29 7b 0a 20 20 20 20 73 2e 7a 2b 2b 3b  [' ){.    s.z++;
1c70: 0a 20 20 20 20 77 68 69 6c 65 28 20 67 65 6f 70  .    while( geop
1c80: 6f 6c 79 53 6b 69 70 53 70 61 63 65 28 26 73 29  olySkipSpace(&s)
1c90: 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 69  =='[' ){.      i
1ca0: 6e 74 20 69 69 20 3d 20 30 3b 0a 20 20 20 20 20  nt ii = 0;.     
1cb0: 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20 20 73   char c;.      s
1cc0: 2e 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  .z++;.      if( 
1cd0: 73 2e 6e 56 65 72 74 65 78 3e 3d 73 2e 6e 41 6c  s.nVertex>=s.nAl
1ce0: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 47  loc ){.        G
1cf0: 65 6f 43 6f 6f 72 64 20 2a 61 4e 65 77 3b 0a 20  eoCoord *aNew;. 
1d00: 20 20 20 20 20 20 20 73 2e 6e 41 6c 6c 6f 63 20         s.nAlloc 
1d10: 3d 20 73 2e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31  = s.nAlloc*2 + 1
1d20: 36 3b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 20  6;.        aNew 
1d30: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
1d40: 63 36 34 28 73 2e 61 2c 20 73 2e 6e 41 6c 6c 6f  c64(s.a, s.nAllo
1d50: 63 2a 73 69 7a 65 6f 66 28 47 65 6f 43 6f 6f 72  c*sizeof(GeoCoor
1d60: 64 29 2a 32 20 29 3b 0a 20 20 20 20 20 20 20 20  d)*2 );.        
1d70: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
1d80: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1d90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1da0: 20 20 20 20 20 20 73 2e 6e 45 72 72 2b 2b 3b 0a        s.nErr++;.
1db0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1dc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1dd0: 20 20 20 73 2e 61 20 3d 20 61 4e 65 77 3b 0a 20     s.a = aNew;. 
1de0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
1df0: 6c 65 28 20 67 65 6f 70 6f 6c 79 50 61 72 73 65  le( geopolyParse
1e00: 4e 75 6d 62 65 72 28 26 73 2c 20 69 69 3c 3d 31  Number(&s, ii<=1
1e10: 20 3f 20 26 73 2e 61 5b 73 2e 6e 56 65 72 74 65   ? &s.a[s.nVerte
1e20: 78 2a 32 2b 69 69 5d 20 3a 20 30 29 20 29 7b 0a  x*2+ii] : 0) ){.
1e30: 20 20 20 20 20 20 20 20 69 69 2b 2b 3b 0a 20 20          ii++;.  
1e40: 20 20 20 20 20 20 69 66 28 20 69 69 3d 3d 32 20        if( ii==2 
1e50: 29 20 73 2e 6e 56 65 72 74 65 78 2b 2b 3b 0a 20  ) s.nVertex++;. 
1e60: 20 20 20 20 20 20 20 63 20 3d 20 67 65 6f 70 6f         c = geopo
1e70: 6c 79 53 6b 69 70 53 70 61 63 65 28 26 73 29 3b  lySkipSpace(&s);
1e80: 0a 20 20 20 20 20 20 20 20 73 2e 7a 2b 2b 3b 0a  .        s.z++;.
1e90: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
1ea0: 2c 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ,' ) continue;. 
1eb0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d         if( c==']
1ec0: 27 20 26 26 20 69 69 3e 3d 32 20 29 20 62 72 65  ' && ii>=2 ) bre
1ed0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 2e 6e 45  ak;.        s.nE
1ee0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 63  rr++;.        rc
1ef0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1f00: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
1f10: 72 73 65 5f 6a 73 6f 6e 5f 65 72 72 3b 0a 20 20  rse_json_err;.  
1f20: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1f30: 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70 61 63 65  geopolySkipSpace
1f40: 28 26 73 29 3d 3d 27 2c 27 20 29 7b 0a 20 20 20  (&s)==',' ){.   
1f50: 20 20 20 20 20 73 2e 7a 2b 2b 3b 0a 20 20 20 20       s.z++;.    
1f60: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f70: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1f80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
1f90: 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70 61 63   geopolySkipSpac
1fa0: 65 28 26 73 29 3d 3d 27 5d 27 0a 20 20 20 20 20  e(&s)==']'.     
1fb0: 26 26 20 73 2e 6e 56 65 72 74 65 78 3e 3d 34 0a  && s.nVertex>=4.
1fc0: 20 20 20 20 20 26 26 20 73 2e 61 5b 30 5d 3d 3d       && s.a[0]==
1fd0: 73 2e 61 5b 73 2e 6e 56 65 72 74 65 78 2a 32 2d  s.a[s.nVertex*2-
1fe0: 32 5d 0a 20 20 20 20 20 26 26 20 73 2e 61 5b 31  2].     && s.a[1
1ff0: 5d 3d 3d 73 2e 61 5b 73 2e 6e 56 65 72 74 65 78  ]==s.a[s.nVertex
2000: 2a 32 2d 31 5d 0a 20 20 20 20 20 26 26 20 28 73  *2-1].     && (s
2010: 2e 7a 2b 2b 2c 20 67 65 6f 70 6f 6c 79 53 6b 69  .z++, geopolySki
2020: 70 53 70 61 63 65 28 26 73 29 3d 3d 30 29 0a 20  pSpace(&s)==0). 
2030: 20 20 20 29 7b 0a 20 20 20 20 20 20 47 65 6f 50     ){.      GeoP
2040: 6f 6c 79 20 2a 70 4f 75 74 3b 0a 20 20 20 20 20  oly *pOut;.     
2050: 20 69 6e 74 20 78 20 3d 20 31 3b 0a 20 20 20 20   int x = 1;.    
2060: 20 20 73 2e 6e 56 65 72 74 65 78 2d 2d 3b 20 20    s.nVertex--;  
2070: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65  /* Remove the re
2080: 64 75 6e 64 61 6e 74 20 76 65 72 74 65 78 20 61  dundant vertex a
2090: 74 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 20  t the end */.   
20a0: 20 20 20 70 4f 75 74 20 3d 20 73 71 6c 69 74 65     pOut = sqlite
20b0: 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 47 45 4f 50  3_malloc64( GEOP
20c0: 4f 4c 59 5f 53 5a 28 28 73 71 6c 69 74 65 33 5f  OLY_SZ((sqlite3_
20d0: 69 6e 74 36 34 29 73 2e 6e 56 65 72 74 65 78 29  int64)s.nVertex)
20e0: 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 31 3b   );.      x = 1;
20f0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 75 74 3d  .      if( pOut=
2100: 3d 30 20 29 20 67 6f 74 6f 20 70 61 72 73 65 5f  =0 ) goto parse_
2110: 6a 73 6f 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20  json_err;.      
2120: 70 4f 75 74 2d 3e 6e 56 65 72 74 65 78 20 3d 20  pOut->nVertex = 
2130: 73 2e 6e 56 65 72 74 65 78 3b 0a 20 20 20 20 20  s.nVertex;.     
2140: 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61 2c   memcpy(pOut->a,
2150: 20 73 2e 61 2c 20 73 2e 6e 56 65 72 74 65 78 2a   s.a, s.nVertex*
2160: 32 2a 73 69 7a 65 6f 66 28 47 65 6f 43 6f 6f 72  2*sizeof(GeoCoor
2170: 64 29 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  d));.      pOut-
2180: 3e 68 64 72 5b 30 5d 20 3d 20 2a 28 75 6e 73 69  >hdr[0] = *(unsi
2190: 67 6e 65 64 20 63 68 61 72 2a 29 26 78 3b 0a 20  gned char*)&x;. 
21a0: 20 20 20 20 20 70 4f 75 74 2d 3e 68 64 72 5b 31       pOut->hdr[1
21b0: 5d 20 3d 20 28 73 2e 6e 56 65 72 74 65 78 3e 3e  ] = (s.nVertex>>
21c0: 31 36 29 26 30 78 66 66 3b 0a 20 20 20 20 20 20  16)&0xff;.      
21d0: 70 4f 75 74 2d 3e 68 64 72 5b 32 5d 20 3d 20 28  pOut->hdr[2] = (
21e0: 73 2e 6e 56 65 72 74 65 78 3e 3e 38 29 26 30 78  s.nVertex>>8)&0x
21f0: 66 66 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  ff;.      pOut->
2200: 68 64 72 5b 33 5d 20 3d 20 73 2e 6e 56 65 72 74  hdr[3] = s.nVert
2210: 65 78 26 30 78 66 66 3b 0a 20 20 20 20 20 20 73  ex&0xff;.      s
2220: 71 6c 69 74 65 33 5f 66 72 65 65 28 73 2e 61 29  qlite3_free(s.a)
2230: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 63 20  ;.      if( pRc 
2240: 29 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f  ) *pRc = SQLITE_
2250: 4f 4b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OK;.      return
2260: 20 70 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65   pOut;.    }else
2270: 7b 0a 20 20 20 20 20 20 73 2e 6e 45 72 72 2b 2b  {.      s.nErr++
2280: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
2290: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
22a0: 0a 20 20 7d 0a 70 61 72 73 65 5f 6a 73 6f 6e 5f  .  }.parse_json_
22b0: 65 72 72 3a 0a 20 20 69 66 28 20 70 52 63 20 29  err:.  if( pRc )
22c0: 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 73 71   *pRc = rc;.  sq
22d0: 6c 69 74 65 33 5f 66 72 65 65 28 73 2e 61 29 3b  lite3_free(s.a);
22e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
22f0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 75  /*.** Given a fu
2300: 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
2310: 2c 20 74 72 79 20 74 6f 20 69 6e 74 65 72 70 72  , try to interpr
2320: 65 74 20 69 74 20 61 73 20 61 20 70 6f 6c 79 67  et it as a polyg
2330: 6f 6e 2c 20 65 69 74 68 65 72 0a 2a 2a 20 69 6e  on, either.** in
2340: 20 74 68 65 20 62 69 6e 61 72 79 20 66 6f 72 6d   the binary form
2350: 61 74 20 6f 72 20 4a 53 4f 4e 20 74 65 78 74 2e  at or JSON text.
2360: 20 20 43 6f 6d 70 75 74 65 20 61 20 47 65 6f 50    Compute a GeoP
2370: 6f 6c 79 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a  oly object and.*
2380: 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * return a point
2390: 65 72 20 74 6f 20 74 68 61 74 20 6f 62 6a 65 63  er to that objec
23a0: 74 2e 20 20 4f 72 20 69 66 20 74 68 65 20 69 6e  t.  Or if the in
23b0: 70 75 74 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  put is not a wel
23c0: 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 70 6f 6c 79  l-formed.** poly
23d0: 67 6f 6e 2c 20 70 75 74 20 61 6e 20 65 72 72 6f  gon, put an erro
23e0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 73 71 6c  r message in sql
23f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 61 6e 64  ite3_context and
2400: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
2410: 0a 73 74 61 74 69 63 20 47 65 6f 50 6f 6c 79 20  .static GeoPoly 
2420: 2a 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61  *geopolyFuncPara
2430: 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  m(.  sqlite3_con
2440: 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20  text *pCtx,     
2450: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
2460: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a  error messages *
2470: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
2480: 65 20 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20  e *pVal,        
2490: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 74 6f 20  /* The value to 
24a0: 64 65 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  decode */.  int 
24b0: 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20  *pRc            
24c0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
24d0: 20 65 72 72 6f 72 20 68 65 72 65 20 2a 2f 0a 29   error here */.)
24e0: 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20 3d  {.  GeoPoly *p =
24f0: 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   0;.  int nByte;
2500: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
2510: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
2520: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 0a 20 20 20  =SQLITE_BLOB.   
2530: 26 26 20 28 6e 42 79 74 65 20 3d 20 73 71 6c 69  && (nByte = sqli
2540: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
2550: 70 56 61 6c 29 29 3e 3d 28 34 2b 36 2a 73 69 7a  pVal))>=(4+6*siz
2560: 65 6f 66 28 47 65 6f 43 6f 6f 72 64 29 29 0a 20  eof(GeoCoord)). 
2570: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   ){.    const un
2580: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 20 3d  signed char *a =
2590: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
25a0: 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20 20 69  lob(pVal);.    i
25b0: 6e 74 20 6e 56 65 72 74 65 78 3b 0a 20 20 20 20  nt nVertex;.    
25c0: 6e 56 65 72 74 65 78 20 3d 20 28 61 5b 31 5d 3c  nVertex = (a[1]<
25d0: 3c 31 36 29 20 2b 20 28 61 5b 32 5d 3c 3c 38 29  <16) + (a[2]<<8)
25e0: 20 2b 20 61 5b 33 5d 3b 0a 20 20 20 20 69 66 28   + a[3];.    if(
25f0: 20 28 61 5b 30 5d 3d 3d 30 20 7c 7c 20 61 5b 30   (a[0]==0 || a[0
2600: 5d 3d 3d 31 29 0a 20 20 20 20 20 26 26 20 28 6e  ]==1).     && (n
2610: 56 65 72 74 65 78 2a 32 2a 73 69 7a 65 6f 66 28  Vertex*2*sizeof(
2620: 47 65 6f 43 6f 6f 72 64 29 20 2b 20 34 29 3d 3d  GeoCoord) + 4)==
2630: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 6e 42  (unsigned int)nB
2640: 79 74 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  yte.    ){.     
2650: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
2660: 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
2670: 29 20 2b 20 28 6e 56 65 72 74 65 78 2d 31 29 2a  ) + (nVertex-1)*
2680: 32 2a 73 69 7a 65 6f 66 28 47 65 6f 43 6f 6f 72  2*sizeof(GeoCoor
2690: 64 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  d) );.      if( 
26a0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p==0 ){.        
26b0: 69 66 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d  if( pRc ) *pRc =
26c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
26d0: 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 20         if( pCtx 
26e0: 29 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ) sqlite3_result
26f0: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74  _error_nomem(pCt
2700: 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  x);.      }else{
2710: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
2720: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
2730: 56 65 72 74 65 78 20 3d 20 6e 56 65 72 74 65 78  Vertex = nVertex
2740: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
2750: 28 70 2d 3e 68 64 72 2c 20 61 2c 20 6e 42 79 74  (p->hdr, a, nByt
2760: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2770: 61 5b 30 5d 20 21 3d 20 2a 28 75 6e 73 69 67 6e  a[0] != *(unsign
2780: 65 64 20 63 68 61 72 2a 29 26 78 20 29 7b 0a 20  ed char*)&x ){. 
2790: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
27a0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
27b0: 69 3d 30 3b 20 69 69 3c 6e 56 65 72 74 65 78 3b  i=0; ii<nVertex;
27c0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
27d0: 20 20 20 20 67 65 6f 70 6f 6c 79 53 77 61 62 33      geopolySwab3
27e0: 32 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  2((unsigned char
27f0: 2a 29 26 47 65 6f 58 28 70 2c 69 69 29 29 3b 0a  *)&GeoX(p,ii));.
2800: 20 20 20 20 20 20 20 20 20 20 20 20 67 65 6f 70              geop
2810: 6f 6c 79 53 77 61 62 33 32 28 28 75 6e 73 69 67  olySwab32((unsig
2820: 6e 65 64 20 63 68 61 72 2a 29 26 47 65 6f 59 28  ned char*)&GeoY(
2830: 70 2c 69 69 29 29 3b 0a 20 20 20 20 20 20 20 20  p,ii));.        
2840: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
2850: 3e 68 64 72 5b 30 5d 20 5e 3d 20 31 3b 0a 20 20  >hdr[0] ^= 1;.  
2860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2870: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52      }.    if( pR
2880: 63 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49 54  c ) *pRc = SQLIT
2890: 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  E_OK;.    return
28a0: 20 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   p;.  }else if( 
28b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
28c0: 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45  pe(pVal)==SQLITE
28d0: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 63 6f 6e  _TEXT ){.    con
28e0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
28f0: 20 2a 7a 4a 73 6f 6e 20 3d 20 73 71 6c 69 74 65   *zJson = sqlite
2900: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61  3_value_text(pVa
2910: 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4a 73 6f  l);.    if( zJso
2920: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  n==0 ){.      if
2930: 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20 53  ( pRc ) *pRc = S
2940: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2950: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2960: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 67 65   }.    return ge
2970: 6f 70 6f 6c 79 50 61 72 73 65 4a 73 6f 6e 28 7a  opolyParseJson(z
2980: 4a 73 6f 6e 2c 20 70 52 63 29 3b 0a 20 20 7d 65  Json, pRc);.  }e
2990: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 63  lse{.    if( pRc
29a0: 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45   ) *pRc = SQLITE
29b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75  _ERROR;.    retu
29c0: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
29d0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
29e0: 6e 20 6f 66 20 74 68 65 20 67 65 6f 70 6f 6c 79  n of the geopoly
29f0: 5f 62 6c 6f 62 28 58 29 20 66 75 6e 63 74 69 6f  _blob(X) functio
2a00: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
2a10: 69 6e 70 75 74 20 69 73 20 61 20 77 65 6c 6c 2d  input is a well-
2a20: 66 6f 72 6d 65 64 20 47 65 6f 70 6f 6c 79 20 42  formed Geopoly B
2a30: 4c 4f 42 20 6f 72 20 4a 53 4f 4e 20 73 74 72 69  LOB or JSON stri
2a40: 6e 67 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ng.** then retur
2a50: 6e 20 74 68 65 20 42 4c 4f 42 20 72 65 70 72 65  n the BLOB repre
2a60: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
2a70: 20 70 6f 6c 79 67 6f 6e 2e 20 20 4f 74 68 65 72   polygon.  Other
2a80: 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e  wise.** return N
2a90: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ULL..*/.static v
2aa0: 6f 69 64 20 67 65 6f 70 6f 6c 79 42 6c 6f 62 46  oid geopolyBlobF
2ab0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
2ac0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
2ad0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
2ae0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2af0: 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79  rgv.){.  GeoPoly
2b00: 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e   *p = geopolyFun
2b10: 63 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20  cParam(context, 
2b20: 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 69  argv[0], 0);.  i
2b30: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
2b40: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
2b50: 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 68 64 72 2c  context, p->hdr,
2b60: 20 0a 20 20 20 20 20 20 20 34 2b 38 2a 70 2d 3e   .       4+8*p->
2b70: 6e 56 65 72 74 65 78 2c 20 53 51 4c 49 54 45 5f  nVertex, SQLITE_
2b80: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
2b90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
2ba0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  .  }.}../*.** SQ
2bb0: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 20 20  L function:     
2bc0: 67 65 6f 70 6f 6c 79 5f 6a 73 6f 6e 28 58 29 0a  geopoly_json(X).
2bd0: 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  **.** Interpret 
2be0: 58 20 61 73 20 61 20 70 6f 6c 79 67 6f 6e 20 61  X as a polygon a
2bf0: 6e 64 20 72 65 6e 64 65 72 20 69 74 20 61 73 20  nd render it as 
2c00: 61 20 4a 53 4f 4e 20 61 72 72 61 79 0a 2a 2a 20  a JSON array.** 
2c10: 6f 66 20 63 6f 6f 72 64 69 6e 61 74 65 73 2e 20  of coordinates. 
2c20: 20 4f 72 2c 20 69 66 20 58 20 69 73 20 6e 6f 74   Or, if X is not
2c30: 20 61 20 76 61 6c 69 64 20 70 6f 6c 79 67 6f 6e   a valid polygon
2c40: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
2c50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
2c60: 6f 70 6f 6c 79 4a 73 6f 6e 46 75 6e 63 28 0a 20  opolyJsonFunc(. 
2c70: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2c80: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
2c90: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
2ca0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
2cb0: 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20 3d 20  .  GeoPoly *p = 
2cc0: 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d  geopolyFuncParam
2cd0: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30  (context, argv[0
2ce0: 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29  ], 0);.  if( p )
2cf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
2d00: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
2d10: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
2d20: 6e 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69  ntext);.    sqli
2d30: 74 65 33 5f 73 74 72 20 2a 78 20 3d 20 73 71 6c  te3_str *x = sql
2d40: 69 74 65 33 5f 73 74 72 5f 6e 65 77 28 64 62 29  ite3_str_new(db)
2d50: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
2d60: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
2d70: 65 6e 64 28 78 2c 20 22 5b 22 2c 20 31 29 3b 0a  end(x, "[", 1);.
2d80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2d90: 2d 3e 6e 56 65 72 74 65 78 3b 20 69 2b 2b 29 7b  ->nVertex; i++){
2da0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2db0: 74 72 5f 61 70 70 65 6e 64 66 28 78 2c 20 22 5b  tr_appendf(x, "[
2dc0: 25 21 67 2c 25 21 67 5d 2c 22 2c 20 47 65 6f 58  %!g,%!g],", GeoX
2dd0: 28 70 2c 69 29 2c 20 47 65 6f 59 28 70 2c 69 29  (p,i), GeoY(p,i)
2de0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2df0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
2e00: 28 78 2c 20 22 5b 25 21 67 2c 25 21 67 5d 5d 22  (x, "[%!g,%!g]]"
2e10: 2c 20 47 65 6f 58 28 70 2c 30 29 2c 20 47 65 6f  , GeoX(p,0), Geo
2e20: 59 28 70 2c 30 29 29 3b 0a 20 20 20 20 73 71 6c  Y(p,0));.    sql
2e30: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
2e40: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
2e50: 33 5f 73 74 72 5f 66 69 6e 69 73 68 28 78 29 2c  3_str_finish(x),
2e60: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
2e70: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
2e80: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
2e90: 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  /*.** SQL functi
2ea0: 6f 6e 3a 20 20 20 20 20 67 65 6f 70 6f 6c 79 5f  on:     geopoly_
2eb0: 73 76 67 28 58 2c 20 2e 2e 2e 2e 29 0a 2a 2a 0a  svg(X, ....).**.
2ec0: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 58 20 61  ** Interpret X a
2ed0: 73 20 61 20 70 6f 6c 79 67 6f 6e 20 61 6e 64 20  s a polygon and 
2ee0: 72 65 6e 64 65 72 20 69 74 20 61 73 20 61 20 53  render it as a S
2ef0: 56 47 20 3c 70 6f 6c 79 6c 69 6e 65 3e 2e 0a 2a  VG <polyline>..*
2f00: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 61 72 67  * Additional arg
2f10: 75 6d 65 6e 74 73 20 61 72 65 20 61 64 64 65 64  uments are added
2f20: 20 61 73 20 61 74 74 72 69 62 75 74 65 73 20 74   as attributes t
2f30: 6f 20 74 68 65 20 3c 70 6f 6c 79 6c 69 6e 65 3e  o the <polyline>
2f40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f50: 20 67 65 6f 70 6f 6c 79 53 76 67 46 75 6e 63 28   geopolySvgFunc(
2f60: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2f70: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
2f80: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
2f90: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
2fa0: 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 3b  ){.  GeoPoly *p;
2fb0: 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20  .  if( argc<1 ) 
2fc0: 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 67 65  return;.  p = ge
2fd0: 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28 63  opolyFuncParam(c
2fe0: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 2c  ontext, argv[0],
2ff0: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   0);.  if( p ){.
3000: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
3010: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
3020: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
3030: 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ext);.    sqlite
3040: 33 5f 73 74 72 20 2a 78 20 3d 20 73 71 6c 69 74  3_str *x = sqlit
3050: 65 33 5f 73 74 72 5f 6e 65 77 28 64 62 29 3b 0a  e3_str_new(db);.
3060: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
3070: 68 61 72 20 63 53 65 70 20 3d 20 27 5c 27 27 3b  har cSep = '\'';
3080: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
3090: 5f 61 70 70 65 6e 64 66 28 78 2c 20 22 3c 70 6f  _appendf(x, "<po
30a0: 6c 79 6c 69 6e 65 20 70 6f 69 6e 74 73 3d 22 29  lyline points=")
30b0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
30c0: 3c 70 2d 3e 6e 56 65 72 74 65 78 3b 20 69 2b 2b  <p->nVertex; i++
30d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
30e0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 78 2c 20  _str_appendf(x, 
30f0: 22 25 63 25 67 2c 25 67 22 2c 20 63 53 65 70 2c  "%c%g,%g", cSep,
3100: 20 47 65 6f 58 28 70 2c 69 29 2c 20 47 65 6f 59   GeoX(p,i), GeoY
3110: 28 70 2c 69 29 29 3b 0a 20 20 20 20 20 20 63 53  (p,i));.      cS
3120: 65 70 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a  ep = ' ';.    }.
3130: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
3140: 61 70 70 65 6e 64 66 28 78 2c 20 22 20 25 67 2c  appendf(x, " %g,
3150: 25 67 27 22 2c 20 47 65 6f 58 28 70 2c 30 29 2c  %g'", GeoX(p,0),
3160: 20 47 65 6f 59 28 70 2c 30 29 29 3b 0a 20 20 20   GeoY(p,0));.   
3170: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63   for(i=1; i<argc
3180: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
3190: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
31a0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
31b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
31c0: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  gv[i]);.      if
31d0: 28 20 7a 20 26 26 20 7a 5b 30 5d 20 29 7b 0a 20  ( z && z[0] ){. 
31e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
31f0: 74 72 5f 61 70 70 65 6e 64 66 28 78 2c 20 22 20  tr_appendf(x, " 
3200: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d  %s", z);.      }
3210: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3220: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 78  e3_str_appendf(x
3230: 2c 20 22 3e 3c 2f 70 6f 6c 79 6c 69 6e 65 3e 22  , "></polyline>"
3240: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
3250: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
3260: 78 74 2c 20 73 71 6c 69 74 65 33 5f 73 74 72 5f  xt, sqlite3_str_
3270: 66 69 6e 69 73 68 28 78 29 2c 20 2d 31 2c 20 73  finish(x), -1, s
3280: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
3290: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
32a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
32b0: 53 51 4c 20 46 75 6e 63 74 69 6f 6e 3a 20 20 20  SQL Function:   
32c0: 20 20 20 67 65 6f 70 6f 6c 79 5f 78 66 6f 72 6d     geopoly_xform
32d0: 28 70 6f 6c 79 2c 20 41 2c 20 42 2c 20 43 2c 20  (poly, A, B, C, 
32e0: 44 2c 20 45 2c 20 46 29 0a 2a 2a 0a 2a 2a 20 54  D, E, F).**.** T
32f0: 72 61 6e 73 66 6f 72 6d 20 61 6e 64 2f 6f 72 20  ransform and/or 
3300: 74 72 61 6e 73 6c 61 74 65 20 61 20 70 6f 6c 79  translate a poly
3310: 67 6f 6e 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  gon as follows:.
3320: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 31 20 3d 20  **.**      x1 = 
3330: 41 2a 78 30 20 2b 20 42 2a 79 30 20 2b 20 45 0a  A*x0 + B*y0 + E.
3340: 2a 2a 20 20 20 20 20 20 79 31 20 3d 20 43 2a 78  **      y1 = C*x
3350: 30 20 2b 20 44 2a 79 30 20 2b 20 46 0a 2a 2a 0a  0 + D*y0 + F.**.
3360: 2a 2a 20 46 6f 72 20 61 20 74 72 61 6e 73 6c 61  ** For a transla
3370: 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tion:.**.**     
3380: 20 67 65 6f 70 6f 6c 79 5f 78 66 6f 72 6d 28 70   geopoly_xform(p
3390: 6f 6c 79 2c 20 31 2c 20 30 2c 20 30 2c 20 31 2c  oly, 1, 0, 0, 1,
33a0: 20 78 2d 6f 66 66 73 65 74 2c 20 79 2d 6f 66 66   x-offset, y-off
33b0: 73 65 74 29 0a 2a 2a 0a 2a 2a 20 52 6f 74 61 74  set).**.** Rotat
33c0: 65 20 62 79 20 52 20 61 72 6f 75 6e 64 20 74 68  e by R around th
33d0: 65 20 70 6f 69 6e 74 20 28 30 2c 30 29 3a 0a 2a  e point (0,0):.*
33e0: 2a 0a 2a 2a 20 20 20 20 20 20 67 65 6f 70 6f 6c  *.**      geopol
33f0: 79 5f 78 66 6f 72 6d 28 70 6f 6c 79 2c 20 63 6f  y_xform(poly, co
3400: 73 28 52 29 2c 20 73 69 6e 28 52 29 2c 20 2d 73  s(R), sin(R), -s
3410: 69 6e 28 52 29 2c 20 63 6f 73 28 52 29 2c 20 30  in(R), cos(R), 0
3420: 2c 20 30 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  , 0).*/.static v
3430: 6f 69 64 20 67 65 6f 70 6f 6c 79 58 66 6f 72 6d  oid geopolyXform
3440: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
3450: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
3460: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
3470: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3480: 61 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c  argv.){.  GeoPol
3490: 79 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75  y *p = geopolyFu
34a0: 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c  ncParam(context,
34b0: 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20   argv[0], 0);.  
34c0: 64 6f 75 62 6c 65 20 41 20 3d 20 73 71 6c 69 74  double A = sqlit
34d0: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
34e0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 64 6f 75 62  argv[1]);.  doub
34f0: 6c 65 20 42 20 3d 20 73 71 6c 69 74 65 33 5f 76  le B = sqlite3_v
3500: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
3510: 5b 32 5d 29 3b 0a 20 20 64 6f 75 62 6c 65 20 43  [2]);.  double C
3520: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
3530: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 33 5d 29  _double(argv[3])
3540: 3b 0a 20 20 64 6f 75 62 6c 65 20 44 20 3d 20 73  ;.  double D = s
3550: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
3560: 62 6c 65 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20  ble(argv[4]);.  
3570: 64 6f 75 62 6c 65 20 45 20 3d 20 73 71 6c 69 74  double E = sqlit
3580: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
3590: 61 72 67 76 5b 35 5d 29 3b 0a 20 20 64 6f 75 62  argv[5]);.  doub
35a0: 6c 65 20 46 20 3d 20 73 71 6c 69 74 65 33 5f 76  le F = sqlite3_v
35b0: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
35c0: 5b 36 5d 29 3b 0a 20 20 47 65 6f 43 6f 6f 72 64  [6]);.  GeoCoord
35d0: 20 78 31 2c 20 79 31 2c 20 78 30 2c 20 79 30 3b   x1, y1, x0, y0;
35e0: 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 66 28  .  int ii;.  if(
35f0: 20 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69   p ){.    for(ii
3600: 3d 30 3b 20 69 69 3c 70 2d 3e 6e 56 65 72 74 65  =0; ii<p->nVerte
3610: 78 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  x; ii++){.      
3620: 78 30 20 3d 20 47 65 6f 58 28 70 2c 69 69 29 3b  x0 = GeoX(p,ii);
3630: 0a 20 20 20 20 20 20 79 30 20 3d 20 47 65 6f 59  .      y0 = GeoY
3640: 28 70 2c 69 69 29 3b 0a 20 20 20 20 20 20 78 31  (p,ii);.      x1
3650: 20 3d 20 28 47 65 6f 43 6f 6f 72 64 29 28 41 2a   = (GeoCoord)(A*
3660: 78 30 20 2b 20 42 2a 79 30 20 2b 20 45 29 3b 0a  x0 + B*y0 + E);.
3670: 20 20 20 20 20 20 79 31 20 3d 20 28 47 65 6f 43        y1 = (GeoC
3680: 6f 6f 72 64 29 28 43 2a 78 30 20 2b 20 44 2a 79  oord)(C*x0 + D*y
3690: 30 20 2b 20 46 29 3b 0a 20 20 20 20 20 20 47 65  0 + F);.      Ge
36a0: 6f 58 28 70 2c 69 69 29 20 3d 20 78 31 3b 0a 20  oX(p,ii) = x1;. 
36b0: 20 20 20 20 20 47 65 6f 59 28 70 2c 69 69 29 20       GeoY(p,ii) 
36c0: 3d 20 79 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = y1;.    }.    
36d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
36e0: 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e  lob(context, p->
36f0: 68 64 72 2c 20 0a 20 20 20 20 20 20 20 34 2b 38  hdr, .       4+8
3700: 2a 70 2d 3e 6e 56 65 72 74 65 78 2c 20 53 51 4c  *p->nVertex, SQL
3710: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
3720: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3730: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3740: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 72  * Compute the ar
3750: 65 61 20 65 6e 63 6c 6f 73 65 64 20 62 79 20 74  ea enclosed by t
3760: 68 65 20 70 6f 6c 79 67 6f 6e 2e 0a 2a 2a 0a 2a  he polygon..**.*
3770: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
3780: 61 6e 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  an also be used 
3790: 74 6f 20 64 65 74 65 63 74 20 70 6f 6c 79 67 6f  to detect polygo
37a0: 6e 73 20 74 68 61 74 20 72 6f 74 61 74 65 20 69  ns that rotate i
37b0: 6e 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 64  n.** the wrong d
37c0: 69 72 65 63 74 69 6f 6e 2e 20 20 50 6f 6c 79 67  irection.  Polyg
37d0: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 73 65 20  ons are suppose 
37e0: 74 6f 20 62 65 20 63 6f 75 6e 74 65 72 2d 63 6c  to be counter-cl
37f0: 6f 63 6b 77 69 73 65 20 28 43 43 57 29 2e 0a 2a  ockwise (CCW)..*
3800: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
3810: 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76  eturns a negativ
3820: 65 20 76 61 6c 75 65 20 66 6f 72 20 63 6c 6f 63  e value for cloc
3830: 6b 77 69 73 65 20 28 43 57 29 20 70 6f 6c 79 67  kwise (CW) polyg
3840: 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64  ons..*/.static d
3850: 6f 75 62 6c 65 20 67 65 6f 70 6f 6c 79 41 72 65  ouble geopolyAre
3860: 61 28 47 65 6f 50 6f 6c 79 20 2a 70 29 7b 0a 20  a(GeoPoly *p){. 
3870: 20 64 6f 75 62 6c 65 20 72 41 72 65 61 20 3d 20   double rArea = 
3880: 30 2e 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  0.0;.  int ii;. 
3890: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d   for(ii=0; ii<p-
38a0: 3e 6e 56 65 72 74 65 78 2d 31 3b 20 69 69 2b 2b  >nVertex-1; ii++
38b0: 29 7b 0a 20 20 20 20 72 41 72 65 61 20 2b 3d 20  ){.    rArea += 
38c0: 28 47 65 6f 58 28 70 2c 69 69 29 20 2d 20 47 65  (GeoX(p,ii) - Ge
38d0: 6f 58 28 70 2c 69 69 2b 31 29 29 20 20 20 20 20  oX(p,ii+1))     
38e0: 20 20 20 20 20 20 2f 2a 20 28 78 30 20 2d 20 78        /* (x0 - x
38f0: 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  1) */.          
3900: 20 20 20 20 2a 20 28 47 65 6f 59 28 70 2c 69 69      * (GeoY(p,ii
3910: 29 20 2b 20 47 65 6f 59 28 70 2c 69 69 2b 31 29  ) + GeoY(p,ii+1)
3920: 29 20 20 20 20 20 20 20 20 2f 2a 20 28 79 30 20  )        /* (y0 
3930: 2b 20 79 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  + y1) */.       
3940: 20 20 20 20 20 20 20 2a 20 30 2e 35 3b 0a 20 20         * 0.5;.  
3950: 7d 0a 20 20 72 41 72 65 61 20 2b 3d 20 28 47 65  }.  rArea += (Ge
3960: 6f 58 28 70 2c 69 69 29 20 2d 20 47 65 6f 58 28  oX(p,ii) - GeoX(
3970: 70 2c 30 29 29 20 20 20 20 20 20 20 20 20 20 20  p,0))           
3980: 20 20 20 20 20 2f 2a 20 28 78 4e 20 2d 20 78 30       /* (xN - x0
3990: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
39a0: 2a 20 28 47 65 6f 59 28 70 2c 69 69 29 20 2b 20  * (GeoY(p,ii) + 
39b0: 47 65 6f 59 28 70 2c 30 29 29 20 20 20 20 20 20  GeoY(p,0))      
39c0: 20 20 20 20 20 20 20 20 2f 2a 20 28 79 4e 20 2b          /* (yN +
39d0: 20 79 30 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   y0) */.        
39e0: 20 20 20 2a 20 30 2e 35 3b 0a 20 20 72 65 74 75     * 0.5;.  retu
39f0: 72 6e 20 72 41 72 65 61 3b 0a 7d 0a 0a 2f 2a 0a  rn rArea;.}../*.
3a00: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3a10: 6e 20 6f 66 20 74 68 65 20 67 65 6f 70 6f 6c 79  n of the geopoly
3a20: 5f 61 72 65 61 28 58 29 20 66 75 6e 63 74 69 6f  _area(X) functio
3a30: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
3a40: 69 6e 70 75 74 20 69 73 20 61 20 77 65 6c 6c 2d  input is a well-
3a50: 66 6f 72 6d 65 64 20 47 65 6f 70 6f 6c 79 20 42  formed Geopoly B
3a60: 4c 4f 42 20 74 68 65 6e 20 72 65 74 75 72 6e 20  LOB then return 
3a70: 74 68 65 20 61 72 65 61 0a 2a 2a 20 65 6e 63 6c  the area.** encl
3a80: 6f 73 65 64 20 62 79 20 74 68 65 20 70 6f 6c 79  osed by the poly
3a90: 67 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 6c  gon.  If the pol
3aa0: 79 67 6f 6e 20 63 69 72 63 75 6c 61 74 65 73 20  ygon circulates 
3ab0: 63 6c 6f 63 6b 77 69 73 65 20 69 6e 73 74 65 61  clockwise instea
3ac0: 64 0a 2a 2a 20 6f 66 20 63 6f 75 6e 74 65 72 63  d.** of counterc
3ad0: 6c 6f 63 6b 77 69 73 65 20 28 61 73 20 69 74 20  lockwise (as it 
3ae0: 73 68 6f 75 6c 64 29 20 74 68 65 6e 20 72 65 74  should) then ret
3af0: 75 72 6e 20 74 68 65 20 6e 65 67 61 74 69 76 65  urn the negative
3b00: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 6e 63 6c 6f   of the.** enclo
3b10: 73 65 64 20 61 72 65 61 2e 20 20 4f 74 68 65 72  sed area.  Other
3b20: 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  wise return NULL
3b30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3b40: 20 67 65 6f 70 6f 6c 79 41 72 65 61 46 75 6e 63   geopolyAreaFunc
3b50: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
3b60: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
3b70: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
3b80: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
3b90: 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70  .){.  GeoPoly *p
3ba0: 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61   = geopolyFuncPa
3bb0: 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  ram(context, arg
3bc0: 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20  v[0], 0);.  if( 
3bd0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
3be0: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
3bf0: 6f 6e 74 65 78 74 2c 20 67 65 6f 70 6f 6c 79 41  ontext, geopolyA
3c00: 72 65 61 28 70 29 29 3b 0a 20 20 20 20 73 71 6c  rea(p));.    sql
3c10: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
3c20: 7d 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a  }            .}.
3c30: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
3c40: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 67 65 6f  ation of the geo
3c50: 70 6f 6c 79 5f 63 63 77 28 58 29 20 66 75 6e 63  poly_ccw(X) func
3c60: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
3c70: 68 65 20 72 6f 74 61 74 69 6f 6e 20 6f 66 20 70  he rotation of p
3c80: 6f 6c 79 67 6f 6e 20 58 20 69 73 20 63 6c 6f 63  olygon X is cloc
3c90: 6b 77 69 73 65 20 28 69 6e 63 6f 72 72 65 63 74  kwise (incorrect
3ca0: 29 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  ) instead of.** 
3cb0: 63 6f 75 6e 74 65 72 2d 63 6c 6f 63 6b 77 69 73  counter-clockwis
3cc0: 65 20 28 74 68 65 20 63 6f 72 72 65 63 74 20 77  e (the correct w
3cd0: 69 6e 64 69 6e 67 20 6f 72 64 65 72 20 61 63 63  inding order acc
3ce0: 6f 72 64 69 6e 67 20 74 6f 20 52 46 43 37 39 34  ording to RFC794
3cf0: 36 29 0a 2a 2a 20 74 68 65 6e 20 72 65 76 65 72  6).** then rever
3d00: 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  se the order of 
3d10: 74 68 65 20 76 65 72 74 65 78 65 73 20 69 6e 20  the vertexes in 
3d20: 70 6f 6c 79 67 6f 6e 20 58 2e 20 20 0a 2a 2a 0a  polygon X.  .**.
3d30: 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
3d40: 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
3d50: 72 65 74 75 72 6e 73 20 61 20 43 43 57 20 70 6f  returns a CCW po
3d60: 6c 79 67 6f 6e 20 72 65 67 61 72 64 6c 65 73 73  lygon regardless
3d70: 20 6f 66 20 74 68 65 0a 2a 2a 20 77 69 6e 64 69   of the.** windi
3d80: 6e 67 20 6f 72 64 65 72 20 6f 66 20 69 74 73 20  ng order of its 
3d90: 69 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  input..**.** Use
3da0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
3db0: 20 73 61 6e 69 74 69 7a 65 20 68 69 73 74 6f 72   sanitize histor
3dc0: 69 63 61 6c 20 69 6e 70 75 74 73 20 74 68 61 74  ical inputs that
3dd0: 20 74 68 61 74 20 73 6f 6d 65 74 69 6d 65 73 0a   that sometimes.
3de0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 70 6f 6c 79 67  ** contain polyg
3df0: 6f 6e 73 20 74 68 61 74 20 77 69 6e 64 20 69 6e  ons that wind in
3e00: 20 74 68 65 20 77 72 6f 6e 67 20 64 69 72 65 63   the wrong direc
3e10: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
3e20: 76 6f 69 64 20 67 65 6f 70 6f 6c 79 43 63 77 46  void geopolyCcwF
3e30: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
3e40: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
3e50: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
3e60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3e70: 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79  rgv.){.  GeoPoly
3e80: 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e   *p = geopolyFun
3e90: 63 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20  cParam(context, 
3ea0: 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 69  argv[0], 0);.  i
3eb0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
3ec0: 67 65 6f 70 6f 6c 79 41 72 65 61 28 70 29 3c 30  geopolyArea(p)<0
3ed0: 2e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  .0 ){.      int 
3ee0: 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f  ii, jj;.      fo
3ef0: 72 28 69 69 3d 31 2c 20 6a 6a 3d 70 2d 3e 6e 56  r(ii=1, jj=p->nV
3f00: 65 72 74 65 78 2d 31 3b 20 69 69 3c 6a 6a 3b 20  ertex-1; ii<jj; 
3f10: 69 69 2b 2b 2c 20 6a 6a 2d 2d 29 7b 0a 20 20 20  ii++, jj--){.   
3f20: 20 20 20 20 20 47 65 6f 43 6f 6f 72 64 20 74 20       GeoCoord t 
3f30: 3d 20 47 65 6f 58 28 70 2c 69 69 29 3b 0a 20 20  = GeoX(p,ii);.  
3f40: 20 20 20 20 20 20 47 65 6f 58 28 70 2c 69 69 29        GeoX(p,ii)
3f50: 20 3d 20 47 65 6f 58 28 70 2c 6a 6a 29 3b 0a 20   = GeoX(p,jj);. 
3f60: 20 20 20 20 20 20 20 47 65 6f 58 28 70 2c 6a 6a         GeoX(p,jj
3f70: 29 20 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 74  ) = t;.        t
3f80: 20 3d 20 47 65 6f 59 28 70 2c 69 69 29 3b 0a 20   = GeoY(p,ii);. 
3f90: 20 20 20 20 20 20 20 47 65 6f 59 28 70 2c 69 69         GeoY(p,ii
3fa0: 29 20 3d 20 47 65 6f 59 28 70 2c 6a 6a 29 3b 0a  ) = GeoY(p,jj);.
3fb0: 20 20 20 20 20 20 20 20 47 65 6f 59 28 70 2c 6a          GeoY(p,j
3fc0: 6a 29 20 3d 20 74 3b 0a 20 20 20 20 20 20 7d 0a  j) = t;.      }.
3fd0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
3fe0: 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f  3_result_blob(co
3ff0: 6e 74 65 78 74 2c 20 70 2d 3e 68 64 72 2c 20 0a  ntext, p->hdr, .
4000: 20 20 20 20 20 20 20 34 2b 38 2a 70 2d 3e 6e 56         4+8*p->nV
4010: 65 72 74 65 78 2c 20 53 51 4c 49 54 45 5f 54 52  ertex, SQLITE_TR
4020: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
4030: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
4040: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d   }            .}
4050: 0a 0a 23 64 65 66 69 6e 65 20 47 45 4f 50 4f 4c  ..#define GEOPOL
4060: 59 5f 50 49 20 33 2e 31 34 31 35 39 32 36 35 33  Y_PI 3.141592653
4070: 35 38 39 37 39 33 32 33 38 35 0a 0a 2f 2a 20 46  5897932385../* F
4080: 61 73 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  ast approximatio
4090: 6e 20 66 6f 72 20 73 69 6e 65 28 58 29 20 66 6f  n for sine(X) fo
40a0: 72 20 58 20 62 65 74 77 65 65 6e 20 2d 30 2e 35  r X between -0.5
40b0: 2a 70 69 20 61 6e 64 20 32 2a 70 69 0a 2a 2f 0a  *pi and 2*pi.*/.
40c0: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 67 65  static double ge
40d0: 6f 70 6f 6c 79 53 69 6e 65 28 64 6f 75 62 6c 65  opolySine(double
40e0: 20 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 72   r){.  assert( r
40f0: 3e 3d 2d 30 2e 35 2a 47 45 4f 50 4f 4c 59 5f 50  >=-0.5*GEOPOLY_P
4100: 49 20 26 26 20 72 3c 3d 32 2e 30 2a 47 45 4f 50  I && r<=2.0*GEOP
4110: 4f 4c 59 5f 50 49 20 29 3b 0a 20 20 69 66 28 20  OLY_PI );.  if( 
4120: 72 3e 3d 31 2e 35 2a 47 45 4f 50 4f 4c 59 5f 50  r>=1.5*GEOPOLY_P
4130: 49 20 29 7b 0a 20 20 20 20 72 20 2d 3d 20 32 2e  I ){.    r -= 2.
4140: 30 2a 47 45 4f 50 4f 4c 59 5f 50 49 3b 0a 20 20  0*GEOPOLY_PI;.  
4150: 7d 0a 20 20 69 66 28 20 72 3e 3d 30 2e 35 2a 47  }.  if( r>=0.5*G
4160: 45 4f 50 4f 4c 59 5f 50 49 20 29 7b 0a 20 20 20  EOPOLY_PI ){.   
4170: 20 72 65 74 75 72 6e 20 2d 67 65 6f 70 6f 6c 79   return -geopoly
4180: 53 69 6e 65 28 72 2d 47 45 4f 50 4f 4c 59 5f 50  Sine(r-GEOPOLY_P
4190: 49 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  I);.  }else{.   
41a0: 20 64 6f 75 62 6c 65 20 72 32 20 3d 20 72 2a 72   double r2 = r*r
41b0: 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 33 20  ;.    double r3 
41c0: 3d 20 72 32 2a 72 3b 0a 20 20 20 20 64 6f 75 62  = r2*r;.    doub
41d0: 6c 65 20 72 35 20 3d 20 72 33 2a 72 32 3b 0a 20  le r5 = r3*r2;. 
41e0: 20 20 20 72 65 74 75 72 6e 20 30 2e 39 39 39 36     return 0.9996
41f0: 39 34 39 2a 72 20 2d 20 30 2e 31 36 35 36 37 30  949*r - 0.165670
4200: 30 2a 72 33 20 2b 20 30 2e 30 30 37 35 31 33 34  0*r3 + 0.0075134
4210: 2a 72 35 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  *r5;.  }.}../*.*
4220: 2a 20 46 75 6e 63 74 69 6f 6e 3a 20 20 20 67 65  * Function:   ge
4230: 6f 70 6f 6c 79 5f 72 65 67 75 6c 61 72 28 58 2c  opoly_regular(X,
4240: 59 2c 52 2c 4e 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e  Y,R,N).**.** Con
4250: 73 74 72 75 63 74 20 61 20 73 69 6d 70 6c 65 2c  struct a simple,
4260: 20 63 6f 6e 76 65 78 2c 20 72 65 67 75 6c 61 72   convex, regular
4270: 20 70 6f 6c 79 67 6f 6e 20 63 65 6e 74 65 72 65   polygon centere
4280: 64 20 61 74 20 58 2c 20 59 0a 2a 2a 20 77 69 74  d at X, Y.** wit
4290: 68 20 63 69 72 63 75 6d 72 61 64 69 75 73 20 52  h circumradius R
42a0: 20 61 6e 64 20 77 69 74 68 20 4e 20 73 69 64 65   and with N side
42b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
42c0: 64 20 67 65 6f 70 6f 6c 79 52 65 67 75 6c 61 72  d geopolyRegular
42d0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
42e0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
42f0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
4300: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4310: 61 72 67 76 0a 29 7b 0a 20 20 64 6f 75 62 6c 65  argv.){.  double
4320: 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   x = sqlite3_val
4330: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30  ue_double(argv[0
4340: 5d 29 3b 0a 20 20 64 6f 75 62 6c 65 20 79 20 3d  ]);.  double y =
4350: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
4360: 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 3b 0a  ouble(argv[1]);.
4370: 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c    double r = sql
4380: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
4390: 65 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69 6e  e(argv[2]);.  in
43a0: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  t n = sqlite3_va
43b0: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 33 5d 29  lue_int(argv[3])
43c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 47 65 6f  ;.  int i;.  Geo
43d0: 50 6f 6c 79 20 2a 70 3b 0a 0a 20 20 69 66 28 20  Poly *p;..  if( 
43e0: 6e 3c 33 20 7c 7c 20 72 3c 3d 30 2e 30 20 29 20  n<3 || r<=0.0 ) 
43f0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 3e  return;.  if( n>
4400: 31 30 30 30 20 29 20 6e 20 3d 20 31 30 30 30 3b  1000 ) n = 1000;
4410: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
4420: 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
4430: 2a 70 29 20 2b 20 28 6e 2d 31 29 2a 32 2a 73 69  *p) + (n-1)*2*si
4440: 7a 65 6f 66 28 47 65 6f 43 6f 6f 72 64 29 20 29  zeof(GeoCoord) )
4450: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
4460: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4470: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
4480: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74  ontext);.    ret
4490: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 31  urn;.  }.  i = 1
44a0: 3b 0a 20 20 70 2d 3e 68 64 72 5b 30 5d 20 3d 20  ;.  p->hdr[0] = 
44b0: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  *(unsigned char*
44c0: 29 26 69 3b 0a 20 20 70 2d 3e 68 64 72 5b 31 5d  )&i;.  p->hdr[1]
44d0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 68 64 72 5b 32   = 0;.  p->hdr[2
44e0: 5d 20 3d 20 28 6e 3e 3e 38 29 26 30 78 66 66 3b  ] = (n>>8)&0xff;
44f0: 0a 20 20 70 2d 3e 68 64 72 5b 33 5d 20 3d 20 6e  .  p->hdr[3] = n
4500: 26 30 78 66 66 3b 0a 20 20 66 6f 72 28 69 3d 30  &0xff;.  for(i=0
4510: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
4520: 20 64 6f 75 62 6c 65 20 72 41 6e 67 6c 65 20 3d   double rAngle =
4530: 20 32 2e 30 2a 47 45 4f 50 4f 4c 59 5f 50 49 2a   2.0*GEOPOLY_PI*
4540: 69 2f 6e 3b 0a 20 20 20 20 47 65 6f 58 28 70 2c  i/n;.    GeoX(p,
4550: 69 29 20 3d 20 78 20 2d 20 72 2a 67 65 6f 70 6f  i) = x - r*geopo
4560: 6c 79 53 69 6e 65 28 72 41 6e 67 6c 65 2d 30 2e  lySine(rAngle-0.
4570: 35 2a 47 45 4f 50 4f 4c 59 5f 50 49 29 3b 0a 20  5*GEOPOLY_PI);. 
4580: 20 20 20 47 65 6f 59 28 70 2c 69 29 20 3d 20 79     GeoY(p,i) = y
4590: 20 2b 20 72 2a 67 65 6f 70 6f 6c 79 53 69 6e 65   + r*geopolySine
45a0: 28 72 41 6e 67 6c 65 29 3b 0a 20 20 7d 0a 20 20  (rAngle);.  }.  
45b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
45c0: 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e  lob(context, p->
45d0: 68 64 72 2c 20 34 2b 38 2a 6e 2c 20 53 51 4c 49  hdr, 4+8*n, SQLI
45e0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
45f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
4600: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 50  ;.}../*.** If pP
4610: 6f 6c 79 20 69 73 20 61 20 70 6f 6c 79 67 6f 6e  oly is a polygon
4620: 2c 20 63 6f 6d 70 75 74 65 20 69 74 73 20 62 6f  , compute its bo
4630: 75 6e 64 69 6e 67 20 62 6f 78 2e 20 54 68 65 6e  unding box. Then
4640: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 69  :.**.**    (1) i
4650: 66 20 61 43 6f 6f 72 64 21 3d 30 20 73 74 6f 72  f aCoord!=0 stor
4660: 65 20 74 68 65 20 62 6f 75 6e 64 69 6e 67 20 62  e the bounding b
4670: 6f 78 20 69 6e 20 61 43 6f 6f 72 64 2c 20 72 65  ox in aCoord, re
4680: 74 75 72 6e 69 6e 67 20 4e 55 4c 4c 0a 2a 2a 20  turning NULL.** 
4690: 20 20 20 28 32 29 20 6f 74 68 65 72 77 69 73 65     (2) otherwise
46a0: 2c 20 63 6f 6d 70 75 74 65 20 61 20 47 65 6f 50  , compute a GeoP
46b0: 6f 6c 79 20 66 6f 72 20 74 68 65 20 62 6f 75 6e  oly for the boun
46c0: 64 69 6e 67 20 62 6f 78 20 61 6e 64 20 72 65 74  ding box and ret
46d0: 75 72 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  urn the.**      
46e0: 20 20 6e 65 77 20 47 65 6f 50 6f 6c 79 0a 2a 2a    new GeoPoly.**
46f0: 0a 2a 2a 20 49 66 20 70 50 6f 6c 79 20 69 73 20  .** If pPoly is 
4700: 4e 55 4c 4c 20 62 75 74 20 61 43 6f 6f 72 64 20  NULL but aCoord 
4710: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
4720: 6e 20 63 6f 6d 70 75 74 65 20 61 20 6e 65 77 20  n compute a new 
4730: 47 65 6f 50 6f 6c 79 20 66 72 6f 6d 0a 2a 2a 20  GeoPoly from.** 
4740: 74 68 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78  the bounding box
4750: 20 69 6e 20 61 43 6f 6f 72 64 20 61 6e 64 20 72   in aCoord and r
4760: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
4770: 74 6f 20 74 68 61 74 20 47 65 6f 50 6f 6c 79 2e  to that GeoPoly.
4780: 0a 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f 50 6f  .*/.static GeoPo
4790: 6c 79 20 2a 67 65 6f 70 6f 6c 79 42 42 6f 78 28  ly *geopolyBBox(
47a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
47b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 20 20 2f  xt *context,   /
47c0: 2a 20 46 6f 72 20 72 65 63 6f 72 64 69 6e 67 20  * For recording 
47d0: 74 68 65 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73  the error */.  s
47e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 50  qlite3_value *pP
47f0: 6f 6c 79 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  oly,       /* Th
4800: 65 20 70 6f 6c 79 67 6f 6e 20 2a 2f 0a 20 20 52  e polygon */.  R
4810: 74 72 65 65 43 6f 6f 72 64 20 2a 61 43 6f 6f 72  treeCoord *aCoor
4820: 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  d,         /* Re
4830: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
4840: 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20  int *pRc        
4850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
4860: 72 72 6f 72 20 63 6f 64 65 20 68 65 72 65 20 2a  rror code here *
4870: 2f 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a  /.){.  GeoPoly *
4880: 70 4f 75 74 20 3d 20 30 3b 0a 20 20 47 65 6f 50  pOut = 0;.  GeoP
4890: 6f 6c 79 20 2a 70 3b 0a 20 20 66 6c 6f 61 74 20  oly *p;.  float 
48a0: 6d 6e 58 2c 20 6d 78 58 2c 20 6d 6e 59 2c 20 6d  mnX, mxX, mnY, m
48b0: 78 59 3b 0a 20 20 69 66 28 20 70 50 6f 6c 79 3d  xY;.  if( pPoly=
48c0: 3d 30 20 26 26 20 61 43 6f 6f 72 64 21 3d 30 20  =0 && aCoord!=0 
48d0: 29 7b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20 20  ){.    p = 0;.  
48e0: 20 20 6d 6e 58 20 3d 20 61 43 6f 6f 72 64 5b 30    mnX = aCoord[0
48f0: 5d 2e 66 3b 0a 20 20 20 20 6d 78 58 20 3d 20 61  ].f;.    mxX = a
4900: 43 6f 6f 72 64 5b 31 5d 2e 66 3b 0a 20 20 20 20  Coord[1].f;.    
4910: 6d 6e 59 20 3d 20 61 43 6f 6f 72 64 5b 32 5d 2e  mnY = aCoord[2].
4920: 66 3b 0a 20 20 20 20 6d 78 59 20 3d 20 61 43 6f  f;.    mxY = aCo
4930: 6f 72 64 5b 33 5d 2e 66 3b 0a 20 20 20 20 67 6f  ord[3].f;.    go
4940: 74 6f 20 67 65 6f 70 6f 6c 79 42 62 6f 78 46 69  to geopolyBboxFi
4950: 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ll;.  }else{.   
4960: 20 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63   p = geopolyFunc
4970: 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 70  Param(context, p
4980: 50 6f 6c 79 2c 20 70 52 63 29 3b 0a 20 20 7d 0a  Poly, pRc);.  }.
4990: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
49a0: 6e 74 20 69 69 3b 0a 20 20 20 20 6d 6e 58 20 3d  nt ii;.    mnX =
49b0: 20 6d 78 58 20 3d 20 47 65 6f 58 28 70 2c 30 29   mxX = GeoX(p,0)
49c0: 3b 0a 20 20 20 20 6d 6e 59 20 3d 20 6d 78 59 20  ;.    mnY = mxY 
49d0: 3d 20 47 65 6f 59 28 70 2c 30 29 3b 0a 20 20 20  = GeoY(p,0);.   
49e0: 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 70 2d   for(ii=1; ii<p-
49f0: 3e 6e 56 65 72 74 65 78 3b 20 69 69 2b 2b 29 7b  >nVertex; ii++){
4a00: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20  .      double r 
4a10: 3d 20 47 65 6f 58 28 70 2c 69 69 29 3b 0a 20 20  = GeoX(p,ii);.  
4a20: 20 20 20 20 69 66 28 20 72 3c 6d 6e 58 20 29 20      if( r<mnX ) 
4a30: 6d 6e 58 20 3d 20 28 66 6c 6f 61 74 29 72 3b 0a  mnX = (float)r;.
4a40: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 72        else if( r
4a50: 3e 6d 78 58 20 29 20 6d 78 58 20 3d 20 28 66 6c  >mxX ) mxX = (fl
4a60: 6f 61 74 29 72 3b 0a 20 20 20 20 20 20 72 20 3d  oat)r;.      r =
4a70: 20 47 65 6f 59 28 70 2c 69 69 29 3b 0a 20 20 20   GeoY(p,ii);.   
4a80: 20 20 20 69 66 28 20 72 3c 6d 6e 59 20 29 20 6d     if( r<mnY ) m
4a90: 6e 59 20 3d 20 28 66 6c 6f 61 74 29 72 3b 0a 20  nY = (float)r;. 
4aa0: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 72 3e       else if( r>
4ab0: 6d 78 59 20 29 20 6d 78 59 20 3d 20 28 66 6c 6f  mxY ) mxY = (flo
4ac0: 61 74 29 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  at)r;.    }.    
4ad0: 69 66 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d  if( pRc ) *pRc =
4ae0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4af0: 69 66 28 20 61 43 6f 6f 72 64 3d 3d 30 20 29 7b  if( aCoord==0 ){
4b00: 0a 20 20 20 20 20 20 67 65 6f 70 6f 6c 79 42 62  .      geopolyBb
4b10: 6f 78 46 69 6c 6c 3a 0a 20 20 20 20 20 20 70 4f  oxFill:.      pO
4b20: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ut = sqlite3_rea
4b30: 6c 6c 6f 63 36 34 28 70 2c 20 47 45 4f 50 4f 4c  lloc64(p, GEOPOL
4b40: 59 5f 53 5a 28 34 29 29 3b 0a 20 20 20 20 20 20  Y_SZ(4));.      
4b50: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 7b 0a 20  if( pOut==0 ){. 
4b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
4b70: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
4b80: 69 66 28 20 63 6f 6e 74 65 78 74 20 29 20 73 71  if( context ) sq
4b90: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
4ba0: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
4bb0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
4bc0: 52 63 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49  Rc ) *pRc = SQLI
4bd0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
4be0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
4bf0: 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e    }.      pOut->
4c00: 6e 56 65 72 74 65 78 20 3d 20 34 3b 0a 20 20 20  nVertex = 4;.   
4c10: 20 20 20 69 69 20 3d 20 31 3b 0a 20 20 20 20 20     ii = 1;.     
4c20: 20 70 4f 75 74 2d 3e 68 64 72 5b 30 5d 20 3d 20   pOut->hdr[0] = 
4c30: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  *(unsigned char*
4c40: 29 26 69 69 3b 0a 20 20 20 20 20 20 70 4f 75 74  )&ii;.      pOut
4c50: 2d 3e 68 64 72 5b 31 5d 20 3d 20 30 3b 0a 20 20  ->hdr[1] = 0;.  
4c60: 20 20 20 20 70 4f 75 74 2d 3e 68 64 72 5b 32 5d      pOut->hdr[2]
4c70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75 74   = 0;.      pOut
4c80: 2d 3e 68 64 72 5b 33 5d 20 3d 20 34 3b 0a 20 20  ->hdr[3] = 4;.  
4c90: 20 20 20 20 47 65 6f 58 28 70 4f 75 74 2c 30 29      GeoX(pOut,0)
4ca0: 20 3d 20 6d 6e 58 3b 0a 20 20 20 20 20 20 47 65   = mnX;.      Ge
4cb0: 6f 59 28 70 4f 75 74 2c 30 29 20 3d 20 6d 6e 59  oY(pOut,0) = mnY
4cc0: 3b 0a 20 20 20 20 20 20 47 65 6f 58 28 70 4f 75  ;.      GeoX(pOu
4cd0: 74 2c 31 29 20 3d 20 6d 78 58 3b 0a 20 20 20 20  t,1) = mxX;.    
4ce0: 20 20 47 65 6f 59 28 70 4f 75 74 2c 31 29 20 3d    GeoY(pOut,1) =
4cf0: 20 6d 6e 59 3b 0a 20 20 20 20 20 20 47 65 6f 58   mnY;.      GeoX
4d00: 28 70 4f 75 74 2c 32 29 20 3d 20 6d 78 58 3b 0a  (pOut,2) = mxX;.
4d10: 20 20 20 20 20 20 47 65 6f 59 28 70 4f 75 74 2c        GeoY(pOut,
4d20: 32 29 20 3d 20 6d 78 59 3b 0a 20 20 20 20 20 20  2) = mxY;.      
4d30: 47 65 6f 58 28 70 4f 75 74 2c 33 29 20 3d 20 6d  GeoX(pOut,3) = m
4d40: 6e 58 3b 0a 20 20 20 20 20 20 47 65 6f 59 28 70  nX;.      GeoY(p
4d50: 4f 75 74 2c 33 29 20 3d 20 6d 78 59 3b 0a 20 20  Out,3) = mxY;.  
4d60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
4d70: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
4d80: 20 20 20 20 20 20 61 43 6f 6f 72 64 5b 30 5d 2e        aCoord[0].
4d90: 66 20 3d 20 6d 6e 58 3b 0a 20 20 20 20 20 20 61  f = mnX;.      a
4da0: 43 6f 6f 72 64 5b 31 5d 2e 66 20 3d 20 6d 78 58  Coord[1].f = mxX
4db0: 3b 0a 20 20 20 20 20 20 61 43 6f 6f 72 64 5b 32  ;.      aCoord[2
4dc0: 5d 2e 66 20 3d 20 6d 6e 59 3b 0a 20 20 20 20 20  ].f = mnY;.     
4dd0: 20 61 43 6f 6f 72 64 5b 33 5d 2e 66 20 3d 20 6d   aCoord[3].f = m
4de0: 78 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  xY;.    }.  }.  
4df0: 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 7d 0a 0a  return pOut;.}..
4e00: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
4e10: 74 69 6f 6e 20 6f 66 20 74 68 65 20 67 65 6f 70  tion of the geop
4e20: 6f 6c 79 5f 62 62 6f 78 28 58 29 20 53 51 4c 20  oly_bbox(X) SQL 
4e30: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
4e40: 74 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79  tic void geopoly
4e50: 42 42 6f 78 46 75 6e 63 28 0a 20 20 73 71 6c 69  BBoxFunc(.  sqli
4e60: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
4e70: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
4e80: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
4e90: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65  e **argv.){.  Ge
4ea0: 6f 50 6f 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f  oPoly *p = geopo
4eb0: 6c 79 42 42 6f 78 28 63 6f 6e 74 65 78 74 2c 20  lyBBox(context, 
4ec0: 61 72 67 76 5b 30 5d 2c 20 30 2c 20 30 29 3b 0a  argv[0], 0, 0);.
4ed0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
4ee0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
4ef0: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 68  ob(context, p->h
4f00: 64 72 2c 20 0a 20 20 20 20 20 20 20 34 2b 38 2a  dr, .       4+8*
4f10: 70 2d 3e 6e 56 65 72 74 65 78 2c 20 53 51 4c 49  p->nVertex, SQLI
4f20: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
4f30: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
4f40: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
4f50: 20 53 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f   State vector fo
4f60: 72 20 74 68 65 20 67 65 6f 70 6f 6c 79 5f 67 72  r the geopoly_gr
4f70: 6f 75 70 5f 62 62 6f 78 28 29 20 61 67 67 72 65  oup_bbox() aggre
4f80: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  gate function..*
4f90: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
4fa0: 20 47 65 6f 42 42 6f 78 20 47 65 6f 42 42 6f 78   GeoBBox GeoBBox
4fb0: 3b 0a 73 74 72 75 63 74 20 47 65 6f 42 42 6f 78  ;.struct GeoBBox
4fc0: 20 7b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b   {.  int isInit;
4fd0: 0a 20 20 52 74 72 65 65 43 6f 6f 72 64 20 61 5b  .  RtreeCoord a[
4fe0: 34 5d 3b 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 49  4];.};.../*.** I
4ff0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
5000: 20 74 68 65 20 67 65 6f 70 6f 6c 79 5f 67 72 6f   the geopoly_gro
5010: 75 70 5f 62 62 6f 78 28 58 29 20 61 67 67 72 65  up_bbox(X) aggre
5020: 67 61 74 65 20 53 51 4c 20 66 75 6e 63 74 69 6f  gate SQL functio
5030: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
5040: 64 20 67 65 6f 70 6f 6c 79 42 42 6f 78 53 74 65  d geopolyBBoxSte
5050: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p(.  sqlite3_con
5060: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
5070: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
5080: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5090: 76 0a 29 7b 0a 20 20 52 74 72 65 65 43 6f 6f 72  v.){.  RtreeCoor
50a0: 64 20 61 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63  d a[4];.  int rc
50b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
50c0: 28 76 6f 69 64 29 67 65 6f 70 6f 6c 79 42 42 6f  (void)geopolyBBo
50d0: 78 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  x(context, argv[
50e0: 30 5d 2c 20 61 2c 20 26 72 63 29 3b 0a 20 20 69  0], a, &rc);.  i
50f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5100: 20 29 7b 0a 20 20 20 20 47 65 6f 42 42 6f 78 20   ){.    GeoBBox 
5110: 2a 70 42 42 6f 78 3b 0a 20 20 20 20 70 42 42 6f  *pBBox;.    pBBo
5120: 78 20 3d 20 28 47 65 6f 42 42 6f 78 2a 29 73 71  x = (GeoBBox*)sq
5130: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
5140: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
5150: 20 73 69 7a 65 6f 66 28 2a 70 42 42 6f 78 29 29   sizeof(*pBBox))
5160: 3b 0a 20 20 20 20 69 66 28 20 70 42 42 6f 78 3d  ;.    if( pBBox=
5170: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
5180: 20 69 66 28 20 70 42 42 6f 78 2d 3e 69 73 49 6e   if( pBBox->isIn
5190: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  it==0 ){.      p
51a0: 42 42 6f 78 2d 3e 69 73 49 6e 69 74 20 3d 20 31  BBox->isInit = 1
51b0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
51c0: 42 42 6f 78 2d 3e 61 2c 20 61 2c 20 73 69 7a 65  BBox->a, a, size
51d0: 6f 66 28 52 74 72 65 65 43 6f 6f 72 64 29 2a 34  of(RtreeCoord)*4
51e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
51f0: 20 20 20 20 69 66 28 20 61 5b 30 5d 2e 66 20 3c      if( a[0].f <
5200: 20 70 42 42 6f 78 2d 3e 61 5b 30 5d 2e 66 20 29   pBBox->a[0].f )
5210: 20 70 42 42 6f 78 2d 3e 61 5b 30 5d 20 3d 20 61   pBBox->a[0] = a
5220: 5b 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 61  [0];.      if( a
5230: 5b 31 5d 2e 66 20 3e 20 70 42 42 6f 78 2d 3e 61  [1].f > pBBox->a
5240: 5b 31 5d 2e 66 20 29 20 70 42 42 6f 78 2d 3e 61  [1].f ) pBBox->a
5250: 5b 31 5d 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  [1] = a[1];.    
5260: 20 20 69 66 28 20 61 5b 32 5d 2e 66 20 3c 20 70    if( a[2].f < p
5270: 42 42 6f 78 2d 3e 61 5b 32 5d 2e 66 20 29 20 70  BBox->a[2].f ) p
5280: 42 42 6f 78 2d 3e 61 5b 32 5d 20 3d 20 61 5b 32  BBox->a[2] = a[2
5290: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 33  ];.      if( a[3
52a0: 5d 2e 66 20 3e 20 70 42 42 6f 78 2d 3e 61 5b 33  ].f > pBBox->a[3
52b0: 5d 2e 66 20 29 20 70 42 42 6f 78 2d 3e 61 5b 33  ].f ) pBBox->a[3
52c0: 5d 20 3d 20 61 5b 33 5d 3b 0a 20 20 20 20 7d 0a  ] = a[3];.    }.
52d0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
52e0: 64 20 67 65 6f 70 6f 6c 79 42 42 6f 78 46 69 6e  d geopolyBBoxFin
52f0: 61 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  al(.  sqlite3_co
5300: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 0a 29  ntext *context.)
5310: 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 3b 0a  {.  GeoPoly *p;.
5320: 20 20 47 65 6f 42 42 6f 78 20 2a 70 42 42 6f 78    GeoBBox *pBBox
5330: 3b 0a 20 20 70 42 42 6f 78 20 3d 20 28 47 65 6f  ;.  pBBox = (Geo
5340: 42 42 6f 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  BBox*)sqlite3_ag
5350: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
5360: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
5370: 66 28 20 70 42 42 6f 78 3d 3d 30 20 29 20 72 65  f( pBBox==0 ) re
5380: 74 75 72 6e 3b 0a 20 20 70 20 3d 20 67 65 6f 70  turn;.  p = geop
5390: 6f 6c 79 42 42 6f 78 28 63 6f 6e 74 65 78 74 2c  olyBBox(context,
53a0: 20 30 2c 20 70 42 42 6f 78 2d 3e 61 2c 20 30 29   0, pBBox->a, 0)
53b0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
53c0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
53d0: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 2d  blob(context, p-
53e0: 3e 68 64 72 2c 20 0a 20 20 20 20 20 20 20 34 2b  >hdr, .       4+
53f0: 38 2a 70 2d 3e 6e 56 65 72 74 65 78 2c 20 53 51  8*p->nVertex, SQ
5400: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
5410: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5420: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  e(p);.  }.}.../*
5430: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
5440: 20 70 6f 69 6e 74 20 28 78 30 2c 79 30 29 20 69   point (x0,y0) i
5450: 73 20 62 65 6e 65 61 74 68 20 6c 69 6e 65 20 73  s beneath line s
5460: 65 67 6d 65 6e 74 20 28 78 31 2c 79 31 29 2d 3e  egment (x1,y1)->
5470: 28 78 32 2c 79 32 29 2e 0a 2a 2a 20 52 65 74 75  (x2,y2)..** Retu
5480: 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2b 32  rns:.**.**    +2
5490: 20 20 78 30 2c 79 30 20 69 73 20 6f 6e 20 74 68    x0,y0 is on th
54a0: 65 20 6c 69 6e 65 20 73 65 67 65 6d 65 6e 74 0a  e line segement.
54b0: 2a 2a 0a 2a 2a 20 20 20 20 2b 31 20 20 78 30 2c  **.**    +1  x0,
54c0: 79 30 20 69 73 20 62 65 6e 65 61 74 68 20 6c 69  y0 is beneath li
54d0: 6e 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 0a 2a 2a  ne segment.**.**
54e0: 20 20 20 20 30 20 20 20 78 30 2c 79 30 20 69 73      0   x0,y0 is
54f0: 20 6e 6f 74 20 6f 6e 20 6f 72 20 62 65 6e 65 61   not on or benea
5500: 74 68 20 74 68 65 20 6c 69 6e 65 20 73 65 67 6d  th the line segm
5510: 65 6e 74 20 6f 72 20 74 68 65 20 6c 69 6e 65 20  ent or the line 
5520: 73 65 67 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  segment.**      
5530: 20 20 69 73 20 76 65 72 74 69 63 61 6c 20 61 6e    is vertical an
5540: 64 20 78 30 2c 79 30 20 69 73 20 6e 6f 74 20 6f  d x0,y0 is not o
5550: 6e 20 74 68 65 20 6c 69 6e 65 20 73 65 67 6d 65  n the line segme
5560: 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  nt.**.** The lef
5570: 74 2d 6d 6f 73 74 20 63 6f 6f 72 64 69 6e 61 74  t-most coordinat
5580: 65 20 6d 69 6e 28 78 31 2c 78 32 29 20 69 73 20  e min(x1,x2) is 
5590: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 74  not considered t
55a0: 6f 20 62 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20  o be part of.** 
55b0: 74 68 65 20 6c 69 6e 65 20 73 65 67 6d 65 6e 74  the line segment
55c0: 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   for the purpose
55d0: 73 20 6f 66 20 74 68 69 73 20 61 6e 61 6c 79 73  s of this analys
55e0: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
55f0: 74 20 70 6f 69 6e 74 42 65 6e 65 61 74 68 4c 69  t pointBeneathLi
5600: 6e 65 28 0a 20 20 64 6f 75 62 6c 65 20 78 30 2c  ne(.  double x0,
5610: 20 64 6f 75 62 6c 65 20 79 30 2c 0a 20 20 64 6f   double y0,.  do
5620: 75 62 6c 65 20 78 31 2c 20 64 6f 75 62 6c 65 20  uble x1, double 
5630: 79 31 2c 0a 20 20 64 6f 75 62 6c 65 20 78 32 2c  y1,.  double x2,
5640: 20 64 6f 75 62 6c 65 20 79 32 0a 29 7b 0a 20 20   double y2.){.  
5650: 64 6f 75 62 6c 65 20 79 3b 0a 20 20 69 66 28 20  double y;.  if( 
5660: 78 30 3d 3d 78 31 20 26 26 20 79 30 3d 3d 79 31  x0==x1 && y0==y1
5670: 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
5680: 66 28 20 78 31 3c 78 32 20 29 7b 0a 20 20 20 20  f( x1<x2 ){.    
5690: 69 66 28 20 78 30 3c 3d 78 31 20 7c 7c 20 78 30  if( x0<=x1 || x0
56a0: 3e 78 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >x2 ) return 0;.
56b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 31 3e 78    }else if( x1>x
56c0: 32 20 29 7b 0a 20 20 20 20 69 66 28 20 78 30 3c  2 ){.    if( x0<
56d0: 3d 78 32 20 7c 7c 20 78 30 3e 78 31 20 29 20 72  =x2 || x0>x1 ) r
56e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
56f0: 7b 0a 20 20 20 20 2f 2a 20 56 65 72 74 69 63 61  {.    /* Vertica
5700: 6c 20 6c 69 6e 65 20 73 65 67 6d 65 6e 74 20 2a  l line segment *
5710: 2f 0a 20 20 20 20 69 66 28 20 78 30 21 3d 78 31  /.    if( x0!=x1
5720: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
5730: 20 69 66 28 20 79 30 3c 79 31 20 26 26 20 79 30   if( y0<y1 && y0
5740: 3c 79 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <y2 ) return 0;.
5750: 20 20 20 20 69 66 28 20 79 30 3e 79 31 20 26 26      if( y0>y1 &&
5760: 20 79 30 3e 79 32 20 29 20 72 65 74 75 72 6e 20   y0>y2 ) return 
5770: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b  0;.    return 2;
5780: 0a 20 20 7d 0a 20 20 79 20 3d 20 79 31 20 2b 20  .  }.  y = y1 + 
5790: 28 79 32 2d 79 31 29 2a 28 78 30 2d 78 31 29 2f  (y2-y1)*(x0-x1)/
57a0: 28 78 32 2d 78 31 29 3b 0a 20 20 69 66 28 20 79  (x2-x1);.  if( y
57b0: 30 3d 3d 79 20 29 20 72 65 74 75 72 6e 20 32 3b  0==y ) return 2;
57c0: 0a 20 20 69 66 28 20 79 30 3c 79 20 29 20 72 65  .  if( y0<y ) re
57d0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
57e0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c   0;.}../*.** SQL
57f0: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 20 67 65   function:    ge
5800: 6f 70 6f 6c 79 5f 63 6f 6e 74 61 69 6e 73 5f 70  opoly_contains_p
5810: 6f 69 6e 74 28 50 2c 58 2c 59 29 0a 2a 2a 0a 2a  oint(P,X,Y).**.*
5820: 2a 20 52 65 74 75 72 6e 20 2b 32 20 69 66 20 70  * Return +2 if p
5830: 6f 69 6e 74 20 58 2c 59 20 69 73 20 77 69 74 68  oint X,Y is with
5840: 69 6e 20 70 6f 6c 79 67 6f 6e 20 50 2e 0a 2a 2a  in polygon P..**
5850: 20 52 65 74 75 72 6e 20 2b 31 20 69 66 20 70 6f   Return +1 if po
5860: 69 6e 74 20 58 2c 59 20 69 73 20 6f 6e 20 74 68  int X,Y is on th
5870: 65 20 70 6f 6c 79 67 6f 6e 20 62 6f 75 6e 64 61  e polygon bounda
5880: 72 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  ry..** Return 0 
5890: 69 66 20 70 6f 69 6e 74 20 58 2c 59 20 69 73 20  if point X,Y is 
58a0: 6f 75 74 73 69 64 65 20 74 68 65 20 70 6f 6c 79  outside the poly
58b0: 67 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gon.*/.static vo
58c0: 69 64 20 67 65 6f 70 6f 6c 79 43 6f 6e 74 61 69  id geopolyContai
58d0: 6e 73 50 6f 69 6e 74 46 75 6e 63 28 0a 20 20 73  nsPointFunc(.  s
58e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
58f0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
5900: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
5910: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
5920: 20 47 65 6f 50 6f 6c 79 20 2a 70 31 20 3d 20 67   GeoPoly *p1 = g
5930: 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28  eopolyFuncParam(
5940: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
5950: 2c 20 30 29 3b 0a 20 20 64 6f 75 62 6c 65 20 78  , 0);.  double x
5960: 30 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  0 = sqlite3_valu
5970: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d  e_double(argv[1]
5980: 29 3b 0a 20 20 64 6f 75 62 6c 65 20 79 30 20 3d  );.  double y0 =
5990: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
59a0: 6f 75 62 6c 65 28 61 72 67 76 5b 32 5d 29 3b 0a  ouble(argv[2]);.
59b0: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69    int v = 0;.  i
59c0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
59d0: 74 20 69 69 3b 0a 20 20 69 66 28 20 70 31 3d 3d  t ii;.  if( p1==
59e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
59f0: 72 28 69 69 3d 30 3b 20 69 69 3c 70 31 2d 3e 6e  r(ii=0; ii<p1->n
5a00: 56 65 72 74 65 78 2d 31 3b 20 69 69 2b 2b 29 7b  Vertex-1; ii++){
5a10: 0a 20 20 20 20 76 20 3d 20 70 6f 69 6e 74 42 65  .    v = pointBe
5a20: 6e 65 61 74 68 4c 69 6e 65 28 78 30 2c 79 30 2c  neathLine(x0,y0,
5a30: 47 65 6f 58 28 70 31 2c 69 69 29 2c 20 47 65 6f  GeoX(p1,ii), Geo
5a40: 59 28 70 31 2c 69 69 29 2c 0a 20 20 20 20 20 20  Y(p1,ii),.      
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 20 20 20 20 20 20 20 20 47 65 6f 58 28 70 31           GeoX(p1
5a70: 2c 69 69 2b 31 29 2c 47 65 6f 59 28 70 31 2c 69  ,ii+1),GeoY(p1,i
5a80: 69 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 76  i+1));.    if( v
5a90: 3d 3d 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==2 ) break;.   
5aa0: 20 63 6e 74 20 2b 3d 20 76 3b 0a 20 20 7d 0a 20   cnt += v;.  }. 
5ab0: 20 69 66 28 20 76 21 3d 32 20 29 7b 0a 20 20 20   if( v!=2 ){.   
5ac0: 20 76 20 3d 20 70 6f 69 6e 74 42 65 6e 65 61 74   v = pointBeneat
5ad0: 68 4c 69 6e 65 28 78 30 2c 79 30 2c 47 65 6f 58  hLine(x0,y0,GeoX
5ae0: 28 70 31 2c 69 69 29 2c 20 47 65 6f 59 28 70 31  (p1,ii), GeoY(p1
5af0: 2c 69 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ,ii),.          
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b10: 20 20 20 20 20 47 65 6f 58 28 70 31 2c 30 29 2c       GeoX(p1,0),
5b20: 20 20 47 65 6f 59 28 70 31 2c 30 29 29 3b 0a 20    GeoY(p1,0));. 
5b30: 20 7d 0a 20 20 69 66 28 20 76 3d 3d 32 20 29 7b   }.  if( v==2 ){
5b40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
5b50: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
5b60: 20 31 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   1);.  }else if(
5b70: 20 28 28 76 2b 63 6e 74 29 26 31 29 3d 3d 30 20   ((v+cnt)&1)==0 
5b80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
5b90: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
5ba0: 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t, 0);.  }else{.
5bb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5bc0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
5bd0: 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  2);.  }.  sqlite
5be0: 33 5f 66 72 65 65 28 70 31 29 3b 0a 7d 0a 0a 2f  3_free(p1);.}../
5bf0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
5c00: 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
5c10: 69 6e 74 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c  int geopolyOverl
5c20: 61 70 28 47 65 6f 50 6f 6c 79 20 2a 70 31 2c 20  ap(GeoPoly *p1, 
5c30: 47 65 6f 50 6f 6c 79 20 2a 70 32 29 3b 0a 0a 2f  GeoPoly *p2);../
5c40: 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  *.** SQL functio
5c50: 6e 3a 20 20 20 20 67 65 6f 70 6f 6c 79 5f 77 69  n:    geopoly_wi
5c60: 74 68 69 6e 28 50 31 2c 50 32 29 0a 2a 2a 0a 2a  thin(P1,P2).**.*
5c70: 2a 20 52 65 74 75 72 6e 20 2b 32 20 69 66 20 50  * Return +2 if P
5c80: 31 20 61 6e 64 20 50 32 20 61 72 65 20 74 68 65  1 and P2 are the
5c90: 20 73 61 6d 65 20 70 6f 6c 79 67 6f 6e 0a 2a 2a   same polygon.**
5ca0: 20 52 65 74 75 72 6e 20 2b 31 20 69 66 20 50 32   Return +1 if P2
5cb0: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69   is contained wi
5cc0: 74 68 69 6e 20 50 31 0a 2a 2a 20 52 65 74 75 72  thin P1.** Retur
5cd0: 6e 20 30 20 69 66 20 61 6e 79 20 70 61 72 74 20  n 0 if any part 
5ce0: 6f 66 20 50 32 20 69 73 20 6f 6e 20 74 68 65 20  of P2 is on the 
5cf0: 6f 75 74 73 69 64 65 20 6f 66 20 50 31 0a 2a 2a  outside of P1.**
5d00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5d10: 67 65 6f 70 6f 6c 79 57 69 74 68 69 6e 46 75 6e  geopolyWithinFun
5d20: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5d30: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
5d40: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
5d50: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5d60: 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a  v.){.  GeoPoly *
5d70: 70 31 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63  p1 = geopolyFunc
5d80: 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61  Param(context, a
5d90: 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 47 65  rgv[0], 0);.  Ge
5da0: 6f 50 6f 6c 79 20 2a 70 32 20 3d 20 67 65 6f 70  oPoly *p2 = geop
5db0: 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e  olyFuncParam(con
5dc0: 74 65 78 74 2c 20 61 72 67 76 5b 31 5d 2c 20 30  text, argv[1], 0
5dd0: 29 3b 0a 20 20 69 66 28 20 70 31 20 26 26 20 70  );.  if( p1 && p
5de0: 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  2 ){.    int x =
5df0: 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c 61 70 28   geopolyOverlap(
5e00: 70 31 2c 20 70 32 29 3b 0a 20 20 20 20 69 66 28  p1, p2);.    if(
5e10: 20 78 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71   x<0 ){.      sq
5e20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
5e30: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
5e40: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5e50: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5e60: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
5e70: 78 3d 3d 32 20 3f 20 31 20 3a 20 78 3d 3d 34 20  x==2 ? 1 : x==4 
5e80: 3f 20 32 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a  ? 2 : 0);.    }.
5e90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
5ea0: 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p1);.  sqlite
5eb0: 33 5f 66 72 65 65 28 70 32 29 3b 0a 7d 0a 0a 2f  3_free(p2);.}../
5ec0: 2a 20 4f 62 6a 65 63 74 73 20 75 73 65 64 20 62  * Objects used b
5ed0: 79 20 74 68 65 20 6f 76 65 72 6c 61 70 20 61 6c  y the overlap al
5ee0: 67 6f 72 69 68 6d 2e 20 2a 2f 0a 74 79 70 65 64  gorihm. */.typed
5ef0: 65 66 20 73 74 72 75 63 74 20 47 65 6f 45 76 65  ef struct GeoEve
5f00: 6e 74 20 47 65 6f 45 76 65 6e 74 3b 0a 74 79 70  nt GeoEvent;.typ
5f10: 65 64 65 66 20 73 74 72 75 63 74 20 47 65 6f 53  edef struct GeoS
5f20: 65 67 6d 65 6e 74 20 47 65 6f 53 65 67 6d 65 6e  egment GeoSegmen
5f30: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
5f40: 74 20 47 65 6f 4f 76 65 72 6c 61 70 20 47 65 6f  t GeoOverlap Geo
5f50: 4f 76 65 72 6c 61 70 3b 0a 73 74 72 75 63 74 20  Overlap;.struct 
5f60: 47 65 6f 45 76 65 6e 74 20 7b 0a 20 20 64 6f 75  GeoEvent {.  dou
5f70: 62 6c 65 20 78 3b 20 20 20 20 20 20 20 20 20 20  ble x;          
5f80: 20 20 20 20 2f 2a 20 58 20 63 6f 6f 72 64 69 6e      /* X coordin
5f90: 61 74 65 20 61 74 20 77 68 69 63 68 20 65 76 65  ate at which eve
5fa0: 6e 74 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69  nt occurs */.  i
5fb0: 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
5fc0: 20 20 20 20 20 20 2f 2a 20 30 20 66 6f 72 20 41        /* 0 for A
5fd0: 44 44 2c 20 31 20 66 6f 72 20 52 45 4d 4f 56 45  DD, 1 for REMOVE
5fe0: 20 2a 2f 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74   */.  GeoSegment
5ff0: 20 2a 70 53 65 67 3b 20 20 20 20 20 20 2f 2a 20   *pSeg;      /* 
6000: 54 68 65 20 73 65 67 6d 65 6e 74 20 74 6f 20 62  The segment to b
6010: 65 20 61 64 64 65 64 20 6f 72 20 72 65 6d 6f 76  e added or remov
6020: 65 64 20 2a 2f 0a 20 20 47 65 6f 45 76 65 6e 74  ed */.  GeoEvent
6030: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f   *pNext;       /
6040: 2a 20 4e 65 78 74 20 65 76 65 6e 74 20 69 6e 20  * Next event in 
6050: 74 68 65 20 73 6f 72 74 65 64 20 6c 69 73 74 20  the sorted list 
6060: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 47 65 6f  */.};.struct Geo
6070: 53 65 67 6d 65 6e 74 20 7b 0a 20 20 64 6f 75 62  Segment {.  doub
6080: 6c 65 20 43 2c 20 42 3b 20 20 20 20 20 20 20 20  le C, B;        
6090: 20 20 20 2f 2a 20 79 20 3d 20 43 2a 78 20 2b 20     /* y = C*x + 
60a0: 42 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 79 3b  B */.  double y;
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
60c0: 20 43 75 72 72 65 6e 74 20 79 20 76 61 6c 75 65   Current y value
60d0: 20 2a 2f 0a 20 20 66 6c 6f 61 74 20 79 30 3b 20   */.  float y0; 
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60f0: 49 6e 69 74 69 61 6c 20 79 20 76 61 6c 75 65 20  Initial y value 
6100: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
6110: 61 72 20 73 69 64 65 3b 20 20 20 20 2f 2a 20 31  ar side;    /* 1
6120: 20 66 6f 72 20 70 31 2c 20 32 20 66 6f 72 20 70   for p1, 2 for p
6130: 32 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  2 */.  unsigned 
6140: 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 2f 2a  int idx;      /*
6150: 20 57 68 69 63 68 20 73 65 67 6d 65 6e 74 20 77   Which segment w
6160: 69 74 68 69 6e 20 74 68 65 20 73 69 64 65 20 2a  ithin the side *
6170: 2f 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a  /.  GeoSegment *
6180: 70 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65  pNext;     /* Ne
6190: 78 74 20 73 65 67 6d 65 6e 74 20 69 6e 20 61 20  xt segment in a 
61a0: 6c 69 73 74 20 73 6f 72 74 65 64 20 62 79 20 79  list sorted by y
61b0: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 47 65   */.};.struct Ge
61c0: 6f 4f 76 65 72 6c 61 70 20 7b 0a 20 20 47 65 6f  oOverlap {.  Geo
61d0: 45 76 65 6e 74 20 2a 61 45 76 65 6e 74 3b 20 20  Event *aEvent;  
61e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
61f0: 20 6f 66 20 61 6c 6c 20 65 76 65 6e 74 73 20 2a   of all events *
6200: 2f 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a  /.  GeoSegment *
6210: 61 53 65 67 6d 65 6e 74 3b 20 20 20 20 20 20 2f  aSegment;      /
6220: 2a 20 41 72 72 61 79 20 6f 66 20 61 6c 6c 20 73  * Array of all s
6230: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  egments */.  int
6240: 20 6e 45 76 65 6e 74 3b 20 20 20 20 20 20 20 20   nEvent;        
6250: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6260: 72 20 6f 66 20 65 76 65 6e 74 73 20 2a 2f 0a 20  r of events */. 
6270: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b 20 20   int nSegment;  
6280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6290: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
62a0: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  s */.};../*.** A
62b0: 64 64 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  dd a single segm
62c0: 65 6e 74 20 61 6e 64 20 69 74 73 20 61 73 73 6f  ent and its asso
62d0: 63 69 61 74 65 64 20 65 76 65 6e 74 73 2e 0a 2a  ciated events..*
62e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
62f0: 6f 70 6f 6c 79 41 64 64 4f 6e 65 53 65 67 6d 65  opolyAddOneSegme
6300: 6e 74 28 0a 20 20 47 65 6f 4f 76 65 72 6c 61 70  nt(.  GeoOverlap
6310: 20 2a 70 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20   *p,.  GeoCoord 
6320: 78 30 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20 79  x0,.  GeoCoord y
6330: 30 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20 78 31  0,.  GeoCoord x1
6340: 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20 79 31 2c  ,.  GeoCoord y1,
6350: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
6360: 20 73 69 64 65 2c 0a 20 20 75 6e 73 69 67 6e 65   side,.  unsigne
6370: 64 20 69 6e 74 20 69 64 78 0a 29 7b 0a 20 20 47  d int idx.){.  G
6380: 65 6f 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  eoSegment *pSeg;
6390: 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a 70 45 76  .  GeoEvent *pEv
63a0: 65 6e 74 3b 0a 20 20 69 66 28 20 78 30 3d 3d 78  ent;.  if( x0==x
63b0: 31 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  1 ) return;  /* 
63c0: 49 67 6e 6f 72 65 20 76 65 72 74 69 63 61 6c 20  Ignore vertical 
63d0: 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66  segments */.  if
63e0: 28 20 78 30 3e 78 31 20 29 7b 0a 20 20 20 20 47  ( x0>x1 ){.    G
63f0: 65 6f 43 6f 6f 72 64 20 74 20 3d 20 78 30 3b 0a  eoCoord t = x0;.
6400: 20 20 20 20 78 30 20 3d 20 78 31 3b 0a 20 20 20      x0 = x1;.   
6410: 20 78 31 20 3d 20 74 3b 0a 20 20 20 20 74 20 3d   x1 = t;.    t =
6420: 20 79 30 3b 0a 20 20 20 20 79 30 20 3d 20 79 31   y0;.    y0 = y1
6430: 3b 0a 20 20 20 20 79 31 20 3d 20 74 3b 0a 20 20  ;.    y1 = t;.  
6440: 7d 0a 20 20 70 53 65 67 20 3d 20 70 2d 3e 61 53  }.  pSeg = p->aS
6450: 65 67 6d 65 6e 74 20 2b 20 70 2d 3e 6e 53 65 67  egment + p->nSeg
6460: 6d 65 6e 74 3b 0a 20 20 70 2d 3e 6e 53 65 67 6d  ment;.  p->nSegm
6470: 65 6e 74 2b 2b 3b 0a 20 20 70 53 65 67 2d 3e 43  ent++;.  pSeg->C
6480: 20 3d 20 28 79 31 2d 79 30 29 2f 28 78 31 2d 78   = (y1-y0)/(x1-x
6490: 30 29 3b 0a 20 20 70 53 65 67 2d 3e 42 20 3d 20  0);.  pSeg->B = 
64a0: 79 31 20 2d 20 78 31 2a 70 53 65 67 2d 3e 43 3b  y1 - x1*pSeg->C;
64b0: 0a 20 20 70 53 65 67 2d 3e 79 30 20 3d 20 79 30  .  pSeg->y0 = y0
64c0: 3b 0a 20 20 70 53 65 67 2d 3e 73 69 64 65 20 3d  ;.  pSeg->side =
64d0: 20 73 69 64 65 3b 0a 20 20 70 53 65 67 2d 3e 69   side;.  pSeg->i
64e0: 64 78 20 3d 20 69 64 78 3b 0a 20 20 70 45 76 65  dx = idx;.  pEve
64f0: 6e 74 20 3d 20 70 2d 3e 61 45 76 65 6e 74 20 2b  nt = p->aEvent +
6500: 20 70 2d 3e 6e 45 76 65 6e 74 3b 0a 20 20 70 2d   p->nEvent;.  p-
6510: 3e 6e 45 76 65 6e 74 2b 2b 3b 0a 20 20 70 45 76  >nEvent++;.  pEv
6520: 65 6e 74 2d 3e 78 20 3d 20 78 30 3b 0a 20 20 70  ent->x = x0;.  p
6530: 45 76 65 6e 74 2d 3e 65 54 79 70 65 20 3d 20 30  Event->eType = 0
6540: 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 70 53 65 67  ;.  pEvent->pSeg
6550: 20 3d 20 70 53 65 67 3b 0a 20 20 70 45 76 65 6e   = pSeg;.  pEven
6560: 74 20 3d 20 70 2d 3e 61 45 76 65 6e 74 20 2b 20  t = p->aEvent + 
6570: 70 2d 3e 6e 45 76 65 6e 74 3b 0a 20 20 70 2d 3e  p->nEvent;.  p->
6580: 6e 45 76 65 6e 74 2b 2b 3b 0a 20 20 70 45 76 65  nEvent++;.  pEve
6590: 6e 74 2d 3e 78 20 3d 20 78 31 3b 0a 20 20 70 45  nt->x = x1;.  pE
65a0: 76 65 6e 74 2d 3e 65 54 79 70 65 20 3d 20 31 3b  vent->eType = 1;
65b0: 0a 20 20 70 45 76 65 6e 74 2d 3e 70 53 65 67 20  .  pEvent->pSeg 
65c0: 3d 20 70 53 65 67 3b 0a 7d 0a 20 20 0a 0a 0a 2f  = pSeg;.}.  .../
65d0: 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 6c 6c 20  *.** Insert all 
65e0: 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 65 76 65  segments and eve
65f0: 6e 74 73 20 66 6f 72 20 70 6f 6c 79 67 6f 6e 20  nts for polygon 
6600: 70 50 6f 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPoly..*/.static
6610: 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 41 64 64   void geopolyAdd
6620: 53 65 67 6d 65 6e 74 73 28 0a 20 20 47 65 6f 4f  Segments(.  GeoO
6630: 76 65 72 6c 61 70 20 2a 70 2c 20 20 20 20 20 20  verlap *p,      
6640: 20 20 20 20 2f 2a 20 41 64 64 20 73 65 67 6d 65      /* Add segme
6650: 6e 74 73 20 74 6f 20 74 68 69 73 20 4f 76 65 72  nts to this Over
6660: 6c 61 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  lap object */.  
6670: 47 65 6f 50 6f 6c 79 20 2a 70 50 6f 6c 79 2c 20  GeoPoly *pPoly, 
6680: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 6b 65 20          /* Take 
6690: 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  all segments fro
66a0: 6d 20 74 68 69 73 20 70 6f 6c 79 67 6f 6e 20 2a  m this polygon *
66b0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
66c0: 72 20 73 69 64 65 20 20 20 20 20 20 2f 2a 20 54  r side      /* T
66d0: 68 65 20 73 69 64 65 20 6f 66 20 70 50 6f 6c 79  he side of pPoly
66e0: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
66f0: 64 20 69 6e 74 20 69 3b 0a 20 20 47 65 6f 43 6f  d int i;.  GeoCo
6700: 6f 72 64 20 2a 78 3b 0a 20 20 66 6f 72 28 69 3d  ord *x;.  for(i=
6710: 30 3b 20 69 3c 28 75 6e 73 69 67 6e 65 64 29 70  0; i<(unsigned)p
6720: 50 6f 6c 79 2d 3e 6e 56 65 72 74 65 78 2d 31 3b  Poly->nVertex-1;
6730: 20 69 2b 2b 29 7b 0a 20 20 20 20 78 20 3d 20 26   i++){.    x = &
6740: 47 65 6f 58 28 70 50 6f 6c 79 2c 69 29 3b 0a 20  GeoX(pPoly,i);. 
6750: 20 20 20 67 65 6f 70 6f 6c 79 41 64 64 4f 6e 65     geopolyAddOne
6760: 53 65 67 6d 65 6e 74 28 70 2c 20 78 5b 30 5d 2c  Segment(p, x[0],
6770: 20 78 5b 31 5d 2c 20 78 5b 32 5d 2c 20 78 5b 33   x[1], x[2], x[3
6780: 5d 2c 20 73 69 64 65 2c 20 69 29 3b 0a 20 20 7d  ], side, i);.  }
6790: 0a 20 20 78 20 3d 20 26 47 65 6f 58 28 70 50 6f  .  x = &GeoX(pPo
67a0: 6c 79 2c 69 29 3b 0a 20 20 67 65 6f 70 6f 6c 79  ly,i);.  geopoly
67b0: 41 64 64 4f 6e 65 53 65 67 6d 65 6e 74 28 70 2c  AddOneSegment(p,
67c0: 20 78 5b 30 5d 2c 20 78 5b 31 5d 2c 20 70 50 6f   x[0], x[1], pPo
67d0: 6c 79 2d 3e 61 5b 30 5d 2c 20 70 50 6f 6c 79 2d  ly->a[0], pPoly-
67e0: 3e 61 5b 31 5d 2c 20 73 69 64 65 2c 20 69 29 3b  >a[1], side, i);
67f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20  .}../*.** Merge 
6800: 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 73 6f 72  two lists of sor
6810: 74 65 64 20 65 76 65 6e 74 73 20 62 79 20 58 20  ted events by X 
6820: 63 6f 6f 72 64 69 6e 61 74 65 0a 2a 2f 0a 73 74  coordinate.*/.st
6830: 61 74 69 63 20 47 65 6f 45 76 65 6e 74 20 2a 67  atic GeoEvent *g
6840: 65 6f 70 6f 6c 79 45 76 65 6e 74 4d 65 72 67 65  eopolyEventMerge
6850: 28 47 65 6f 45 76 65 6e 74 20 2a 70 4c 65 66 74  (GeoEvent *pLeft
6860: 2c 20 47 65 6f 45 76 65 6e 74 20 2a 70 52 69 67  , GeoEvent *pRig
6870: 68 74 29 7b 0a 20 20 47 65 6f 45 76 65 6e 74 20  ht){.  GeoEvent 
6880: 68 65 61 64 2c 20 2a 70 4c 61 73 74 3b 0a 20 20  head, *pLast;.  
6890: 68 65 61 64 2e 70 4e 65 78 74 20 3d 20 30 3b 0a  head.pNext = 0;.
68a0: 20 20 70 4c 61 73 74 20 3d 20 26 68 65 61 64 3b    pLast = &head;
68b0: 0a 20 20 77 68 69 6c 65 28 20 70 52 69 67 68 74  .  while( pRight
68c0: 20 26 26 20 70 4c 65 66 74 20 29 7b 0a 20 20 20   && pLeft ){.   
68d0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 78 20 3c   if( pRight->x <
68e0: 3d 20 70 4c 65 66 74 2d 3e 78 20 29 7b 0a 20 20  = pLeft->x ){.  
68f0: 20 20 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74      pLast->pNext
6900: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
6910: 20 70 4c 61 73 74 20 3d 20 70 52 69 67 68 74 3b   pLast = pRight;
6920: 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
6930: 70 52 69 67 68 74 2d 3e 70 4e 65 78 74 3b 0a 20  pRight->pNext;. 
6940: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6950: 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pLast->pNext = p
6960: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4c 61 73  Left;.      pLas
6970: 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20  t = pLeft;.     
6980: 20 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 2d 3e   pLeft = pLeft->
6990: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
69a0: 0a 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20  .  pLast->pNext 
69b0: 3d 20 70 52 69 67 68 74 20 3f 20 70 52 69 67 68  = pRight ? pRigh
69c0: 74 20 3a 20 70 4c 65 66 74 3b 0a 20 20 72 65 74  t : pLeft;.  ret
69d0: 75 72 6e 20 68 65 61 64 2e 70 4e 65 78 74 3b 20  urn head.pNext; 
69e0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20   .}../*.** Sort 
69f0: 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 45 76 65  an array of nEve
6a00: 6e 74 20 65 76 65 6e 74 20 6f 62 6a 65 63 74 73  nt event objects
6a10: 20 69 6e 74 6f 20 61 20 6c 69 73 74 2e 0a 2a 2f   into a list..*/
6a20: 0a 73 74 61 74 69 63 20 47 65 6f 45 76 65 6e 74  .static GeoEvent
6a30: 20 2a 67 65 6f 70 6f 6c 79 53 6f 72 74 45 76 65   *geopolySortEve
6a40: 6e 74 73 42 79 58 28 47 65 6f 45 76 65 6e 74 20  ntsByX(GeoEvent 
6a50: 2a 61 45 76 65 6e 74 2c 20 69 6e 74 20 6e 45 76  *aEvent, int nEv
6a60: 65 6e 74 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d  ent){.  int mx =
6a70: 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
6a80: 20 20 47 65 6f 45 76 65 6e 74 20 2a 70 3b 0a 20    GeoEvent *p;. 
6a90: 20 47 65 6f 45 76 65 6e 74 20 2a 61 5b 35 30 5d   GeoEvent *a[50]
6aa0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
6ab0: 45 76 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  Event; i++){.   
6ac0: 20 70 20 3d 20 26 61 45 76 65 6e 74 5b 69 5d 3b   p = &aEvent[i];
6ad0: 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  .    p->pNext = 
6ae0: 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
6af0: 6a 3c 6d 78 20 26 26 20 61 5b 6a 5d 3b 20 6a 2b  j<mx && a[j]; j+
6b00: 2b 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 67 65  +){.      p = ge
6b10: 6f 70 6f 6c 79 45 76 65 6e 74 4d 65 72 67 65 28  opolyEventMerge(
6b20: 61 5b 6a 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20  a[j], p);.      
6b30: 61 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  a[j] = 0;.    }.
6b40: 20 20 20 20 61 5b 6a 5d 20 3d 20 70 3b 0a 20 20      a[j] = p;.  
6b50: 20 20 69 66 28 20 6a 3e 3d 6d 78 20 29 20 6d 78    if( j>=mx ) mx
6b60: 20 3d 20 6a 2b 31 3b 0a 20 20 7d 0a 20 20 70 20   = j+1;.  }.  p 
6b70: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
6b80: 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<mx; i++){.    
6b90: 70 20 3d 20 67 65 6f 70 6f 6c 79 45 76 65 6e 74  p = geopolyEvent
6ba0: 4d 65 72 67 65 28 61 5b 69 5d 2c 20 70 29 3b 0a  Merge(a[i], p);.
6bb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
6bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74  }../*.** Merge t
6bd0: 77 6f 20 6c 69 73 74 73 20 6f 66 20 73 6f 72 74  wo lists of sort
6be0: 65 64 20 73 65 67 6d 65 6e 74 73 20 62 79 20 59  ed segments by Y
6bf0: 2c 20 61 6e 64 20 74 68 65 6e 20 62 79 20 43 2e  , and then by C.
6c00: 0a 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f 53 65  .*/.static GeoSe
6c10: 67 6d 65 6e 74 20 2a 67 65 6f 70 6f 6c 79 53 65  gment *geopolySe
6c20: 67 6d 65 6e 74 4d 65 72 67 65 28 47 65 6f 53 65  gmentMerge(GeoSe
6c30: 67 6d 65 6e 74 20 2a 70 4c 65 66 74 2c 20 47 65  gment *pLeft, Ge
6c40: 6f 53 65 67 6d 65 6e 74 20 2a 70 52 69 67 68 74  oSegment *pRight
6c50: 29 7b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20  ){.  GeoSegment 
6c60: 68 65 61 64 2c 20 2a 70 4c 61 73 74 3b 0a 20 20  head, *pLast;.  
6c70: 68 65 61 64 2e 70 4e 65 78 74 20 3d 20 30 3b 0a  head.pNext = 0;.
6c80: 20 20 70 4c 61 73 74 20 3d 20 26 68 65 61 64 3b    pLast = &head;
6c90: 0a 20 20 77 68 69 6c 65 28 20 70 52 69 67 68 74  .  while( pRight
6ca0: 20 26 26 20 70 4c 65 66 74 20 29 7b 0a 20 20 20   && pLeft ){.   
6cb0: 20 64 6f 75 62 6c 65 20 72 20 3d 20 70 52 69 67   double r = pRig
6cc0: 68 74 2d 3e 79 20 2d 20 70 4c 65 66 74 2d 3e 79  ht->y - pLeft->y
6cd0: 3b 0a 20 20 20 20 69 66 28 20 72 3d 3d 30 2e 30  ;.    if( r==0.0
6ce0: 20 29 20 72 20 3d 20 70 52 69 67 68 74 2d 3e 43   ) r = pRight->C
6cf0: 20 2d 20 70 4c 65 66 74 2d 3e 43 3b 0a 20 20 20   - pLeft->C;.   
6d00: 20 69 66 28 20 72 3c 30 2e 30 20 29 7b 0a 20 20   if( r<0.0 ){.  
6d10: 20 20 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74      pLast->pNext
6d20: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
6d30: 20 70 4c 61 73 74 20 3d 20 70 52 69 67 68 74 3b   pLast = pRight;
6d40: 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
6d50: 70 52 69 67 68 74 2d 3e 70 4e 65 78 74 3b 0a 20  pRight->pNext;. 
6d60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6d70: 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pLast->pNext = p
6d80: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4c 61 73  Left;.      pLas
6d90: 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20  t = pLeft;.     
6da0: 20 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 2d 3e   pLeft = pLeft->
6db0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
6dc0: 0a 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20  .  pLast->pNext 
6dd0: 3d 20 70 52 69 67 68 74 20 3f 20 70 52 69 67 68  = pRight ? pRigh
6de0: 74 20 3a 20 70 4c 65 66 74 3b 0a 20 20 72 65 74  t : pLeft;.  ret
6df0: 75 72 6e 20 68 65 61 64 2e 70 4e 65 78 74 3b 20  urn head.pNext; 
6e00: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20   .}../*.** Sort 
6e10: 61 20 6c 69 73 74 20 6f 66 20 47 65 6f 53 65 67  a list of GeoSeg
6e20: 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20 6f  ments in order o
6e30: 66 20 69 6e 63 72 65 61 73 69 6e 67 20 59 20 61  f increasing Y a
6e40: 6e 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  nd in the event 
6e50: 6f 66 0a 2a 2a 20 61 20 74 69 65 2c 20 69 6e 63  of.** a tie, inc
6e60: 72 65 61 73 69 6e 67 20 43 20 28 73 6c 6f 70 65  reasing C (slope
6e70: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f  )..*/.static Geo
6e80: 53 65 67 6d 65 6e 74 20 2a 67 65 6f 70 6f 6c 79  Segment *geopoly
6e90: 53 6f 72 74 53 65 67 6d 65 6e 74 73 42 79 59 41  SortSegmentsByYA
6ea0: 6e 64 43 28 47 65 6f 53 65 67 6d 65 6e 74 20 2a  ndC(GeoSegment *
6eb0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78  pList){.  int mx
6ec0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
6ed0: 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70 3b 0a   GeoSegment *p;.
6ee0: 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a 61 5b    GeoSegment *a[
6ef0: 35 30 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  50];.  while( pL
6f00: 69 73 74 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  ist ){.    p = p
6f10: 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69 73 74 20  List;.    pList 
6f20: 3d 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  = pList->pNext;.
6f30: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30      p->pNext = 0
6f40: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
6f50: 3c 6d 78 20 26 26 20 61 5b 69 5d 3b 20 69 2b 2b  <mx && a[i]; i++
6f60: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 67 65 6f  ){.      p = geo
6f70: 70 6f 6c 79 53 65 67 6d 65 6e 74 4d 65 72 67 65  polySegmentMerge
6f80: 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20  (a[i], p);.     
6f90: 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d   a[i] = 0;.    }
6fa0: 0a 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20  .    a[i] = p;. 
6fb0: 20 20 20 69 66 28 20 69 3e 3d 6d 78 20 29 20 6d     if( i>=mx ) m
6fc0: 78 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 70  x = i+1;.  }.  p
6fd0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
6fe0: 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<mx; i++){.   
6ff0: 20 70 20 3d 20 67 65 6f 70 6f 6c 79 53 65 67 6d   p = geopolySegm
7000: 65 6e 74 4d 65 72 67 65 28 61 5b 69 5d 2c 20 70  entMerge(a[i], p
7010: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7020: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  p;.}../*.** Dete
7030: 72 6d 69 6e 65 20 74 68 65 20 6f 76 65 72 6c 61  rmine the overla
7040: 70 20 62 65 74 77 65 65 6e 20 74 77 6f 20 70 6f  p between two po
7050: 6c 79 67 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63  lygons.*/.static
7060: 20 69 6e 74 20 67 65 6f 70 6f 6c 79 4f 76 65 72   int geopolyOver
7070: 6c 61 70 28 47 65 6f 50 6f 6c 79 20 2a 70 31 2c  lap(GeoPoly *p1,
7080: 20 47 65 6f 50 6f 6c 79 20 2a 70 32 29 7b 0a 20   GeoPoly *p2){. 
7090: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
70a0: 56 65 72 74 65 78 20 3d 20 70 31 2d 3e 6e 56 65  Vertex = p1->nVe
70b0: 72 74 65 78 20 2b 20 70 32 2d 3e 6e 56 65 72 74  rtex + p2->nVert
70c0: 65 78 20 2b 20 32 3b 0a 20 20 47 65 6f 4f 76 65  ex + 2;.  GeoOve
70d0: 72 6c 61 70 20 2a 70 3b 0a 20 20 73 71 6c 69 74  rlap *p;.  sqlit
70e0: 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 3b 0a  e3_int64 nByte;.
70f0: 20 20 47 65 6f 45 76 65 6e 74 20 2a 70 54 68 69    GeoEvent *pThi
7100: 73 45 76 65 6e 74 3b 0a 20 20 64 6f 75 62 6c 65  sEvent;.  double
7110: 20 72 58 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   rX;.  int rc = 
7120: 30 3b 0a 20 20 69 6e 74 20 6e 65 65 64 53 6f 72  0;.  int needSor
7130: 74 20 3d 20 30 3b 0a 20 20 47 65 6f 53 65 67 6d  t = 0;.  GeoSegm
7140: 65 6e 74 20 2a 70 41 63 74 69 76 65 20 3d 20 30  ent *pActive = 0
7150: 3b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a  ;.  GeoSegment *
7160: 70 53 65 67 3b 0a 20 20 75 6e 73 69 67 6e 65 64  pSeg;.  unsigned
7170: 20 63 68 61 72 20 61 4f 76 65 72 6c 61 70 5b 34   char aOverlap[4
7180: 5d 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 69  ];..  nByte = si
7190: 7a 65 6f 66 28 47 65 6f 45 76 65 6e 74 29 2a 6e  zeof(GeoEvent)*n
71a0: 56 65 72 74 65 78 2a 32 20 0a 20 20 20 20 20 20  Vertex*2 .      
71b0: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 47 65       + sizeof(Ge
71c0: 6f 53 65 67 6d 65 6e 74 29 2a 6e 56 65 72 74 65  oSegment)*nVerte
71d0: 78 20 0a 20 20 20 20 20 20 20 20 20 20 20 2b 20  x .           + 
71e0: 73 69 7a 65 6f 66 28 47 65 6f 4f 76 65 72 6c 61  sizeof(GeoOverla
71f0: 70 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  p);.  p = sqlite
7200: 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74  3_malloc64( nByt
7210: 65 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  e );.  if( p==0 
7220: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 70  ) return -1;.  p
7230: 2d 3e 61 45 76 65 6e 74 20 3d 20 28 47 65 6f 45  ->aEvent = (GeoE
7240: 76 65 6e 74 2a 29 26 70 5b 31 5d 3b 0a 20 20 70  vent*)&p[1];.  p
7250: 2d 3e 61 53 65 67 6d 65 6e 74 20 3d 20 28 47 65  ->aSegment = (Ge
7260: 6f 53 65 67 6d 65 6e 74 2a 29 26 70 2d 3e 61 45  oSegment*)&p->aE
7270: 76 65 6e 74 5b 6e 56 65 72 74 65 78 2a 32 5d 3b  vent[nVertex*2];
7280: 0a 20 20 70 2d 3e 6e 45 76 65 6e 74 20 3d 20 70  .  p->nEvent = p
7290: 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a  ->nSegment = 0;.
72a0: 20 20 67 65 6f 70 6f 6c 79 41 64 64 53 65 67 6d    geopolyAddSegm
72b0: 65 6e 74 73 28 70 2c 20 70 31 2c 20 31 29 3b 0a  ents(p, p1, 1);.
72c0: 20 20 67 65 6f 70 6f 6c 79 41 64 64 53 65 67 6d    geopolyAddSegm
72d0: 65 6e 74 73 28 70 2c 20 70 32 2c 20 32 29 3b 0a  ents(p, p2, 2);.
72e0: 20 20 70 54 68 69 73 45 76 65 6e 74 20 3d 20 67    pThisEvent = g
72f0: 65 6f 70 6f 6c 79 53 6f 72 74 45 76 65 6e 74 73  eopolySortEvents
7300: 42 79 58 28 70 2d 3e 61 45 76 65 6e 74 2c 20 70  ByX(p->aEvent, p
7310: 2d 3e 6e 45 76 65 6e 74 29 3b 0a 20 20 72 58 20  ->nEvent);.  rX 
7320: 3d 20 70 54 68 69 73 45 76 65 6e 74 2d 3e 78 3d  = pThisEvent->x=
7330: 3d 30 2e 30 20 3f 20 2d 31 2e 30 20 3a 20 30 2e  =0.0 ? -1.0 : 0.
7340: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 61 4f 76 65  0;.  memset(aOve
7350: 72 6c 61 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  rlap, 0, sizeof(
7360: 61 4f 76 65 72 6c 61 70 29 29 3b 0a 20 20 77 68  aOverlap));.  wh
7370: 69 6c 65 28 20 70 54 68 69 73 45 76 65 6e 74 20  ile( pThisEvent 
7380: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 68 69 73  ){.    if( pThis
7390: 45 76 65 6e 74 2d 3e 78 21 3d 72 58 20 29 7b 0a  Event->x!=rX ){.
73a0: 20 20 20 20 20 20 47 65 6f 53 65 67 6d 65 6e 74        GeoSegment
73b0: 20 2a 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20   *pPrev = 0;.   
73c0: 20 20 20 69 6e 74 20 69 4d 61 73 6b 20 3d 20 30     int iMask = 0
73d0: 3b 0a 20 20 20 20 20 20 47 45 4f 44 45 42 55 47  ;.      GEODEBUG
73e0: 28 28 22 44 69 73 74 69 6e 63 74 20 58 3a 20 25  (("Distinct X: %
73f0: 67 5c 6e 22 2c 20 70 54 68 69 73 45 76 65 6e 74  g\n", pThisEvent
7400: 2d 3e 78 29 29 3b 0a 20 20 20 20 20 20 72 58 20  ->x));.      rX 
7410: 3d 20 70 54 68 69 73 45 76 65 6e 74 2d 3e 78 3b  = pThisEvent->x;
7420: 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 53  .      if( needS
7430: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 47  ort ){.        G
7440: 45 4f 44 45 42 55 47 28 28 22 53 4f 52 54 5c 6e  EODEBUG(("SORT\n
7450: 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70 41 63  "));.        pAc
7460: 74 69 76 65 20 3d 20 67 65 6f 70 6f 6c 79 53 6f  tive = geopolySo
7470: 72 74 53 65 67 6d 65 6e 74 73 42 79 59 41 6e 64  rtSegmentsByYAnd
7480: 43 28 70 41 63 74 69 76 65 29 3b 0a 20 20 20 20  C(pActive);.    
7490: 20 20 20 20 6e 65 65 64 53 6f 72 74 20 3d 20 30      needSort = 0
74a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
74b0: 66 6f 72 28 70 53 65 67 3d 70 41 63 74 69 76 65  for(pSeg=pActive
74c0: 3b 20 70 53 65 67 3b 20 70 53 65 67 3d 70 53 65  ; pSeg; pSeg=pSe
74d0: 67 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  g->pNext){.     
74e0: 20 20 20 69 66 28 20 70 50 72 65 76 20 29 7b 0a     if( pPrev ){.
74f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
7500: 72 65 76 2d 3e 79 21 3d 70 53 65 67 2d 3e 79 20  rev->y!=pSeg->y 
7510: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 47  ){.            G
7520: 45 4f 44 45 42 55 47 28 28 22 4d 41 53 4b 3a 20  EODEBUG(("MASK: 
7530: 25 64 5c 6e 22 2c 20 69 4d 61 73 6b 29 29 3b 0a  %d\n", iMask));.
7540: 20 20 20 20 20 20 20 20 20 20 20 20 61 4f 76 65              aOve
7550: 72 6c 61 70 5b 69 4d 61 73 6b 5d 20 3d 20 31 3b  rlap[iMask] = 1;
7560: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7570: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
7580: 4d 61 73 6b 20 5e 3d 20 70 53 65 67 2d 3e 73 69  Mask ^= pSeg->si
7590: 64 65 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65  de;.        pPre
75a0: 76 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 20 20  v = pSeg;.      
75b0: 7d 0a 20 20 20 20 20 20 70 50 72 65 76 20 3d 20  }.      pPrev = 
75c0: 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 53 65  0;.      for(pSe
75d0: 67 3d 70 41 63 74 69 76 65 3b 20 70 53 65 67 3b  g=pActive; pSeg;
75e0: 20 70 53 65 67 3d 70 53 65 67 2d 3e 70 4e 65 78   pSeg=pSeg->pNex
75f0: 74 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62  t){.        doub
7600: 6c 65 20 79 20 3d 20 70 53 65 67 2d 3e 43 2a 72  le y = pSeg->C*r
7610: 58 20 2b 20 70 53 65 67 2d 3e 42 3b 0a 20 20 20  X + pSeg->B;.   
7620: 20 20 20 20 20 47 45 4f 44 45 42 55 47 28 28 22       GEODEBUG(("
7630: 53 65 67 6d 65 6e 74 20 25 64 2e 25 64 20 25 67  Segment %d.%d %g
7640: 2d 3e 25 67 5c 6e 22 2c 20 70 53 65 67 2d 3e 73  ->%g\n", pSeg->s
7650: 69 64 65 2c 20 70 53 65 67 2d 3e 69 64 78 2c 20  ide, pSeg->idx, 
7660: 70 53 65 67 2d 3e 79 2c 20 79 29 29 3b 0a 20 20  pSeg->y, y));.  
7670: 20 20 20 20 20 20 70 53 65 67 2d 3e 79 20 3d 20        pSeg->y = 
7680: 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  y;.        if( p
7690: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
76a0: 20 20 69 66 28 20 70 50 72 65 76 2d 3e 79 3e 70    if( pPrev->y>p
76b0: 53 65 67 2d 3e 79 20 26 26 20 70 50 72 65 76 2d  Seg->y && pPrev-
76c0: 3e 73 69 64 65 21 3d 70 53 65 67 2d 3e 73 69 64  >side!=pSeg->sid
76d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
76e0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
76f0: 20 20 20 20 20 47 45 4f 44 45 42 55 47 28 28 22       GEODEBUG(("
7700: 43 72 6f 73 73 69 6e 67 3a 20 25 64 2e 25 64 20  Crossing: %d.%d 
7710: 61 6e 64 20 25 64 2e 25 64 5c 6e 22 2c 0a 20 20  and %d.%d\n",.  
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 70 50 72 65 76 2d 3e 73 69 64 65 2c 20 70    pPrev->side, p
7740: 50 72 65 76 2d 3e 69 64 78 2c 0a 20 20 20 20 20  Prev->idx,.     
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
7760: 53 65 67 2d 3e 73 69 64 65 2c 20 70 53 65 67 2d  Seg->side, pSeg-
7770: 3e 69 64 78 29 29 3b 0a 20 20 20 20 20 20 20 20  >idx));.        
7780: 20 20 20 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79      goto geopoly
7790: 4f 76 65 72 6c 61 70 44 6f 6e 65 3b 0a 20 20 20  OverlapDone;.   
77a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
77b0: 20 70 50 72 65 76 2d 3e 79 21 3d 70 53 65 67 2d   pPrev->y!=pSeg-
77c0: 3e 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >y ){.          
77d0: 20 20 47 45 4f 44 45 42 55 47 28 28 22 4d 41 53    GEODEBUG(("MAS
77e0: 4b 3a 20 25 64 5c 6e 22 2c 20 69 4d 61 73 6b 29  K: %d\n", iMask)
77f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
7800: 4f 76 65 72 6c 61 70 5b 69 4d 61 73 6b 5d 20 3d  Overlap[iMask] =
7810: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
7820: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7830: 20 20 69 4d 61 73 6b 20 5e 3d 20 70 53 65 67 2d    iMask ^= pSeg-
7840: 3e 73 69 64 65 3b 0a 20 20 20 20 20 20 20 20 70  >side;.        p
7850: 50 72 65 76 20 3d 20 70 53 65 67 3b 0a 20 20 20  Prev = pSeg;.   
7860: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 47     }.    }.    G
7870: 45 4f 44 45 42 55 47 28 28 22 25 73 20 25 64 2e  EODEBUG(("%s %d.
7880: 25 64 20 43 3d 25 67 20 42 3d 25 67 5c 6e 22 2c  %d C=%g B=%g\n",
7890: 0a 20 20 20 20 20 20 70 54 68 69 73 45 76 65 6e  .      pThisEven
78a0: 74 2d 3e 65 54 79 70 65 20 3f 20 22 52 4d 20 22  t->eType ? "RM "
78b0: 20 3a 20 22 41 44 44 22 2c 0a 20 20 20 20 20 20   : "ADD",.      
78c0: 70 54 68 69 73 45 76 65 6e 74 2d 3e 70 53 65 67  pThisEvent->pSeg
78d0: 2d 3e 73 69 64 65 2c 20 70 54 68 69 73 45 76 65  ->side, pThisEve
78e0: 6e 74 2d 3e 70 53 65 67 2d 3e 69 64 78 2c 0a 20  nt->pSeg->idx,. 
78f0: 20 20 20 20 20 70 54 68 69 73 45 76 65 6e 74 2d       pThisEvent-
7900: 3e 70 53 65 67 2d 3e 43 2c 0a 20 20 20 20 20 20  >pSeg->C,.      
7910: 70 54 68 69 73 45 76 65 6e 74 2d 3e 70 53 65 67  pThisEvent->pSeg
7920: 2d 3e 42 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ->B));.    if( p
7930: 54 68 69 73 45 76 65 6e 74 2d 3e 65 54 79 70 65  ThisEvent->eType
7940: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
7950: 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20 2a 2f  Add a segment */
7960: 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 70 54  .      pSeg = pT
7970: 68 69 73 45 76 65 6e 74 2d 3e 70 53 65 67 3b 0a  hisEvent->pSeg;.
7980: 20 20 20 20 20 20 70 53 65 67 2d 3e 79 20 3d 20        pSeg->y = 
7990: 70 53 65 67 2d 3e 79 30 3b 0a 20 20 20 20 20 20  pSeg->y0;.      
79a0: 70 53 65 67 2d 3e 70 4e 65 78 74 20 3d 20 70 41  pSeg->pNext = pA
79b0: 63 74 69 76 65 3b 0a 20 20 20 20 20 20 70 41 63  ctive;.      pAc
79c0: 74 69 76 65 20 3d 20 70 53 65 67 3b 0a 20 20 20  tive = pSeg;.   
79d0: 20 20 20 6e 65 65 64 53 6f 72 74 20 3d 20 31 3b     needSort = 1;
79e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
79f0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 20 73 65    /* Remove a se
7a00: 67 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  gment */.      i
7a10: 66 28 20 70 41 63 74 69 76 65 3d 3d 70 54 68 69  f( pActive==pThi
7a20: 73 45 76 65 6e 74 2d 3e 70 53 65 67 20 29 7b 0a  sEvent->pSeg ){.
7a30: 20 20 20 20 20 20 20 20 70 41 63 74 69 76 65 20          pActive 
7a40: 3d 20 70 41 63 74 69 76 65 2d 3e 70 4e 65 78 74  = pActive->pNext
7a50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7a60: 20 20 20 20 20 20 20 66 6f 72 28 70 53 65 67 3d         for(pSeg=
7a70: 70 41 63 74 69 76 65 3b 20 70 53 65 67 3b 20 70  pActive; pSeg; p
7a80: 53 65 67 3d 70 53 65 67 2d 3e 70 4e 65 78 74 29  Seg=pSeg->pNext)
7a90: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
7aa0: 70 53 65 67 2d 3e 70 4e 65 78 74 3d 3d 70 54 68  pSeg->pNext==pTh
7ab0: 69 73 45 76 65 6e 74 2d 3e 70 53 65 67 20 29 7b  isEvent->pSeg ){
7ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 65  .            pSe
7ad0: 67 2d 3e 70 4e 65 78 74 20 3d 20 70 53 65 67 2d  g->pNext = pSeg-
7ae0: 3e 70 4e 65 78 74 2d 3e 70 4e 65 78 74 3b 0a 20  >pNext->pNext;. 
7af0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
7b00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
7b10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7b20: 20 20 20 20 7d 0a 20 20 20 20 70 54 68 69 73 45      }.    pThisE
7b30: 76 65 6e 74 20 3d 20 70 54 68 69 73 45 76 65 6e  vent = pThisEven
7b40: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  t->pNext;.  }.  
7b50: 69 66 28 20 61 4f 76 65 72 6c 61 70 5b 33 5d 3d  if( aOverlap[3]=
7b60: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  =0 ){.    rc = 0
7b70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 4f  ;.  }else if( aO
7b80: 76 65 72 6c 61 70 5b 31 5d 21 3d 30 20 26 26 20  verlap[1]!=0 && 
7b90: 61 4f 76 65 72 6c 61 70 5b 32 5d 3d 3d 30 20 29  aOverlap[2]==0 )
7ba0: 7b 0a 20 20 20 20 72 63 20 3d 20 33 3b 0a 20 20  {.    rc = 3;.  
7bb0: 7d 65 6c 73 65 20 69 66 28 20 61 4f 76 65 72 6c  }else if( aOverl
7bc0: 61 70 5b 31 5d 3d 3d 30 20 26 26 20 61 4f 76 65  ap[1]==0 && aOve
7bd0: 72 6c 61 70 5b 32 5d 21 3d 30 20 29 7b 0a 20 20  rlap[2]!=0 ){.  
7be0: 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73    rc = 2;.  }els
7bf0: 65 20 69 66 28 20 61 4f 76 65 72 6c 61 70 5b 31  e if( aOverlap[1
7c00: 5d 3d 3d 30 20 26 26 20 61 4f 76 65 72 6c 61 70  ]==0 && aOverlap
7c10: 5b 32 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  [2]==0 ){.    rc
7c20: 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 4;.  }else{. 
7c30: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 0a     rc = 1;.  }..
7c40: 67 65 6f 70 6f 6c 79 4f 76 65 72 6c 61 70 44 6f  geopolyOverlapDo
7c50: 6e 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ne:.  sqlite3_fr
7c60: 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
7c70: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  rc;.}../*.** SQL
7c80: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 20 67 65   function:    ge
7c90: 6f 70 6f 6c 79 5f 6f 76 65 72 6c 61 70 28 50 31  opoly_overlap(P1
7ca0: 2c 50 32 29 0a 2a 2a 0a 2a 2a 20 44 65 74 65 72  ,P2).**.** Deter
7cb0: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
7cc0: 6e 6f 74 20 50 31 20 61 6e 64 20 50 32 20 6f 76  not P1 and P2 ov
7cd0: 65 72 6c 61 70 2e 20 52 65 74 75 72 6e 20 76 61  erlap. Return va
7ce0: 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 20 20  lue:.**.**   0  
7cf0: 20 20 20 54 68 65 20 74 77 6f 20 70 6f 6c 79 67     The two polyg
7d00: 6f 6e 73 20 61 72 65 20 64 69 73 6a 6f 69 6e 74  ons are disjoint
7d10: 0a 2a 2a 20 20 20 31 20 20 20 20 20 54 68 65 79  .**   1     They
7d20: 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 32 20   overlap.**   2 
7d30: 20 20 20 20 50 31 20 69 73 20 63 6f 6d 70 6c 65      P1 is comple
7d40: 74 65 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 77  tely contained w
7d50: 69 74 68 69 6e 20 50 32 0a 2a 2a 20 20 20 33 20  ithin P2.**   3 
7d60: 20 20 20 20 50 32 20 69 73 20 63 6f 6d 70 6c 65      P2 is comple
7d70: 74 65 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 77  tely contained w
7d80: 69 74 68 69 6e 20 50 31 0a 2a 2a 20 20 20 34 20  ithin P1.**   4 
7d90: 20 20 20 20 50 31 20 61 6e 64 20 50 32 20 61 72      P1 and P2 ar
7da0: 65 20 74 68 65 20 73 61 6d 65 20 70 6f 6c 79 67  e the same polyg
7db0: 6f 6e 0a 2a 2a 20 20 20 4e 55 4c 4c 20 20 45 69  on.**   NULL  Ei
7dc0: 74 68 65 72 20 50 31 20 6f 72 20 50 32 20 6f 72  ther P1 or P2 or
7dd0: 20 62 6f 74 68 20 61 72 65 20 6e 6f 74 20 76 61   both are not va
7de0: 6c 69 64 20 70 6f 6c 79 67 6f 6e 73 0a 2a 2f 0a  lid polygons.*/.
7df0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f 70  static void geop
7e00: 6f 6c 79 4f 76 65 72 6c 61 70 46 75 6e 63 28 0a  olyOverlapFunc(.
7e10: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
7e20: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
7e30: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
7e40: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
7e50: 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 31 20  {.  GeoPoly *p1 
7e60: 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72  = geopolyFuncPar
7e70: 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  am(context, argv
7e80: 5b 30 5d 2c 20 30 29 3b 0a 20 20 47 65 6f 50 6f  [0], 0);.  GeoPo
7e90: 6c 79 20 2a 70 32 20 3d 20 67 65 6f 70 6f 6c 79  ly *p2 = geopoly
7ea0: 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78  FuncParam(contex
7eb0: 74 2c 20 61 72 67 76 5b 31 5d 2c 20 30 29 3b 0a  t, argv[1], 0);.
7ec0: 20 20 69 66 28 20 70 31 20 26 26 20 70 32 20 29    if( p1 && p2 )
7ed0: 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 67 65  {.    int x = ge
7ee0: 6f 70 6f 6c 79 4f 76 65 72 6c 61 70 28 70 31 2c  opolyOverlap(p1,
7ef0: 20 70 32 29 3b 0a 20 20 20 20 69 66 28 20 78 3c   p2);.    if( x<
7f00: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
7f10: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
7f20: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
7f30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7f40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7f50: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 78 29 3b  int(context, x);
7f60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
7f70: 69 74 65 33 5f 66 72 65 65 28 70 31 29 3b 0a 20  ite3_free(p1);. 
7f80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 32   sqlite3_free(p2
7f90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  );.}../*.** Enab
7fa0: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 64 65  le or disable de
7fb0: 62 75 67 67 69 6e 67 20 6f 75 74 70 75 74 0a 2a  bugging output.*
7fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
7fd0: 6f 70 6f 6c 79 44 65 62 75 67 46 75 6e 63 28 0a  opolyDebugFunc(.
7fe0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
7ff0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
8000: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
8010: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
8020: 7b 0a 23 69 66 64 65 66 20 47 45 4f 50 4f 4c 59  {.#ifdef GEOPOLY
8030: 5f 45 4e 41 42 4c 45 5f 44 45 42 55 47 0a 20 20  _ENABLE_DEBUG.  
8040: 67 65 6f 5f 64 65 62 75 67 20 3d 20 73 71 6c 69  geo_debug = sqli
8050: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
8060: 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 7d  gv[0]);.#endif.}
8070: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  ../* .** This fu
8080: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d  nction is the im
8090: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
80a0: 62 6f 74 68 20 74 68 65 20 78 43 6f 6e 6e 65 63  both the xConnec
80b0: 74 20 61 6e 64 20 78 43 72 65 61 74 65 0a 2a 2a  t and xCreate.**
80c0: 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
80d0: 67 65 6f 70 6f 6c 79 20 76 69 72 74 75 61 6c 20  geopoly virtual 
80e0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 61  table..**.**   a
80f0: 72 67 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64 75  rgv[0]   -> modu
8100: 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67  le name.**   arg
8110: 76 5b 31 5d 20 20 20 2d 3e 20 64 61 74 61 62 61  v[1]   -> databa
8120: 73 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67  se name.**   arg
8130: 76 5b 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20  v[2]   -> table 
8140: 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 2e  name.**   argv[.
8150: 2e 2e 5d 20 2d 3e 20 63 6f 6c 75 6d 6e 20 6e 61  ..] -> column na
8160: 6d 65 73 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  mes....*/.static
8170: 20 69 6e 74 20 67 65 6f 70 6f 6c 79 49 6e 69 74   int geopolyInit
8180: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
81b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
81c0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 20  /.  void *pAux, 
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
81f0: 66 20 74 68 65 20 52 54 52 45 45 5f 43 4f 4f 52  f the RTREE_COOR
8200: 44 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  D_* constants */
8210: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  .  int argc, con
8220: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
8230: 72 67 76 2c 20 20 20 2f 2a 20 50 61 72 61 6d 65  rgv,   /* Parame
8240: 74 65 72 73 20 74 6f 20 43 52 45 41 54 45 20 54  ters to CREATE T
8250: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
8260: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  /.  sqlite3_vtab
8270: 20 2a 2a 70 70 56 74 61 62 2c 20 20 20 20 20 20   **ppVtab,      
8280: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8290: 4e 65 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c  New virtual tabl
82a0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
82b0: 45 72 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Err,            
82c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
82d0: 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  T: Error message
82e0: 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  , if any */.  in
82f0: 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 20  t isCreate      
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 78 43    /* True for xC
8320: 72 65 61 74 65 2c 20 66 61 6c 73 65 20 66 6f 72  reate, false for
8330: 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 29 7b 0a   xConnect */.){.
8340: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8350: 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 20 2a 70  E_OK;.  Rtree *p
8360: 52 74 72 65 65 3b 0a 20 20 73 71 6c 69 74 65 33  Rtree;.  sqlite3
8370: 5f 69 6e 74 36 34 20 6e 44 62 3b 20 20 20 20 20  _int64 nDb;     
8380: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
8390: 74 68 20 6f 66 20 73 74 72 69 6e 67 20 61 72 67  th of string arg
83a0: 76 5b 31 5d 20 2a 2f 0a 20 20 73 71 6c 69 74 65  v[1] */.  sqlite
83b0: 33 5f 69 6e 74 36 34 20 6e 4e 61 6d 65 3b 20 20  3_int64 nName;  
83c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
83d0: 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 61 72  gth of string ar
83e0: 67 76 5b 32 5d 20 2a 2f 0a 20 20 73 71 6c 69 74  gv[2] */.  sqlit
83f0: 65 33 5f 73 74 72 20 2a 70 53 71 6c 3b 0a 20 20  e3_str *pSql;.  
8400: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
8410: 74 20 69 69 3b 0a 0a 20 20 73 71 6c 69 74 65 33  t ii;..  sqlite3
8420: 5f 76 74 61 62 5f 63 6f 6e 66 69 67 28 64 62 2c  _vtab_config(db,
8430: 20 53 51 4c 49 54 45 5f 56 54 41 42 5f 43 4f 4e   SQLITE_VTAB_CON
8440: 53 54 52 41 49 4e 54 5f 53 55 50 50 4f 52 54 2c  STRAINT_SUPPORT,
8450: 20 31 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63   1);..  /* Alloc
8460: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
8470: 76 74 61 62 20 73 74 72 75 63 74 75 72 65 20 2a  vtab structure *
8480: 2f 0a 20 20 6e 44 62 20 3d 20 73 74 72 6c 65 6e  /.  nDb = strlen
8490: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 6e 4e 61  (argv[1]);.  nNa
84a0: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 61 72 67 76  me = strlen(argv
84b0: 5b 32 5d 29 3b 0a 20 20 70 52 74 72 65 65 20 3d  [2]);.  pRtree =
84c0: 20 28 52 74 72 65 65 20 2a 29 73 71 6c 69 74 65   (Rtree *)sqlite
84d0: 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f  3_malloc64(sizeo
84e0: 66 28 52 74 72 65 65 29 2b 6e 44 62 2b 6e 4e 61  f(Rtree)+nDb+nNa
84f0: 6d 65 2b 32 29 3b 0a 20 20 69 66 28 20 21 70 52  me+2);.  if( !pR
8500: 74 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75  tree ){.    retu
8510: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
8520: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 52  .  }.  memset(pR
8530: 74 72 65 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  tree, 0, sizeof(
8540: 52 74 72 65 65 29 2b 6e 44 62 2b 6e 4e 61 6d 65  Rtree)+nDb+nName
8550: 2b 32 29 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e  +2);.  pRtree->n
8560: 42 75 73 79 20 3d 20 31 3b 0a 20 20 70 52 74 72  Busy = 1;.  pRtr
8570: 65 65 2d 3e 62 61 73 65 2e 70 4d 6f 64 75 6c 65  ee->base.pModule
8580: 20 3d 20 26 72 74 72 65 65 4d 6f 64 75 6c 65 3b   = &rtreeModule;
8590: 0a 20 20 70 52 74 72 65 65 2d 3e 7a 44 62 20 3d  .  pRtree->zDb =
85a0: 20 28 63 68 61 72 20 2a 29 26 70 52 74 72 65 65   (char *)&pRtree
85b0: 5b 31 5d 3b 0a 20 20 70 52 74 72 65 65 2d 3e 7a  [1];.  pRtree->z
85c0: 4e 61 6d 65 20 3d 20 26 70 52 74 72 65 65 2d 3e  Name = &pRtree->
85d0: 7a 44 62 5b 6e 44 62 2b 31 5d 3b 0a 20 20 70 52  zDb[nDb+1];.  pR
85e0: 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65  tree->eCoordType
85f0: 20 3d 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f 52   = RTREE_COORD_R
8600: 45 41 4c 33 32 3b 0a 20 20 70 52 74 72 65 65 2d  EAL32;.  pRtree-
8610: 3e 6e 44 69 6d 20 3d 20 32 3b 0a 20 20 70 52 74  >nDim = 2;.  pRt
8620: 72 65 65 2d 3e 6e 44 69 6d 32 20 3d 20 34 3b 0a  ree->nDim2 = 4;.
8630: 20 20 6d 65 6d 63 70 79 28 70 52 74 72 65 65 2d    memcpy(pRtree-
8640: 3e 7a 44 62 2c 20 61 72 67 76 5b 31 5d 2c 20 6e  >zDb, argv[1], n
8650: 44 62 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 52  Db);.  memcpy(pR
8660: 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20 61 72 67  tree->zName, arg
8670: 76 5b 32 5d 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 0a  v[2], nName);...
8680: 20 20 2f 2a 20 43 72 65 61 74 65 2f 43 6f 6e 6e    /* Create/Conn
8690: 65 63 74 20 74 6f 20 74 68 65 20 75 6e 64 65 72  ect to the under
86a0: 6c 79 69 6e 67 20 72 65 6c 61 74 69 6f 6e 61 6c  lying relational
86b0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
86c0: 2e 20 49 66 0a 20 20 2a 2a 20 74 68 61 74 20 69  . If.  ** that i
86d0: 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 61  s successful, ca
86e0: 6c 6c 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  ll sqlite3_decla
86f0: 72 65 5f 76 74 61 62 28 29 20 74 6f 20 63 6f 6e  re_vtab() to con
8700: 66 69 67 75 72 65 0a 20 20 2a 2a 20 74 68 65 20  figure.  ** the 
8710: 72 2d 74 72 65 65 20 74 61 62 6c 65 20 73 63 68  r-tree table sch
8720: 65 6d 61 2e 0a 20 20 2a 2f 0a 20 20 70 53 71 6c  ema..  */.  pSql
8730: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 6e   = sqlite3_str_n
8740: 65 77 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ew(db);.  sqlite
8750: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 53  3_str_appendf(pS
8760: 71 6c 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  ql, "CREATE TABL
8770: 45 20 78 28 5f 73 68 61 70 65 22 29 3b 0a 20 20  E x(_shape");.  
8780: 70 52 74 72 65 65 2d 3e 6e 41 75 78 20 3d 20 31  pRtree->nAux = 1
8790: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
87a0: 20 6f 6e 65 20 66 6f 72 20 5f 73 68 61 70 65 20   one for _shape 
87b0: 2a 2f 0a 20 20 70 52 74 72 65 65 2d 3e 6e 41 75  */.  pRtree->nAu
87c0: 78 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 20 20 2f  xNotNull = 1;  /
87d0: 2a 20 54 68 65 20 5f 73 68 61 70 65 20 63 6f 6c  * The _shape col
87e0: 75 6d 6e 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  umn is always no
87f0: 74 2d 6e 75 6c 6c 20 2a 2f 0a 20 20 66 6f 72 28  t-null */.  for(
8800: 69 69 3d 33 3b 20 69 69 3c 61 72 67 63 3b 20 69  ii=3; ii<argc; i
8810: 69 2b 2b 29 7b 0a 20 20 20 20 70 52 74 72 65 65  i++){.    pRtree
8820: 2d 3e 6e 41 75 78 2b 2b 3b 0a 20 20 20 20 73 71  ->nAux++;.    sq
8830: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
8840: 66 28 70 53 71 6c 2c 20 22 2c 25 73 22 2c 20 61  f(pSql, ",%s", a
8850: 72 67 76 5b 69 69 5d 29 3b 0a 20 20 7d 0a 20 20  rgv[ii]);.  }.  
8860: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
8870: 6e 64 66 28 70 53 71 6c 2c 20 22 29 3b 22 29 3b  ndf(pSql, ");");
8880: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
8890: 33 5f 73 74 72 5f 66 69 6e 69 73 68 28 70 53 71  3_str_finish(pSq
88a0: 6c 29 3b 0a 20 20 69 66 28 20 21 7a 53 71 6c 20  l);.  if( !zSql 
88b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
88c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
88d0: 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21  e if( SQLITE_OK!
88e0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64  =(rc = sqlite3_d
88f0: 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20  eclare_vtab(db, 
8900: 7a 53 71 6c 29 29 20 29 7b 0a 20 20 20 20 2a 70  zSql)) ){.    *p
8910: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
8920: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
8930: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
8940: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
8950: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66  free(zSql);.  if
8960: 28 20 72 63 20 29 20 67 6f 74 6f 20 67 65 6f 70  ( rc ) goto geop
8970: 6f 6c 79 49 6e 69 74 5f 66 61 69 6c 3b 0a 20 20  olyInit_fail;.  
8980: 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65  pRtree->nBytesPe
8990: 72 43 65 6c 6c 20 3d 20 38 20 2b 20 70 52 74 72  rCell = 8 + pRtr
89a0: 65 65 2d 3e 6e 44 69 6d 32 2a 34 3b 0a 0a 20 20  ee->nDim2*4;..  
89b0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
89c0: 65 20 6e 6f 64 65 20 73 69 7a 65 20 74 6f 20 75  e node size to u
89d0: 73 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 67 65  se. */.  rc = ge
89e0: 74 4e 6f 64 65 53 69 7a 65 28 64 62 2c 20 70 52  tNodeSize(db, pR
89f0: 74 72 65 65 2c 20 69 73 43 72 65 61 74 65 2c 20  tree, isCreate, 
8a00: 70 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72 63  pzErr);.  if( rc
8a10: 20 29 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79 49   ) goto geopolyI
8a20: 6e 69 74 5f 66 61 69 6c 3b 0a 20 20 72 63 20 3d  nit_fail;.  rc =
8a30: 20 72 74 72 65 65 53 71 6c 49 6e 69 74 28 70 52   rtreeSqlInit(pR
8a40: 74 72 65 65 2c 20 64 62 2c 20 61 72 67 76 5b 31  tree, db, argv[1
8a50: 5d 2c 20 61 72 67 76 5b 32 5d 2c 20 69 73 43 72  ], argv[2], isCr
8a60: 65 61 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20  eate);.  if( rc 
8a70: 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20  ){.    *pzErr = 
8a80: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8a90: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
8aa0: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 67  rmsg(db));.    g
8ab0: 6f 74 6f 20 67 65 6f 70 6f 6c 79 49 6e 69 74 5f  oto geopolyInit_
8ac0: 66 61 69 6c 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  fail;.  }..  *pp
8ad0: 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f  Vtab = (sqlite3_
8ae0: 76 74 61 62 20 2a 29 70 52 74 72 65 65 3b 0a 20  vtab *)pRtree;. 
8af0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8b00: 4b 3b 0a 0a 67 65 6f 70 6f 6c 79 49 6e 69 74 5f  K;..geopolyInit_
8b10: 66 61 69 6c 3a 0a 20 20 69 66 28 20 72 63 3d 3d  fail:.  if( rc==
8b20: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
8b30: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
8b40: 20 61 73 73 65 72 74 28 20 2a 70 70 56 74 61 62   assert( *ppVtab
8b50: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8b60: 20 70 52 74 72 65 65 2d 3e 6e 42 75 73 79 3d 3d   pRtree->nBusy==
8b70: 31 20 29 3b 0a 20 20 72 74 72 65 65 52 65 6c 65  1 );.  rtreeRele
8b80: 61 73 65 28 70 52 74 72 65 65 29 3b 0a 20 20 72  ase(pRtree);.  r
8b90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
8ba0: 20 0a 2a 2a 20 47 45 4f 50 4f 4c 59 20 76 69 72   .** GEOPOLY vir
8bb0: 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
8bc0: 65 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64  e xCreate method
8bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8be0: 67 65 6f 70 6f 6c 79 43 72 65 61 74 65 28 0a 20  geopolyCreate(. 
8bf0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
8c00: 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e  void *pAux,.  in
8c10: 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
8c20: 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a  ar *const*argv,.
8c30: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
8c40: 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20  *ppVtab,.  char 
8c50: 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74  **pzErr.){.  ret
8c60: 75 72 6e 20 67 65 6f 70 6f 6c 79 49 6e 69 74 28  urn geopolyInit(
8c70: 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20  db, pAux, argc, 
8c80: 61 72 67 76 2c 20 70 70 56 74 61 62 2c 20 70 7a  argv, ppVtab, pz
8c90: 45 72 72 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a  Err, 1);.}../* .
8ca0: 2a 2a 20 47 45 4f 50 4f 4c 59 20 76 69 72 74 75  ** GEOPOLY virtu
8cb0: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
8cc0: 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e  xConnect method.
8cd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
8ce0: 65 6f 70 6f 6c 79 43 6f 6e 6e 65 63 74 28 0a 20  eopolyConnect(. 
8cf0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
8d00: 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e  void *pAux,.  in
8d10: 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
8d20: 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a  ar *const*argv,.
8d30: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
8d40: 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20  *ppVtab,.  char 
8d50: 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74  **pzErr.){.  ret
8d60: 75 72 6e 20 67 65 6f 70 6f 6c 79 49 6e 69 74 28  urn geopolyInit(
8d70: 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20  db, pAux, argc, 
8d80: 61 72 67 76 2c 20 70 70 56 74 61 62 2c 20 70 7a  argv, ppVtab, pz
8d90: 45 72 72 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 20  Err, 0);.}.../* 
8da0: 0a 2a 2a 20 47 45 4f 50 4f 4c 59 20 76 69 72 74  .** GEOPOLY virt
8db0: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
8dc0: 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e   xFilter method.
8dd0: 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 70 6c 61  .**.** Query pla
8de0: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31  ns:.**.**      1
8df0: 20 20 20 20 20 20 20 20 20 72 6f 77 69 64 20 6c           rowid l
8e00: 6f 6f 6b 75 70 0a 2a 2a 20 20 20 20 20 20 32 20  ookup.**      2 
8e10: 20 20 20 20 20 20 20 20 73 65 61 72 63 68 20 66          search f
8e20: 6f 72 20 6f 62 6a 65 63 74 73 20 6f 76 65 72 6c  or objects overl
8e30: 61 70 70 69 6e 67 20 74 68 65 20 73 61 6d 65 20  apping the same 
8e40: 62 6f 75 6e 64 69 6e 67 20 62 6f 78 0a 2a 2a 20  bounding box.** 
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
8e60: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 6f 6c  hat contains pol
8e70: 79 67 6f 6e 20 61 72 67 76 5b 30 5d 0a 2a 2a 20  ygon argv[0].** 
8e80: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 73       3         s
8e90: 65 61 72 63 68 20 66 6f 72 20 6f 62 6a 65 63 74  earch for object
8ea0: 73 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 74 68  s overlapping th
8eb0: 65 20 73 61 6d 65 20 62 6f 75 6e 64 69 6e 67 20  e same bounding 
8ec0: 62 6f 78 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  box.**          
8ed0: 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61        that conta
8ee0: 69 6e 73 20 70 6f 6c 79 67 6f 6e 20 61 72 67 76  ins polygon argv
8ef0: 5b 30 5d 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  [0].**      4   
8f00: 20 20 20 20 20 20 66 75 6c 6c 20 74 61 62 6c 65        full table
8f10: 20 73 63 61 6e 0a 2a 2f 0a 73 74 61 74 69 63 20   scan.*/.static 
8f20: 69 6e 74 20 67 65 6f 70 6f 6c 79 46 69 6c 74 65  int geopolyFilte
8f30: 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  r(.  sqlite3_vta
8f40: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
8f50: 75 72 73 6f 72 2c 20 20 20 20 20 2f 2a 20 54 68  ursor,     /* Th
8f60: 65 20 63 75 72 73 6f 72 20 74 6f 20 69 6e 69 74  e cursor to init
8f70: 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20  ialize */.  int 
8f80: 69 64 78 4e 75 6d 2c 20 20 20 20 20 20 20 20 20  idxNum,         
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fa0: 20 20 2f 2a 20 51 75 65 72 79 20 70 6c 61 6e 20    /* Query plan 
8fb0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8fc0: 2a 69 64 78 53 74 72 2c 20 20 20 20 20 20 20 20  *idxStr,        
8fd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
8fe0: 74 20 55 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  t Used */.  int 
8ff0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
9000: 6c 75 65 20 2a 2a 61 72 67 76 20 20 20 20 20 20  lue **argv      
9010: 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 73 20    /* Parameters 
9020: 74 6f 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  to the query pla
9030: 6e 20 2a 2f 0a 29 7b 0a 20 20 52 74 72 65 65 20  n */.){.  Rtree 
9040: 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65  *pRtree = (Rtree
9050: 20 2a 29 70 56 74 61 62 43 75 72 73 6f 72 2d 3e   *)pVtabCursor->
9060: 70 56 74 61 62 3b 0a 20 20 52 74 72 65 65 43 75  pVtab;.  RtreeCu
9070: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 52 74  rsor *pCsr = (Rt
9080: 72 65 65 43 75 72 73 6f 72 20 2a 29 70 56 74 61  reeCursor *)pVta
9090: 62 43 75 72 73 6f 72 3b 0a 20 20 52 74 72 65 65  bCursor;.  Rtree
90a0: 4e 6f 64 65 20 2a 70 52 6f 6f 74 20 3d 20 30 3b  Node *pRoot = 0;
90b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
90c0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 65  TE_OK;.  int iCe
90d0: 6c 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ll = 0;.  sqlite
90e0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
90f0: 20 20 72 74 72 65 65 52 65 66 65 72 65 6e 63 65    rtreeReference
9100: 28 70 52 74 72 65 65 29 3b 0a 0a 20 20 2f 2a 20  (pRtree);..  /* 
9110: 52 65 73 65 74 20 74 68 65 20 63 75 72 73 6f 72  Reset the cursor
9120: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 74 61   to the same sta
9130: 74 65 20 61 73 20 72 74 72 65 65 4f 70 65 6e 28  te as rtreeOpen(
9140: 29 20 6c 65 61 76 65 73 20 69 74 20 69 6e 2e 20  ) leaves it in. 
9150: 2a 2f 0a 20 20 66 72 65 65 43 75 72 73 6f 72 43  */.  freeCursorC
9160: 6f 6e 73 74 72 61 69 6e 74 73 28 70 43 73 72 29  onstraints(pCsr)
9170: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9180: 28 70 43 73 72 2d 3e 61 50 6f 69 6e 74 29 3b 0a  (pCsr->aPoint);.
9190: 20 20 70 53 74 6d 74 20 3d 20 70 43 73 72 2d 3e    pStmt = pCsr->
91a0: 70 52 65 61 64 41 75 78 3b 0a 20 20 6d 65 6d 73  pReadAux;.  mems
91b0: 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65  et(pCsr, 0, size
91c0: 6f 66 28 52 74 72 65 65 43 75 72 73 6f 72 29 29  of(RtreeCursor))
91d0: 3b 0a 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70  ;.  pCsr->base.p
91e0: 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f  Vtab = (sqlite3_
91f0: 76 74 61 62 2a 29 70 52 74 72 65 65 3b 0a 20 20  vtab*)pRtree;.  
9200: 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78 20 3d  pCsr->pReadAux =
9210: 20 70 53 74 6d 74 3b 0a 0a 20 20 70 43 73 72 2d   pStmt;..  pCsr-
9220: 3e 69 53 74 72 61 74 65 67 79 20 3d 20 69 64 78  >iStrategy = idx
9230: 4e 75 6d 3b 0a 20 20 69 66 28 20 69 64 78 4e 75  Num;.  if( idxNu
9240: 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53  m==1 ){.    /* S
9250: 70 65 63 69 61 6c 20 63 61 73 65 20 2d 20 6c 6f  pecial case - lo
9260: 6f 6b 75 70 20 62 79 20 72 6f 77 69 64 2e 20 2a  okup by rowid. *
9270: 2f 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20  /.    RtreeNode 
9280: 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 2f  *pLeaf;        /
9290: 2a 20 4c 65 61 66 20 6f 6e 20 77 68 69 63 68 20  * Leaf on which 
92a0: 74 68 65 20 72 65 71 75 69 72 65 64 20 63 65 6c  the required cel
92b0: 6c 20 72 65 73 69 64 65 73 20 2a 2f 0a 20 20 20  l resides */.   
92c0: 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   RtreeSearchPoin
92d0: 74 20 2a 70 3b 20 20 20 20 20 2f 2a 20 53 65 61  t *p;     /* Sea
92e0: 72 63 68 20 70 6f 69 6e 74 20 66 6f 72 20 74 68  rch point for th
92f0: 65 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 36  e leaf */.    i6
9300: 34 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  4 iRowid = sqlit
9310: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
9320: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 36 34  rgv[0]);.    i64
9330: 20 69 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20   iNode = 0;.    
9340: 72 63 20 3d 20 66 69 6e 64 4c 65 61 66 4e 6f 64  rc = findLeafNod
9350: 65 28 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64  e(pRtree, iRowid
9360: 2c 20 26 70 4c 65 61 66 2c 20 26 69 4e 6f 64 65  , &pLeaf, &iNode
9370: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
9380: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 65 61  QLITE_OK && pLea
9390: 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 20  f!=0 ){.      p 
93a0: 3d 20 72 74 72 65 65 53 65 61 72 63 68 50 6f 69  = rtreeSearchPoi
93b0: 6e 74 4e 65 77 28 70 43 73 72 2c 20 52 54 52 45  ntNew(pCsr, RTRE
93c0: 45 5f 5a 45 52 4f 2c 20 30 29 3b 0a 20 20 20 20  E_ZERO, 0);.    
93d0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
93e0: 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 72 65 74  ;  /* Always ret
93f0: 75 72 6e 73 20 70 43 73 72 2d 3e 73 50 6f 69 6e  urns pCsr->sPoin
9400: 74 20 2a 2f 0a 20 20 20 20 20 20 70 43 73 72 2d  t */.      pCsr-
9410: 3e 61 4e 6f 64 65 5b 30 5d 20 3d 20 70 4c 65 61  >aNode[0] = pLea
9420: 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69 64 20 3d  f;.      p->id =
9430: 20 69 4e 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d   iNode;.      p-
9440: 3e 65 57 69 74 68 69 6e 20 3d 20 50 41 52 54 4c  >eWithin = PARTL
9450: 59 5f 57 49 54 48 49 4e 3b 0a 20 20 20 20 20 20  Y_WITHIN;.      
9460: 72 63 20 3d 20 6e 6f 64 65 52 6f 77 69 64 49 6e  rc = nodeRowidIn
9470: 64 65 78 28 70 52 74 72 65 65 2c 20 70 4c 65 61  dex(pRtree, pLea
9480: 66 2c 20 69 52 6f 77 69 64 2c 20 26 69 43 65 6c  f, iRowid, &iCel
9490: 6c 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 65  l);.      p->iCe
94a0: 6c 6c 20 3d 20 28 75 38 29 69 43 65 6c 6c 3b 0a  ll = (u8)iCell;.
94b0: 20 20 20 20 20 20 52 54 52 45 45 5f 51 55 45 55        RTREE_QUEU
94c0: 45 5f 54 52 41 43 45 28 70 43 73 72 2c 20 22 50  E_TRACE(pCsr, "P
94d0: 55 53 48 2d 46 31 3a 22 29 3b 0a 20 20 20 20 7d  USH-F1:");.    }
94e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 73 72  else{.      pCsr
94f0: 2d 3e 61 74 45 4f 46 20 3d 20 31 3b 0a 20 20 20  ->atEOF = 1;.   
9500: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
9510: 2f 2a 20 4e 6f 72 6d 61 6c 20 63 61 73 65 20 2d  /* Normal case -
9520: 20 72 2d 74 72 65 65 20 73 63 61 6e 2e 20 53 65   r-tree scan. Se
9530: 74 20 75 70 20 74 68 65 20 52 74 72 65 65 43 75  t up the RtreeCu
9540: 72 73 6f 72 2e 61 43 6f 6e 73 74 72 61 69 6e 74  rsor.aConstraint
9550: 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 77   array .    ** w
9560: 69 74 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ith the configur
9570: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ed constraints. 
9580: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
9590: 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70 52 74   nodeAcquire(pRt
95a0: 72 65 65 2c 20 31 2c 20 30 2c 20 26 70 52 6f 6f  ree, 1, 0, &pRoo
95b0: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
95c0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 64 78  SQLITE_OK && idx
95d0: 4e 75 6d 3c 3d 33 20 29 7b 0a 20 20 20 20 20 20  Num<=3 ){.      
95e0: 52 74 72 65 65 43 6f 6f 72 64 20 62 62 6f 78 5b  RtreeCoord bbox[
95f0: 34 5d 3b 0a 20 20 20 20 20 20 52 74 72 65 65 43  4];.      RtreeC
9600: 6f 6e 73 74 72 61 69 6e 74 20 2a 70 3b 0a 20 20  onstraint *p;.  
9610: 20 20 20 20 61 73 73 65 72 74 28 20 61 72 67 63      assert( argc
9620: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 67 65 6f  ==1 );.      geo
9630: 70 6f 6c 79 42 42 6f 78 28 30 2c 20 61 72 67 76  polyBBox(0, argv
9640: 5b 30 5d 2c 20 62 62 6f 78 2c 20 26 72 63 29 3b  [0], bbox, &rc);
9650: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
9660: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 67 65  .        goto ge
9670: 6f 70 6f 6c 79 5f 66 69 6c 74 65 72 5f 65 6e 64  opoly_filter_end
9680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9690: 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  pCsr->aConstrain
96a0: 74 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  t = p = sqlite3_
96b0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 52 74  malloc(sizeof(Rt
96c0: 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 29 2a 34  reeConstraint)*4
96d0: 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6e  );.      pCsr->n
96e0: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 34 3b 0a  Constraint = 4;.
96f0: 20 20 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29        if( p==0 )
9700: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
9710: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
9720: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9730: 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2d 3e 61    memset(pCsr->a
9740: 43 6f 6e 73 74 72 61 69 6e 74 2c 20 30 2c 20 73  Constraint, 0, s
9750: 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6e 73 74  izeof(RtreeConst
9760: 72 61 69 6e 74 29 2a 34 29 3b 0a 20 20 20 20 20  raint)*4);.     
9770: 20 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2d 3e     memset(pCsr->
9780: 61 6e 51 75 65 75 65 2c 20 30 2c 20 73 69 7a 65  anQueue, 0, size
9790: 6f 66 28 75 33 32 29 2a 28 70 52 74 72 65 65 2d  of(u32)*(pRtree-
97a0: 3e 69 44 65 70 74 68 20 2b 20 31 29 29 3b 0a 20  >iDepth + 1));. 
97b0: 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 75         if( idxNu
97c0: 6d 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  m==2 ){.        
97d0: 20 20 2f 2a 20 4f 76 65 72 6c 61 70 20 71 75 65    /* Overlap que
97e0: 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ry */.          
97f0: 70 2d 3e 6f 70 20 3d 20 27 42 27 3b 0a 20 20 20  p->op = 'B';.   
9800: 20 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64         p->iCoord
9810: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
9820: 70 2d 3e 75 2e 72 56 61 6c 75 65 20 3d 20 62 62  p->u.rValue = bb
9830: 6f 78 5b 31 5d 2e 66 3b 0a 20 20 20 20 20 20 20  ox[1].f;.       
9840: 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20     p++;.        
9850: 20 20 70 2d 3e 6f 70 20 3d 20 27 44 27 3b 0a 20    p->op = 'D';. 
9860: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f           p->iCoo
9870: 72 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rd = 1;.        
9880: 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20 3d 20    p->u.rValue = 
9890: 62 62 6f 78 5b 30 5d 2e 66 3b 0a 20 20 20 20 20  bbox[0].f;.     
98a0: 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20       p++;.      
98b0: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27 42 27 3b      p->op = 'B';
98c0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 43  .          p->iC
98d0: 6f 6f 72 64 20 3d 20 32 3b 0a 20 20 20 20 20 20  oord = 2;.      
98e0: 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20      p->u.rValue 
98f0: 3d 20 62 62 6f 78 5b 33 5d 2e 66 3b 0a 20 20 20  = bbox[3].f;.   
9900: 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20         p++;.    
9910: 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27 44        p->op = 'D
9920: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ';.          p->
9930: 69 43 6f 6f 72 64 20 3d 20 33 3b 0a 20 20 20 20  iCoord = 3;.    
9940: 20 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75        p->u.rValu
9950: 65 20 3d 20 62 62 6f 78 5b 32 5d 2e 66 3b 0a 20  e = bbox[2].f;. 
9960: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9970: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74 68 69          /* Withi
9980: 6e 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  n query */.     
9990: 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27 44 27       p->op = 'D'
99a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  ;.          p->i
99b0: 43 6f 6f 72 64 20 3d 20 30 3b 0a 20 20 20 20 20  Coord = 0;.     
99c0: 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65       p->u.rValue
99d0: 20 3d 20 62 62 6f 78 5b 30 5d 2e 66 3b 0a 20 20   = bbox[0].f;.  
99e0: 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20          p++;.   
99f0: 20 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27         p->op = '
9a00: 42 27 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  B';.          p-
9a10: 3e 69 43 6f 6f 72 64 20 3d 20 31 3b 0a 20 20 20  >iCoord = 1;.   
9a20: 20 20 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c         p->u.rVal
9a30: 75 65 20 3d 20 62 62 6f 78 5b 31 5d 2e 66 3b 0a  ue = bbox[1].f;.
9a40: 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20            p++;. 
9a50: 20 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d           p->op =
9a60: 20 27 44 27 3b 0a 20 20 20 20 20 20 20 20 20 20   'D';.          
9a70: 70 2d 3e 69 43 6f 6f 72 64 20 3d 20 32 3b 0a 20  p->iCoord = 2;. 
9a80: 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 72 56           p->u.rV
9a90: 61 6c 75 65 20 3d 20 62 62 6f 78 5b 32 5d 2e 66  alue = bbox[2].f
9aa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b  ;.          p++;
9ab0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  .          p->op
9ac0: 20 3d 20 27 42 27 3b 0a 20 20 20 20 20 20 20 20   = 'B';.        
9ad0: 20 20 70 2d 3e 69 43 6f 6f 72 64 20 3d 20 33 3b    p->iCoord = 3;
9ae0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e  .          p->u.
9af0: 72 56 61 6c 75 65 20 3d 20 62 62 6f 78 5b 33 5d  rValue = bbox[3]
9b00: 2e 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  .f;.        }.  
9b10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9b20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9b30: 4b 20 29 7b 0a 20 20 20 20 20 20 52 74 72 65 65  K ){.      Rtree
9b40: 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70 4e 65  SearchPoint *pNe
9b50: 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  w;.      pNew = 
9b60: 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  rtreeSearchPoint
9b70: 4e 65 77 28 70 43 73 72 2c 20 52 54 52 45 45 5f  New(pCsr, RTREE_
9b80: 5a 45 52 4f 2c 20 28 75 38 29 28 70 52 74 72 65  ZERO, (u8)(pRtre
9b90: 65 2d 3e 69 44 65 70 74 68 2b 31 29 29 3b 0a 20  e->iDepth+1));. 
9ba0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
9bb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
9bc0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9bd0: 20 20 20 20 20 20 20 67 6f 74 6f 20 67 65 6f 70         goto geop
9be0: 6f 6c 79 5f 66 69 6c 74 65 72 5f 65 6e 64 3b 0a  oly_filter_end;.
9bf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
9c00: 65 77 2d 3e 69 64 20 3d 20 31 3b 0a 20 20 20 20  ew->id = 1;.    
9c10: 20 20 70 4e 65 77 2d 3e 69 43 65 6c 6c 20 3d 20    pNew->iCell = 
9c20: 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  0;.      pNew->e
9c30: 57 69 74 68 69 6e 20 3d 20 50 41 52 54 4c 59 5f  Within = PARTLY_
9c40: 57 49 54 48 49 4e 3b 0a 20 20 20 20 20 20 61 73  WITHIN;.      as
9c50: 73 65 72 74 28 20 70 43 73 72 2d 3e 62 50 6f 69  sert( pCsr->bPoi
9c60: 6e 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  nt==1 );.      p
9c70: 43 73 72 2d 3e 61 4e 6f 64 65 5b 30 5d 20 3d 20  Csr->aNode[0] = 
9c80: 70 52 6f 6f 74 3b 0a 20 20 20 20 20 20 70 52 6f  pRoot;.      pRo
9c90: 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 52 54  ot = 0;.      RT
9ca0: 52 45 45 5f 51 55 45 55 45 5f 54 52 41 43 45 28  REE_QUEUE_TRACE(
9cb0: 70 43 73 72 2c 20 22 50 55 53 48 2d 46 6d 3a 22  pCsr, "PUSH-Fm:"
9cc0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 74  );.      rc = rt
9cd0: 72 65 65 53 74 65 70 54 6f 4c 65 61 66 28 70 43  reeStepToLeaf(pC
9ce0: 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  sr);.    }.  }..
9cf0: 67 65 6f 70 6f 6c 79 5f 66 69 6c 74 65 72 5f 65  geopoly_filter_e
9d00: 6e 64 3a 0a 20 20 6e 6f 64 65 52 65 6c 65 61 73  nd:.  nodeReleas
9d10: 65 28 70 52 74 72 65 65 2c 20 70 52 6f 6f 74 29  e(pRtree, pRoot)
9d20: 3b 0a 20 20 72 74 72 65 65 52 65 6c 65 61 73 65  ;.  rtreeRelease
9d30: 28 70 52 74 72 65 65 29 3b 0a 20 20 72 65 74 75  (pRtree);.  retu
9d40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9d50: 52 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61  Rtree virtual ta
9d60: 62 6c 65 20 6d 6f 64 75 6c 65 20 78 42 65 73 74  ble module xBest
9d70: 49 6e 64 65 78 20 6d 65 74 68 6f 64 2e 20 54 68  Index method. Th
9d80: 65 72 65 20 61 72 65 20 74 68 72 65 65 0a 2a 2a  ere are three.**
9d90: 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61   table scan stra
9da0: 74 65 67 69 65 73 20 74 6f 20 63 68 6f 6f 73 65  tegies to choose
9db0: 20 66 72 6f 6d 20 28 69 6e 20 6f 72 64 65 72 20   from (in order 
9dc0: 66 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 0a 2a 2a  from most to .**
9dd0: 20 6c 65 61 73 74 20 64 65 73 69 72 61 62 6c 65   least desirable
9de0: 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 64 78 4e 75  ):.**.**   idxNu
9df0: 6d 20 20 20 20 20 69 64 78 53 74 72 20 20 20 20  m     idxStr    
9e00: 20 20 20 20 53 74 72 61 74 65 67 79 0a 2a 2a 20      Strategy.** 
9e10: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
9e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e40: 2d 2d 0a 2a 2a 20 20 20 20 20 31 20 20 20 20 20  --.**     1     
9e50: 20 20 20 22 72 6f 77 69 64 22 20 20 20 20 20 20     "rowid"      
9e60: 20 44 69 72 65 63 74 20 6c 6f 6f 6b 75 70 20 62   Direct lookup b
9e70: 79 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20  y rowid..**     
9e80: 32 20 20 20 20 20 20 20 20 22 72 74 72 65 65 22  2        "rtree"
9e90: 20 20 20 20 20 20 20 52 2d 74 72 65 65 20 6f 76         R-tree ov
9ea0: 65 72 6c 61 70 20 71 75 65 72 79 20 75 73 69 6e  erlap query usin
9eb0: 67 20 67 65 6f 70 6f 6c 79 5f 6f 76 65 72 6c 61  g geopoly_overla
9ec0: 70 28 29 0a 2a 2a 20 20 20 20 20 33 20 20 20 20  p().**     3    
9ed0: 20 20 20 20 22 72 74 72 65 65 22 20 20 20 20 20      "rtree"     
9ee0: 20 20 52 2d 74 72 65 65 20 77 69 74 68 69 6e 20    R-tree within 
9ef0: 71 75 65 72 79 20 75 73 69 6e 67 20 67 65 6f 70  query using geop
9f00: 6f 6c 79 5f 77 69 74 68 69 6e 28 29 0a 2a 2a 20  oly_within().** 
9f10: 20 20 20 20 34 20 20 20 20 20 20 20 20 22 66 75      4        "fu
9f20: 6c 6c 73 63 61 6e 22 20 20 20 20 66 75 6c 6c 2d  llscan"    full-
9f30: 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2a 20 20  table scan..**  
9f40: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
9f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f70: 2d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  -.*/.static int 
9f80: 67 65 6f 70 6f 6c 79 42 65 73 74 49 6e 64 65 78  geopolyBestIndex
9f90: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74  (sqlite3_vtab *t
9fa0: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
9fb0: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
9fc0: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
9fd0: 6e 74 20 69 52 6f 77 69 64 54 65 72 6d 20 3d 20  nt iRowidTerm = 
9fe0: 2d 31 3b 0a 20 20 69 6e 74 20 69 46 75 6e 63 54  -1;.  int iFuncT
9ff0: 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  erm = -1;.  int 
a000: 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 0a 20 20 66  idxNum = 0;..  f
a010: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 64 78  or(ii=0; ii<pIdx
a020: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
a030: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 74  t; ii++){.    st
a040: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
a050: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
a060: 20 3d 20 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43   = &pIdxInfo->aC
a070: 6f 6e 73 74 72 61 69 6e 74 5b 69 69 5d 3b 0a 20  onstraint[ii];. 
a080: 20 20 20 69 66 28 20 21 70 2d 3e 75 73 61 62 6c     if( !p->usabl
a090: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
a0a0: 20 20 69 66 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e    if( p->iColumn
a0b0: 3c 30 20 26 26 20 70 2d 3e 6f 70 3d 3d 53 51 4c  <0 && p->op==SQL
a0c0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
a0d0: 41 49 4e 54 5f 45 51 20 20 29 7b 0a 20 20 20 20  AINT_EQ  ){.    
a0e0: 20 20 69 52 6f 77 69 64 54 65 72 6d 20 3d 20 69    iRowidTerm = i
a0f0: 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  i;.      break;.
a100: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
a110: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 70  >iColumn==0 && p
a120: 2d 3e 6f 70 3e 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op>=SQLITE_IND
a130: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  EX_CONSTRAINT_FU
a140: 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  NCTION ){.      
a150: 2f 2a 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  /* p->op==SQLITE
a160: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
a170: 54 5f 46 55 4e 43 54 49 4f 4e 20 66 6f 72 20 67  T_FUNCTION for g
a180: 65 6f 70 6f 6c 79 5f 6f 76 65 72 6c 61 70 28 29  eopoly_overlap()
a190: 0a 20 20 20 20 20 20 2a 2a 20 70 2d 3e 6f 70 3d  .      ** p->op=
a1a0: 3d 28 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  =(SQLITE_INDEX_C
a1b0: 4f 4e 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  ONTRAINT_FUNCTIO
a1c0: 4e 2b 31 29 20 66 6f 72 20 67 65 6f 70 6f 6c 79  N+1) for geopoly
a1d0: 5f 77 69 74 68 69 6e 28 29 2e 0a 20 20 20 20 20  _within()..     
a1e0: 20 2a 2a 20 53 65 65 20 67 65 6f 70 6f 6c 79 46   ** See geopolyF
a1f0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 29 20 2a 2f  indFunction() */
a200: 0a 20 20 20 20 20 20 69 46 75 6e 63 54 65 72 6d  .      iFuncTerm
a210: 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 69 64 78   = ii;.      idx
a220: 4e 75 6d 20 3d 20 70 2d 3e 6f 70 20 2d 20 53 51  Num = p->op - SQ
a230: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
a240: 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 20 2b  RAINT_FUNCTION +
a250: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   2;.    }.  }.. 
a260: 20 69 66 28 20 69 52 6f 77 69 64 54 65 72 6d 3e   if( iRowidTerm>
a270: 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e  =0 ){.    pIdxIn
a280: 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 31 3b 0a  fo->idxNum = 1;.
a290: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
a2a0: 78 53 74 72 20 3d 20 22 72 6f 77 69 64 22 3b 0a  xStr = "rowid";.
a2b0: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
a2c0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
a2d0: 52 6f 77 69 64 54 65 72 6d 5d 2e 61 72 67 76 49  RowidTerm].argvI
a2e0: 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49  ndex = 1;.    pI
a2f0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
a300: 69 6e 74 55 73 61 67 65 5b 69 52 6f 77 69 64 54  intUsage[iRowidT
a310: 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20  erm].omit = 1;. 
a320: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
a330: 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 33 30 2e  imatedCost = 30.
a340: 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
a350: 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
a360: 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   1;.    pIdxInfo
a370: 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20 53 51 4c  ->idxFlags = SQL
a380: 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55  ITE_INDEX_SCAN_U
a390: 4e 49 51 55 45 3b 0a 20 20 20 20 72 65 74 75 72  NIQUE;.    retur
a3a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
a3b0: 0a 20 20 69 66 28 20 69 46 75 6e 63 54 65 72 6d  .  if( iFuncTerm
a3c0: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49  >=0 ){.    pIdxI
a3d0: 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 69 64  nfo->idxNum = id
a3e0: 78 4e 75 6d 3b 0a 20 20 20 20 70 49 64 78 49 6e  xNum;.    pIdxIn
a3f0: 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 22 72 74  fo->idxStr = "rt
a400: 72 65 65 22 3b 0a 20 20 20 20 70 49 64 78 49 6e  ree";.    pIdxIn
a410: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
a420: 73 61 67 65 5b 69 46 75 6e 63 54 65 72 6d 5d 2e  sage[iFuncTerm].
a430: 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20  argvIndex = 1;. 
a440: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
a450: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 46  nstraintUsage[iF
a460: 75 6e 63 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20  uncTerm].omit = 
a470: 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
a480: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
a490: 20 33 30 30 2e 30 3b 0a 20 20 20 20 70 49 64 78   300.0;.    pIdx
a4a0: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
a4b0: 6f 77 73 20 3d 20 31 30 3b 0a 20 20 20 20 72 65  ows = 10;.    re
a4c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a4d0: 20 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e    }.  pIdxInfo->
a4e0: 69 64 78 4e 75 6d 20 3d 20 34 3b 0a 20 20 70 49  idxNum = 4;.  pI
a4f0: 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
a500: 20 22 66 75 6c 6c 73 63 61 6e 22 3b 0a 20 20 70   "fullscan";.  p
a510: 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
a520: 65 64 43 6f 73 74 20 3d 20 33 30 30 30 30 30 30  edCost = 3000000
a530: 2e 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  .0;.  pIdxInfo->
a540: 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20  estimatedRows = 
a550: 31 30 30 30 30 30 3b 0a 20 20 72 65 74 75 72 6e  100000;.  return
a560: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
a570: 2f 2a 20 0a 2a 2a 20 47 45 4f 50 4f 4c 59 20 76  /* .** GEOPOLY v
a580: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
a590: 75 6c 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68  ule xColumn meth
a5a0: 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
a5b0: 74 20 67 65 6f 70 6f 6c 79 43 6f 6c 75 6d 6e 28  t geopolyColumn(
a5c0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
a5d0: 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69 74 65  sor *cur, sqlite
a5e0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
a5f0: 69 6e 74 20 69 29 7b 0a 20 20 52 74 72 65 65 20  int i){.  Rtree 
a600: 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65  *pRtree = (Rtree
a610: 20 2a 29 63 75 72 2d 3e 70 56 74 61 62 3b 0a 20   *)cur->pVtab;. 
a620: 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43   RtreeCursor *pC
a630: 73 72 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f  sr = (RtreeCurso
a640: 72 20 2a 29 63 75 72 3b 0a 20 20 52 74 72 65 65  r *)cur;.  Rtree
a650: 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70 20 3d  SearchPoint *p =
a660: 20 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   rtreeSearchPoin
a670: 74 46 69 72 73 74 28 70 43 73 72 29 3b 0a 20 20  tFirst(pCsr);.  
a680: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a690: 4f 4b 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  OK;.  RtreeNode 
a6a0: 2a 70 4e 6f 64 65 20 3d 20 72 74 72 65 65 4e 6f  *pNode = rtreeNo
a6b0: 64 65 4f 66 46 69 72 73 74 53 65 61 72 63 68 50  deOfFirstSearchP
a6c0: 6f 69 6e 74 28 70 43 73 72 2c 20 26 72 63 29 3b  oint(pCsr, &rc);
a6d0: 0a 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ..  if( rc ) ret
a6e0: 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 70 3d  urn rc;.  if( p=
a6f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
a700: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 3d 3d  TE_OK;.  if( i==
a710: 30 20 26 26 20 73 71 6c 69 74 65 33 5f 76 74 61  0 && sqlite3_vta
a720: 62 5f 6e 6f 63 68 61 6e 67 65 28 63 74 78 29 20  b_nochange(ctx) 
a730: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
a740: 4f 4b 3b 0a 20 20 69 66 28 20 69 3c 3d 70 52 74  OK;.  if( i<=pRt
a750: 72 65 65 2d 3e 6e 41 75 78 20 29 7b 0a 20 20 20  ree->nAux ){.   
a760: 20 69 66 28 20 21 70 43 73 72 2d 3e 62 41 75 78   if( !pCsr->bAux
a770: 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 69  Valid ){.      i
a780: 66 28 20 70 43 73 72 2d 3e 70 52 65 61 64 41 75  f( pCsr->pReadAu
a790: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
a7a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
a7b0: 70 61 72 65 5f 76 33 28 70 52 74 72 65 65 2d 3e  pare_v3(pRtree->
a7c0: 64 62 2c 20 70 52 74 72 65 65 2d 3e 7a 52 65 61  db, pRtree->zRea
a7d0: 64 41 75 78 53 71 6c 2c 20 2d 31 2c 20 30 2c 0a  dAuxSql, -1, 0,.
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 26 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78 2c  &pCsr->pReadAux,
a810: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
a820: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a840: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
a850: 34 28 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78  4(pCsr->pReadAux
a860: 2c 20 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 1, .          
a870: 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 70 52 74  nodeGetRowid(pRt
a880: 72 65 65 2c 20 70 4e 6f 64 65 2c 20 70 2d 3e 69  ree, pNode, p->i
a890: 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 72 63  Cell));.      rc
a8a0: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
a8b0: 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78 29 3b  pCsr->pReadAux);
a8c0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
a8d0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
a8e0: 20 20 20 20 20 70 43 73 72 2d 3e 62 41 75 78 56       pCsr->bAuxV
a8f0: 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
a900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
a910: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 73  qlite3_reset(pCs
a920: 72 2d 3e 70 52 65 61 64 41 75 78 29 3b 0a 20 20  r->pReadAux);.  
a930: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
a940: 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d  LITE_DONE ) rc =
a950: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
a960: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
a970: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a980: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a990: 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74  value(ctx, sqlit
a9a0: 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
a9b0: 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78 2c 20  pCsr->pReadAux, 
a9c0: 69 2b 32 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  i+2));.  }.  ret
a9d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a9e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 55 70  .../*.** The xUp
a9f0: 64 61 74 65 20 6d 65 74 68 6f 64 20 66 6f 72 20  date method for 
aa00: 47 45 4f 50 4f 4c 59 20 6d 6f 64 75 6c 65 20 76  GEOPOLY module v
aa10: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a  irtual tables..*
aa20: 2a 0a 2a 2a 20 46 6f 72 20 44 45 4c 45 54 45 3a  *.** For DELETE:
aa30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  .**.**     argv[
aa40: 30 5d 20 3d 20 74 68 65 20 72 6f 77 69 64 20 74  0] = the rowid t
aa50: 6f 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 0a  o be deleted.**.
aa60: 2a 2a 20 46 6f 72 20 49 4e 53 45 52 54 3a 0a 2a  ** For INSERT:.*
aa70: 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 30 5d  *.**     argv[0]
aa80: 20 3d 20 53 51 4c 20 4e 55 4c 4c 0a 2a 2a 20 20   = SQL NULL.**  
aa90: 20 20 20 61 72 67 76 5b 31 5d 20 3d 20 72 6f 77     argv[1] = row
aaa0: 69 64 20 74 6f 20 69 6e 73 65 72 74 2c 20 6f 72  id to insert, or
aab0: 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 74 6f 20   an SQL NULL to 
aac0: 73 65 6c 65 63 74 20 61 75 74 6f 6d 61 74 69 63  select automatic
aad0: 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 61 72 67 76  ally.**     argv
aae0: 5b 32 5d 20 3d 20 5f 73 68 61 70 65 20 63 6f 6c  [2] = _shape col
aaf0: 75 6d 6e 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  umn.**     argv[
ab00: 33 5d 20 3d 20 66 69 72 73 74 20 61 70 70 6c 69  3] = first appli
ab10: 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 63  cation-defined c
ab20: 6f 6c 75 6d 6e 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  olumn.....**.** 
ab30: 46 6f 72 20 55 50 44 41 54 45 3a 0a 2a 2a 0a 2a  For UPDATE:.**.*
ab40: 2a 20 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20  *     argv[0] = 
ab50: 72 6f 77 69 64 20 74 6f 20 6d 6f 64 69 66 79 2e  rowid to modify.
ab60: 20 20 4e 65 76 65 72 20 4e 55 4c 4c 0a 2a 2a 20    Never NULL.** 
ab70: 20 20 20 20 61 72 67 76 5b 31 5d 20 3d 20 72 6f      argv[1] = ro
ab80: 77 69 64 20 61 66 74 65 72 20 74 68 65 20 63 68  wid after the ch
ab90: 61 6e 67 65 2e 20 20 4e 65 76 65 72 20 4e 55 4c  ange.  Never NUL
aba0: 4c 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 32 5d  L.**     argv[2]
abb0: 20 3d 20 6e 65 77 20 76 61 6c 75 65 20 66 6f 72   = new value for
abc0: 20 5f 73 68 61 70 65 0a 2a 2a 20 20 20 20 20 61   _shape.**     a
abd0: 72 67 76 5b 33 5d 20 3d 20 6e 65 77 20 76 61 6c  rgv[3] = new val
abe0: 75 65 20 66 6f 72 20 66 69 72 73 74 20 61 70 70  ue for first app
abf0: 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64  lication-defined
ac00: 20 63 6f 6c 75 6d 6e 2e 2e 2e 2e 0a 2a 2f 0a 73   column.....*/.s
ac10: 74 61 74 69 63 20 69 6e 74 20 67 65 6f 70 6f 6c  tatic int geopol
ac20: 79 55 70 64 61 74 65 28 0a 20 20 73 71 6c 69 74  yUpdate(.  sqlit
ac30: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20  e3_vtab *pVtab, 
ac40: 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 0a 20  .  int nData, . 
ac50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
ac60: 2a 61 44 61 74 61 2c 20 0a 20 20 73 71 6c 69 74  *aData, .  sqlit
ac70: 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 0a  e_int64 *pRowid.
ac80: 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  ){.  Rtree *pRtr
ac90: 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56  ee = (Rtree *)pV
aca0: 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  tab;.  int rc = 
acb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72  SQLITE_OK;.  Rtr
acc0: 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 20 20 20 20  eeCell cell;    
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ace0: 4e 65 77 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65  New cell to inse
acf0: 72 74 20 69 66 20 6e 44 61 74 61 3e 31 20 2a 2f  rt if nData>1 */
ad00: 0a 20 20 69 36 34 20 6f 6c 64 52 6f 77 69 64 3b  .  i64 oldRowid;
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad20: 20 20 20 2f 2a 20 54 68 65 20 6f 6c 64 20 72 6f     /* The old ro
ad30: 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6c 64  wid */.  int old
ad40: 52 6f 77 69 64 56 61 6c 69 64 3b 20 20 20 20 20  RowidValid;     
ad50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
ad60: 20 69 66 20 6f 6c 64 52 6f 77 69 64 20 69 73 20   if oldRowid is 
ad70: 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 6e  valid */.  i64 n
ad80: 65 77 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20  ewRowid;        
ad90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ada0: 65 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20  e new rowid */. 
adb0: 20 69 6e 74 20 6e 65 77 52 6f 77 69 64 56 61 6c   int newRowidVal
adc0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
add0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 77 52   /* True if newR
ade0: 6f 77 69 64 20 69 73 20 76 61 6c 69 64 20 2a 2f  owid is valid */
adf0: 0a 20 20 69 6e 74 20 63 6f 6f 72 64 43 68 61 6e  .  int coordChan
ae00: 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ge = 0;         
ae10: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 69 6e 20     /* Change in 
ae20: 63 6f 6f 72 64 69 6e 61 74 65 73 20 2a 2f 0a 0a  coordinates */..
ae30: 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e 6e 4e    if( pRtree->nN
ae40: 6f 64 65 52 65 66 20 29 7b 0a 20 20 20 20 2f 2a  odeRef ){.    /*
ae50: 20 55 6e 61 62 6c 65 20 74 6f 20 77 72 69 74 65   Unable to write
ae60: 20 74 6f 20 74 68 65 20 62 74 72 65 65 20 77 68   to the btree wh
ae70: 69 6c 65 20 61 6e 6f 74 68 65 72 20 63 75 72 73  ile another curs
ae80: 6f 72 20 69 73 20 72 65 61 64 69 6e 67 20 66 72  or is reading fr
ae90: 6f 6d 20 69 74 2c 0a 20 20 20 20 2a 2a 20 73 69  om it,.    ** si
aea0: 6e 63 65 20 74 68 65 20 77 72 69 74 65 20 6d 69  nce the write mi
aeb0: 67 68 74 20 64 6f 20 61 20 72 65 62 61 6c 61 6e  ght do a rebalan
aec0: 63 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 64  ce which would d
aed0: 69 73 72 75 70 74 20 74 68 65 20 72 65 61 64 0a  isrupt the read.
aee0: 20 20 20 20 2a 2a 20 63 75 72 73 6f 72 2e 20 2a      ** cursor. *
aef0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
af00: 49 54 45 5f 4c 4f 43 4b 45 44 5f 56 54 41 42 3b  ITE_LOCKED_VTAB;
af10: 0a 20 20 7d 0a 20 20 72 74 72 65 65 52 65 66 65  .  }.  rtreeRefe
af20: 72 65 6e 63 65 28 70 52 74 72 65 65 29 3b 0a 20  rence(pRtree);. 
af30: 20 61 73 73 65 72 74 28 6e 44 61 74 61 3e 3d 31   assert(nData>=1
af40: 29 3b 0a 0a 20 20 6f 6c 64 52 6f 77 69 64 56 61  );..  oldRowidVa
af50: 6c 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lid = sqlite3_va
af60: 6c 75 65 5f 74 79 70 65 28 61 44 61 74 61 5b 30  lue_type(aData[0
af70: 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b  ])!=SQLITE_NULL;
af80: 3b 0a 20 20 6f 6c 64 52 6f 77 69 64 20 3d 20 6f  ;.  oldRowid = o
af90: 6c 64 52 6f 77 69 64 56 61 6c 69 64 20 3f 20 73  ldRowidValid ? s
afa0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
afb0: 36 34 28 61 44 61 74 61 5b 30 5d 29 20 3a 20 30  64(aData[0]) : 0
afc0: 3b 0a 20 20 6e 65 77 52 6f 77 69 64 56 61 6c 69  ;.  newRowidVali
afd0: 64 20 3d 20 6e 44 61 74 61 3e 31 20 26 26 20 73  d = nData>1 && s
afe0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
aff0: 65 28 61 44 61 74 61 5b 31 5d 29 21 3d 53 51 4c  e(aData[1])!=SQL
b000: 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 6e 65 77 52  ITE_NULL;.  newR
b010: 6f 77 69 64 20 3d 20 6e 65 77 52 6f 77 69 64 56  owid = newRowidV
b020: 61 6c 69 64 20 3f 20 73 71 6c 69 74 65 33 5f 76  alid ? sqlite3_v
b030: 61 6c 75 65 5f 69 6e 74 36 34 28 61 44 61 74 61  alue_int64(aData
b040: 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 63 65 6c 6c  [1]) : 0;.  cell
b050: 2e 69 52 6f 77 69 64 20 3d 20 6e 65 77 52 6f 77  .iRowid = newRow
b060: 69 64 3b 0a 0a 20 20 69 66 28 20 6e 44 61 74 61  id;..  if( nData
b070: 3e 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >1              
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 20 2f 2a 20 6e 6f 74 20 61 20 44 45 4c 45     /* not a DELE
b0a0: 54 45 20 2a 2f 0a 20 20 20 26 26 20 28 21 6f 6c  TE */.   && (!ol
b0b0: 64 52 6f 77 69 64 56 61 6c 69 64 20 20 20 20 20  dRowidValid     
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0d0: 20 20 20 20 2f 2a 20 49 4e 53 45 52 54 20 2a 2f      /* INSERT */
b0e0: 0a 20 20 20 20 20 20 20 20 7c 7c 20 21 73 71 6c  .        || !sql
b0f0: 69 74 65 33 5f 76 61 6c 75 65 5f 6e 6f 63 68 61  ite3_value_nocha
b100: 6e 67 65 28 61 44 61 74 61 5b 32 5d 29 20 20 2f  nge(aData[2])  /
b110: 2a 20 55 50 44 41 54 45 20 5f 73 68 61 70 65 20  * UPDATE _shape 
b120: 2a 2f 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 6c  */.        || ol
b130: 64 52 6f 77 69 64 21 3d 6e 65 77 52 6f 77 69 64  dRowid!=newRowid
b140: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
b150: 20 2f 2a 20 52 6f 77 69 64 20 63 68 61 6e 67 65   /* Rowid change
b160: 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 67 65 6f   */.  ){.    geo
b170: 70 6f 6c 79 42 42 6f 78 28 30 2c 20 61 44 61 74  polyBBox(0, aDat
b180: 61 5b 32 5d 2c 20 63 65 6c 6c 2e 61 43 6f 6f 72  a[2], cell.aCoor
b190: 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  d, &rc);.    if(
b1a0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
b1b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f   rc==SQLITE_ERRO
b1c0: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 70 56 74  R ){.        pVt
b1d0: 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 0a 20 20  ab->zErrMsg =.  
b1e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b1f0: 6d 70 72 69 6e 74 66 28 22 5f 73 68 61 70 65 20  mprintf("_shape 
b200: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
b210: 20 61 20 76 61 6c 69 64 20 70 6f 6c 79 67 6f 6e   a valid polygon
b220: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
b230: 20 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79 5f 75    goto geopoly_u
b240: 70 64 61 74 65 5f 65 6e 64 3b 0a 20 20 20 20 7d  pdate_end;.    }
b250: 0a 20 20 20 20 63 6f 6f 72 64 43 68 61 6e 67 65  .    coordChange
b260: 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 1;..    /* If
b270: 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 20 77   a rowid value w
b280: 61 73 20 73 75 70 70 6c 69 65 64 2c 20 63 68 65  as supplied, che
b290: 63 6b 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ck if it is alre
b2a0: 61 64 79 20 70 72 65 73 65 6e 74 20 69 6e 20 0a  ady present in .
b2b0: 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65      ** the table
b2c0: 2e 20 49 66 20 73 6f 2c 20 74 68 65 20 63 6f 6e  . If so, the con
b2d0: 73 74 72 61 69 6e 74 20 68 61 73 20 66 61 69 6c  straint has fail
b2e0: 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ed. */.    if( n
b2f0: 65 77 52 6f 77 69 64 56 61 6c 69 64 20 26 26 20  ewRowidValid && 
b300: 28 21 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64 20  (!oldRowidValid 
b310: 7c 7c 20 6f 6c 64 52 6f 77 69 64 21 3d 6e 65 77  || oldRowid!=new
b320: 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 20 20  Rowid) ){.      
b330: 69 6e 74 20 73 74 65 70 72 63 3b 0a 20 20 20 20  int steprc;.    
b340: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
b350: 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70 52 65  nt64(pRtree->pRe
b360: 61 64 52 6f 77 69 64 2c 20 31 2c 20 63 65 6c 6c  adRowid, 1, cell
b370: 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
b380: 73 74 65 70 72 63 20 3d 20 73 71 6c 69 74 65 33  steprc = sqlite3
b390: 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70 52  _step(pRtree->pR
b3a0: 65 61 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  eadRowid);.     
b3b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
b3c0: 73 65 74 28 70 52 74 72 65 65 2d 3e 70 52 65 61  set(pRtree->pRea
b3d0: 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  dRowid);.      i
b3e0: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
b3f0: 74 65 70 72 63 20 29 7b 0a 20 20 20 20 20 20 20  teprc ){.       
b400: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 74 61   if( sqlite3_vta
b410: 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74 28 70 52  b_on_conflict(pR
b420: 74 72 65 65 2d 3e 64 62 29 3d 3d 53 51 4c 49 54  tree->db)==SQLIT
b430: 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20  E_REPLACE ){.   
b440: 20 20 20 20 20 20 20 72 63 20 3d 20 72 74 72 65         rc = rtre
b450: 65 44 65 6c 65 74 65 52 6f 77 69 64 28 70 52 74  eDeleteRowid(pRt
b460: 72 65 65 2c 20 63 65 6c 6c 2e 69 52 6f 77 69 64  ree, cell.iRowid
b470: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b480: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
b490: 20 72 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74   rtreeConstraint
b4a0: 45 72 72 6f 72 28 70 52 74 72 65 65 2c 20 30 29  Error(pRtree, 0)
b4b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b4c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
b4d0: 20 2f 2a 20 49 66 20 61 44 61 74 61 5b 30 5d 20   /* If aData[0] 
b4e0: 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 4e 55  is not an SQL NU
b4f0: 4c 4c 20 76 61 6c 75 65 2c 20 69 74 20 69 73 20  LL value, it is 
b500: 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61 0a 20  the rowid of a. 
b510: 20 2a 2a 20 72 65 63 6f 72 64 20 74 6f 20 64 65   ** record to de
b520: 6c 65 74 65 20 66 72 6f 6d 20 74 68 65 20 72 2d  lete from the r-
b530: 74 72 65 65 20 74 61 62 6c 65 2e 20 54 68 65 20  tree table. The 
b540: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
b550: 64 6f 65 73 0a 20 20 2a 2a 20 6a 75 73 74 20 74  does.  ** just t
b560: 68 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hat..  */.  if( 
b570: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
b580: 20 28 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 28 63   (nData==1 || (c
b590: 6f 6f 72 64 43 68 61 6e 67 65 20 26 26 20 6f 6c  oordChange && ol
b5a0: 64 52 6f 77 69 64 56 61 6c 69 64 29 29 20 29 7b  dRowidValid)) ){
b5b0: 0a 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 44  .    rc = rtreeD
b5c0: 65 6c 65 74 65 52 6f 77 69 64 28 70 52 74 72 65  eleteRowid(pRtre
b5d0: 65 2c 20 6f 6c 64 52 6f 77 69 64 29 3b 0a 20 20  e, oldRowid);.  
b5e0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
b5f0: 44 61 74 61 5b 5d 20 61 72 72 61 79 20 63 6f 6e  Data[] array con
b600: 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  tains more than 
b610: 6f 6e 65 20 65 6c 65 6d 65 6e 74 2c 20 65 6c 65  one element, ele
b620: 6d 65 6e 74 73 0a 20 20 2a 2a 20 28 61 44 61 74  ments.  ** (aDat
b630: 61 5b 32 5d 2e 2e 61 44 61 74 61 5b 61 72 67 63  a[2]..aData[argc
b640: 2d 31 5d 29 20 63 6f 6e 74 61 69 6e 20 61 20 6e  -1]) contain a n
b650: 65 77 20 72 65 63 6f 72 64 20 74 6f 20 69 6e 73  ew record to ins
b660: 65 72 74 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ert into.  ** th
b670: 65 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75  e r-tree structu
b680: 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  re..  */.  if( r
b690: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b6a0: 6e 44 61 74 61 3e 31 20 26 26 20 63 6f 6f 72 64  nData>1 && coord
b6b0: 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 2f 2a  Change ){.    /*
b6c0: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
b6d0: 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
b6e0: 72 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 52 74  r-tree */.    Rt
b6f0: 72 65 65 4e 6f 64 65 20 2a 70 4c 65 61 66 20 3d  reeNode *pLeaf =
b700: 20 30 3b 0a 20 20 20 20 69 66 28 20 21 6e 65 77   0;.    if( !new
b710: 52 6f 77 69 64 56 61 6c 69 64 20 29 7b 0a 20 20  RowidValid ){.  
b720: 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 4e 65      rc = rtreeNe
b730: 77 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20 26  wRowid(pRtree, &
b740: 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a 20 20  cell.iRowid);.  
b750: 20 20 7d 0a 20 20 20 20 2a 70 52 6f 77 69 64 20    }.    *pRowid 
b760: 3d 20 63 65 6c 6c 2e 69 52 6f 77 69 64 3b 0a 20  = cell.iRowid;. 
b770: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b780: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
b790: 20 3d 20 43 68 6f 6f 73 65 4c 65 61 66 28 70 52   = ChooseLeaf(pR
b7a0: 74 72 65 65 2c 20 26 63 65 6c 6c 2c 20 30 2c 20  tree, &cell, 0, 
b7b0: 26 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20  &pLeaf);.    }. 
b7c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b7d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
b7e0: 74 20 72 63 32 3b 0a 20 20 20 20 20 20 70 52 74  t rc2;.      pRt
b7f0: 72 65 65 2d 3e 69 52 65 69 6e 73 65 72 74 48 65  ree->iReinsertHe
b800: 69 67 68 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  ight = -1;.     
b810: 20 72 63 20 3d 20 72 74 72 65 65 49 6e 73 65 72   rc = rtreeInser
b820: 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4c  tCell(pRtree, pL
b830: 65 61 66 2c 20 26 63 65 6c 6c 2c 20 30 29 3b 0a  eaf, &cell, 0);.
b840: 20 20 20 20 20 20 72 63 32 20 3d 20 6e 6f 64 65        rc2 = node
b850: 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20  Release(pRtree, 
b860: 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66  pLeaf);.      if
b870: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b880: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
b890: 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
b8a0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61   }.  }..  /* Cha
b8b0: 6e 67 65 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  nge the data */.
b8c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b8d0: 5f 4f 4b 20 26 26 20 6e 44 61 74 61 3e 31 20 29  _OK && nData>1 )
b8e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
b8f0: 6d 74 20 2a 70 55 70 20 3d 20 70 52 74 72 65 65  mt *pUp = pRtree
b900: 2d 3e 70 57 72 69 74 65 41 75 78 3b 0a 20 20 20  ->pWriteAux;.   
b910: 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 69 6e 74   int jj;.    int
b920: 20 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20   nChange = 0;.  
b930: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
b940: 6e 74 36 34 28 70 55 70 2c 20 31 2c 20 63 65 6c  nt64(pUp, 1, cel
b950: 6c 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 61  l.iRowid);.    a
b960: 73 73 65 72 74 28 20 70 52 74 72 65 65 2d 3e 6e  ssert( pRtree->n
b970: 41 75 78 3e 3d 31 20 29 3b 0a 20 20 20 20 69 66  Aux>=1 );.    if
b980: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
b990: 6e 6f 63 68 61 6e 67 65 28 61 44 61 74 61 5b 32  nochange(aData[2
b9a0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ]) ){.      sqli
b9b0: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 55  te3_bind_null(pU
b9c0: 70 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  p, 2);.    }else
b9d0: 7b 0a 20 20 20 20 20 20 47 65 6f 50 6f 6c 79 20  {.      GeoPoly 
b9e0: 2a 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  *p = 0;.      if
b9f0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
ba00: 74 79 70 65 28 61 44 61 74 61 5b 32 5d 29 3d 3d  type(aData[2])==
ba10: 53 51 4c 49 54 45 5f 54 45 58 54 0a 20 20 20 20  SQLITE_TEXT.    
ba20: 20 20 20 26 26 20 28 70 20 3d 20 67 65 6f 70 6f     && (p = geopo
ba30: 6c 79 46 75 6e 63 50 61 72 61 6d 28 30 2c 20 61  lyFuncParam(0, a
ba40: 44 61 74 61 5b 32 5d 2c 20 26 72 63 29 29 21 3d  Data[2], &rc))!=
ba50: 30 0a 20 20 20 20 20 20 20 26 26 20 72 63 3d 3d  0.       && rc==
ba60: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
ba70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ba80: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 55 70  e3_bind_blob(pUp
ba90: 2c 20 32 2c 20 70 2d 3e 68 64 72 2c 20 34 2b 38  , 2, p->hdr, 4+8
baa0: 2a 70 2d 3e 6e 56 65 72 74 65 78 2c 20 53 51 4c  *p->nVertex, SQL
bab0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
bac0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bad0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
bae0: 64 5f 76 61 6c 75 65 28 70 55 70 2c 20 32 2c 20  d_value(pUp, 2, 
baf0: 61 44 61 74 61 5b 32 5d 29 3b 0a 20 20 20 20 20  aData[2]);.     
bb00: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
bb10: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
bb20: 6e 43 68 61 6e 67 65 20 3d 20 31 3b 0a 20 20 20  nChange = 1;.   
bb30: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 31 3b   }.    for(jj=1;
bb40: 20 6a 6a 3c 70 52 74 72 65 65 2d 3e 6e 41 75 78   jj<pRtree->nAux
bb50: 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  ; jj++){.      n
bb60: 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20 20 20 20  Change++;.      
bb70: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
bb80: 75 65 28 70 55 70 2c 20 6a 6a 2b 32 2c 20 61 44  ue(pUp, jj+2, aD
bb90: 61 74 61 5b 6a 6a 2b 32 5d 29 3b 0a 20 20 20 20  ata[jj+2]);.    
bba0: 7d 0a 20 20 20 20 69 66 28 20 6e 43 68 61 6e 67  }.    if( nChang
bbb0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
bbc0: 65 33 5f 73 74 65 70 28 70 55 70 29 3b 0a 20 20  e3_step(pUp);.  
bbd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bbe0: 5f 72 65 73 65 74 28 70 55 70 29 3b 0a 20 20 20  _reset(pUp);.   
bbf0: 20 7d 0a 20 20 7d 0a 0a 67 65 6f 70 6f 6c 79 5f   }.  }..geopoly_
bc00: 75 70 64 61 74 65 5f 65 6e 64 3a 0a 20 20 72 74  update_end:.  rt
bc10: 72 65 65 52 65 6c 65 61 73 65 28 70 52 74 72 65  reeRelease(pRtre
bc20: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
bc30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
bc40: 20 74 68 61 74 20 67 65 6f 70 6f 6c 79 5f 6f 76   that geopoly_ov
bc50: 65 72 6c 61 70 28 29 20 69 73 20 61 6e 20 6f 76  erlap() is an ov
bc60: 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f  erloaded functio
bc70: 6e 20 73 75 69 74 61 62 6c 65 0a 2a 2a 20 66 6f  n suitable.** fo
bc80: 72 20 75 73 65 20 69 6e 20 78 42 65 73 74 49 6e  r use in xBestIn
bc90: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dex..*/.static i
bca0: 6e 74 20 67 65 6f 70 6f 6c 79 46 69 6e 64 46 75  nt geopolyFindFu
bcb0: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
bcc0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 0a 20  3_vtab *pVtab,. 
bcd0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 63 6f 6e   int nArg,.  con
bce0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
bcf0: 20 20 76 6f 69 64 20 28 2a 2a 70 78 46 75 6e 63    void (**pxFunc
bd00: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
bd10: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
bd20: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
bd30: 2a 2a 70 70 41 72 67 0a 29 7b 0a 20 20 69 66 28  **ppArg.){.  if(
bd40: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
bd50: 28 7a 4e 61 6d 65 2c 20 22 67 65 6f 70 6f 6c 79  (zName, "geopoly
bd60: 5f 6f 76 65 72 6c 61 70 22 29 3d 3d 30 20 29 7b  _overlap")==0 ){
bd70: 0a 20 20 20 20 2a 70 78 46 75 6e 63 20 3d 20 67  .    *pxFunc = g
bd80: 65 6f 70 6f 6c 79 4f 76 65 72 6c 61 70 46 75 6e  eopolyOverlapFun
bd90: 63 3b 0a 20 20 20 20 2a 70 70 41 72 67 20 3d 20  c;.    *ppArg = 
bda0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
bdb0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
bdc0: 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3b 0a  RAINT_FUNCTION;.
bdd0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
bde0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
bdf0: 20 22 67 65 6f 70 6f 6c 79 5f 77 69 74 68 69 6e   "geopoly_within
be00: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 78  ")==0 ){.    *px
be10: 46 75 6e 63 20 3d 20 67 65 6f 70 6f 6c 79 57 69  Func = geopolyWi
be20: 74 68 69 6e 46 75 6e 63 3b 0a 20 20 20 20 2a 70  thinFunc;.    *p
be30: 70 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 72 65  pArg = 0;.    re
be40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 44 45  turn SQLITE_INDE
be50: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  X_CONSTRAINT_FUN
be60: 43 54 49 4f 4e 2b 31 3b 0a 20 20 7d 0a 20 20 72  CTION+1;.  }.  r
be70: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 73 74 61  eturn 0;.}...sta
be80: 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  tic sqlite3_modu
be90: 6c 65 20 67 65 6f 70 6f 6c 79 4d 6f 64 75 6c 65  le geopolyModule
bea0: 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20   = {.  3,       
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
bed0: 2f 0a 20 20 67 65 6f 70 6f 6c 79 43 72 65 61 74  /.  geopolyCreat
bee0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
bef0: 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 63 72 65  /* xCreate - cre
bf00: 61 74 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20  ate a table */. 
bf10: 20 67 65 6f 70 6f 6c 79 43 6f 6e 6e 65 63 74 2c   geopolyConnect,
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bf30: 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e 65  xConnect - conne
bf40: 63 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e  ct to an existin
bf50: 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 67 65 6f  g table */.  geo
bf60: 70 6f 6c 79 42 65 73 74 49 6e 64 65 78 2c 20 20  polyBestIndex,  
bf70: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73           /* xBes
bf80: 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72 6d 69  tIndex - Determi
bf90: 6e 65 20 73 65 61 72 63 68 20 73 74 72 61 74 65  ne search strate
bfa0: 67 79 20 2a 2f 0a 20 20 72 74 72 65 65 44 69 73  gy */.  rtreeDis
bfb0: 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  connect,        
bfc0: 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65      /* xDisconne
bfd0: 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65 63 74 20  ct - Disconnect 
bfe0: 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 2a 2f 0a  from a table */.
bff0: 20 20 72 74 72 65 65 44 65 73 74 72 6f 79 2c 20    rtreeDestroy, 
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c010: 20 78 44 65 73 74 72 6f 79 20 2d 20 44 72 6f 70   xDestroy - Drop
c020: 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74   a table */.  rt
c030: 72 65 65 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  reeOpen,        
c040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
c050: 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73  en - open a curs
c060: 6f 72 20 2a 2f 0a 20 20 72 74 72 65 65 43 6c 6f  or */.  rtreeClo
c070: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
c080: 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20      /* xClose - 
c090: 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a  close a cursor *
c0a0: 2f 0a 20 20 67 65 6f 70 6f 6c 79 46 69 6c 74 65  /.  geopolyFilte
c0b0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
c0c0: 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e  /* xFilter - con
c0d0: 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73  figure scan cons
c0e0: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 72 74 72  traints */.  rtr
c0f0: 65 65 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20  eeNext,         
c100: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78           /* xNex
c110: 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75  t - advance a cu
c120: 72 73 6f 72 20 2a 2f 0a 20 20 72 74 72 65 65 45  rsor */.  rtreeE
c130: 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  of,             
c140: 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f        /* xEof */
c150: 0a 20 20 67 65 6f 70 6f 6c 79 43 6f 6c 75 6d 6e  .  geopolyColumn
c160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
c170: 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64  * xColumn - read
c180: 20 64 61 74 61 20 2a 2f 0a 20 20 72 74 72 65 65   data */.  rtree
c190: 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
c1a0: 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64         /* xRowid
c1b0: 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
c1c0: 20 20 67 65 6f 70 6f 6c 79 55 70 64 61 74 65 2c    geopolyUpdate,
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c1e0: 20 78 55 70 64 61 74 65 20 2d 20 77 72 69 74 65   xUpdate - write
c1f0: 20 64 61 74 61 20 2a 2f 0a 20 20 72 74 72 65 65   data */.  rtree
c200: 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
c210: 2c 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e  ,      /* xBegin
c220: 20 2d 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63   - begin transac
c230: 74 69 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65 45  tion */.  rtreeE
c240: 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20  ndTransaction,  
c250: 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d        /* xSync -
c260: 20 73 79 6e 63 20 74 72 61 6e 73 61 63 74 69 6f   sync transactio
c270: 6e 20 2a 2f 0a 20 20 72 74 72 65 65 45 6e 64 54  n */.  rtreeEndT
c280: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20  ransaction,     
c290: 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20     /* xCommit - 
c2a0: 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69  commit transacti
c2b0: 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65 45 6e 64  on */.  rtreeEnd
c2c0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
c2d0: 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
c2e0: 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e   - rollback tran
c2f0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 67 65 6f  saction */.  geo
c300: 70 6f 6c 79 46 69 6e 64 46 75 6e 63 74 69 6f 6e  polyFindFunction
c310: 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e  ,        /* xFin
c320: 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e 63  dFunction - func
c330: 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
c340: 20 2a 2f 0a 20 20 72 74 72 65 65 52 65 6e 61 6d   */.  rtreeRenam
c350: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
c360: 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d 20 72    /* xRename - r
c370: 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c 65 20  ename the table 
c380: 2a 2f 0a 20 20 72 74 72 65 65 53 61 76 65 70 6f  */.  rtreeSavepo
c390: 69 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  int,            
c3a0: 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 2a   /* xSavepoint *
c3b0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20  /* xRelease */. 
c3e0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c400: 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 20  xRollbackTo */. 
c410: 20 72 74 72 65 65 53 68 61 64 6f 77 4e 61 6d 65   rtreeShadowName
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c430: 78 53 68 61 64 6f 77 4e 61 6d 65 20 2a 2f 0a 7d  xShadowName */.}
c440: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ;..static int sq
c450: 6c 69 74 65 33 5f 67 65 6f 70 6f 6c 79 5f 69 6e  lite3_geopoly_in
c460: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
c470: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c480: 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20  TE_OK;.  static 
c490: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
c4a0: 20 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29     void (*xFunc)
c4b0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c4c0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
c4d0: 6c 75 65 2a 2a 29 3b 0a 20 20 20 20 73 69 67 6e  lue**);.    sign
c4e0: 65 64 20 63 68 61 72 20 6e 41 72 67 3b 0a 20 20  ed char nArg;.  
c4f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c500: 62 50 75 72 65 3b 0a 20 20 20 20 63 6f 6e 73 74  bPure;.    const
c510: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
c520: 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20  } aFunc[] = {.  
c530: 20 20 20 7b 20 67 65 6f 70 6f 6c 79 41 72 65 61     { geopolyArea
c540: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 31  Func,          1
c550: 2c 20 31 2c 20 20 20 20 22 67 65 6f 70 6f 6c 79  , 1,    "geopoly
c560: 5f 61 72 65 61 22 20 20 20 20 20 20 20 20 20 20  _area"          
c570: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67 65 6f     },.     { geo
c580: 70 6f 6c 79 42 6c 6f 62 46 75 6e 63 2c 20 20 20  polyBlobFunc,   
c590: 20 20 20 20 20 20 20 31 2c 20 31 2c 20 20 20 20         1, 1,    
c5a0: 22 67 65 6f 70 6f 6c 79 5f 62 6c 6f 62 22 20 20  "geopoly_blob"  
c5b0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
c5c0: 20 20 20 7b 20 67 65 6f 70 6f 6c 79 4a 73 6f 6e     { geopolyJson
c5d0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 31  Func,          1
c5e0: 2c 20 31 2c 20 20 20 20 22 67 65 6f 70 6f 6c 79  , 1,    "geopoly
c5f0: 5f 6a 73 6f 6e 22 20 20 20 20 20 20 20 20 20 20  _json"          
c600: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67 65 6f     },.     { geo
c610: 70 6f 6c 79 53 76 67 46 75 6e 63 2c 20 20 20 20  polySvgFunc,    
c620: 20 20 20 20 20 20 2d 31 2c 20 31 2c 20 20 20 20        -1, 1,    
c630: 22 67 65 6f 70 6f 6c 79 5f 73 76 67 22 20 20 20  "geopoly_svg"   
c640: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
c650: 20 20 20 7b 20 67 65 6f 70 6f 6c 79 57 69 74 68     { geopolyWith
c660: 69 6e 46 75 6e 63 2c 20 20 20 20 20 20 20 20 32  inFunc,        2
c670: 2c 20 31 2c 20 20 20 20 22 67 65 6f 70 6f 6c 79  , 1,    "geopoly
c680: 5f 77 69 74 68 69 6e 22 20 20 20 20 20 20 20 20  _within"        
c690: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67 65 6f     },.     { geo
c6a0: 70 6f 6c 79 43 6f 6e 74 61 69 6e 73 50 6f 69 6e  polyContainsPoin
c6b0: 74 46 75 6e 63 2c 20 33 2c 20 31 2c 20 20 20 20  tFunc, 3, 1,    
c6c0: 22 67 65 6f 70 6f 6c 79 5f 63 6f 6e 74 61 69 6e  "geopoly_contain
c6d0: 73 5f 70 6f 69 6e 74 22 20 20 20 7d 2c 0a 20 20  s_point"   },.  
c6e0: 20 20 20 7b 20 67 65 6f 70 6f 6c 79 4f 76 65 72     { geopolyOver
c6f0: 6c 61 70 46 75 6e 63 2c 20 20 20 20 20 20 20 32  lapFunc,       2
c700: 2c 20 31 2c 20 20 20 20 22 67 65 6f 70 6f 6c 79  , 1,    "geopoly
c710: 5f 6f 76 65 72 6c 61 70 22 20 20 20 20 20 20 20  _overlap"       
c720: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67 65 6f     },.     { geo
c730: 70 6f 6c 79 44 65 62 75 67 46 75 6e 63 2c 20 20  polyDebugFunc,  
c740: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20         1, 0,    
c750: 22 67 65 6f 70 6f 6c 79 5f 64 65 62 75 67 22 20  "geopoly_debug" 
c760: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
c770: 20 20 20 7b 20 67 65 6f 70 6f 6c 79 42 42 6f 78     { geopolyBBox
c780: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 31  Func,          1
c790: 2c 20 31 2c 20 20 20 20 22 67 65 6f 70 6f 6c 79  , 1,    "geopoly
c7a0: 5f 62 62 6f 78 22 20 20 20 20 20 20 20 20 20 20  _bbox"          
c7b0: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67 65 6f     },.     { geo
c7c0: 70 6f 6c 79 58 66 6f 72 6d 46 75 6e 63 2c 20 20  polyXformFunc,  
c7d0: 20 20 20 20 20 20 20 37 2c 20 31 2c 20 20 20 20         7, 1,    
c7e0: 22 67 65 6f 70 6f 6c 79 5f 78 66 6f 72 6d 22 20  "geopoly_xform" 
c7f0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
c800: 20 20 20 7b 20 67 65 6f 70 6f 6c 79 52 65 67 75     { geopolyRegu
c810: 6c 61 72 46 75 6e 63 2c 20 20 20 20 20 20 20 34  larFunc,       4
c820: 2c 20 31 2c 20 20 20 20 22 67 65 6f 70 6f 6c 79  , 1,    "geopoly
c830: 5f 72 65 67 75 6c 61 72 22 20 20 20 20 20 20 20  _regular"       
c840: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67 65 6f     },.     { geo
c850: 70 6f 6c 79 43 63 77 46 75 6e 63 2c 20 20 20 20  polyCcwFunc,    
c860: 20 20 20 20 20 20 20 31 2c 20 31 2c 20 20 20 20         1, 1,    
c870: 22 67 65 6f 70 6f 6c 79 5f 63 63 77 22 20 20 20  "geopoly_ccw"   
c880: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
c890: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
c8a0: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 76  t struct {.    v
c8b0: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
c8c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
c8d0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
c8e0: 2a 29 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a 78  *);.    void (*x
c8f0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
c900: 6f 6e 74 65 78 74 2a 29 3b 0a 20 20 20 20 63 6f  ontext*);.    co
c910: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
c920: 0a 20 20 7d 20 61 41 67 67 5b 5d 20 3d 20 7b 0a  .  } aAgg[] = {.
c930: 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 42 42       { geopolyBB
c940: 6f 78 53 74 65 70 2c 20 67 65 6f 70 6f 6c 79 42  oxStep, geopolyB
c950: 42 6f 78 46 69 6e 61 6c 2c 20 22 67 65 6f 70 6f  BoxFinal, "geopo
c960: 6c 79 5f 67 72 6f 75 70 5f 62 62 6f 78 22 20 20  ly_group_bbox"  
c970: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
c980: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
c990: 73 69 7a 65 6f 66 28 61 46 75 6e 63 29 2f 73 69  sizeof(aFunc)/si
c9a0: 7a 65 6f 66 28 61 46 75 6e 63 5b 30 5d 29 20 26  zeof(aFunc[0]) &
c9b0: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
c9c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 65   i++){.    int e
c9d0: 6e 63 20 3d 20 61 46 75 6e 63 5b 69 5d 2e 62 50  nc = aFunc[i].bP
c9e0: 75 72 65 20 3f 20 53 51 4c 49 54 45 5f 55 54 46  ure ? SQLITE_UTF
c9f0: 38 7c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  8|SQLITE_DETERMI
ca00: 4e 49 53 54 49 43 20 3a 20 53 51 4c 49 54 45 5f  NISTIC : SQLITE_
ca10: 55 54 46 38 3b 0a 20 20 20 20 72 63 20 3d 20 73  UTF8;.    rc = s
ca20: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
ca30: 6e 63 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63  nction(db, aFunc
ca40: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63  [i].zName, aFunc
ca50: 5b 69 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20  [i].nArg,.      
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 20 20 20 20 20 20 20 20 20 65 6e 63 2c 20             enc, 
ca80: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caa0: 20 20 20 20 61 46 75 6e 63 5b 69 5d 2e 78 46 75      aFunc[i].xFu
cab0: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  nc, 0, 0);.  }. 
cac0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
cad0: 6f 66 28 61 41 67 67 29 2f 73 69 7a 65 6f 66 28  of(aAgg)/sizeof(
cae0: 61 41 67 67 5b 30 5d 29 20 26 26 20 72 63 3d 3d  aAgg[0]) && rc==
caf0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
cb00: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
cb10: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
cb20: 6e 28 64 62 2c 20 61 41 67 67 5b 69 5d 2e 7a 4e  n(db, aAgg[i].zN
cb30: 61 6d 65 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  ame, 1, SQLITE_U
cb40: 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb60: 20 20 20 20 20 20 20 20 20 30 2c 20 61 41 67 67           0, aAgg
cb70: 5b 69 5d 2e 78 53 74 65 70 2c 20 61 41 67 67 5b  [i].xStep, aAgg[
cb80: 69 5d 2e 78 46 69 6e 61 6c 29 3b 0a 20 20 7d 0a  i].xFinal);.  }.
cb90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cba0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
cbb0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d  sqlite3_create_m
cbc0: 6f 64 75 6c 65 5f 76 32 28 64 62 2c 20 22 67 65  odule_v2(db, "ge
cbd0: 6f 70 6f 6c 79 22 2c 20 26 67 65 6f 70 6f 6c 79  opoly", &geopoly
cbe0: 4d 6f 64 75 6c 65 2c 20 30 2c 20 30 29 3b 0a 20  Module, 0, 0);. 
cbf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
cc00: 7d 0a                                            }.