Hex Artifact Content
Not logged in

Artifact 48852afbf76861da31691fe230dc73e561682e24:


0000: 2f 2a 0a 0a 20 76 69 72 74 75 61 6c 58 4c 63 20  /*.. virtualXLc 
0010: 2d 2d 20 53 51 4c 69 74 65 33 20 65 78 74 65 6e  -- SQLite3 exten
0020: 73 69 6f 6e 20 5b 56 49 52 54 55 41 4c 20 54 41  sion [VIRTUAL TA
0030: 42 4c 45 20 61 63 63 65 73 73 69 6e 67 20 2e 58  BLE accessing .X
0040: 4c 53 5d 0a 0a 20 76 65 72 73 69 6f 6e 20 34 2e  LS].. version 4.
0050: 33 2c 20 32 30 31 35 20 4a 75 6e 65 20 32 39 0a  3, 2015 June 29.
0060: 0a 20 41 75 74 68 6f 72 3a 20 53 61 6e 64 72 6f  . Author: Sandro
0070: 20 46 75 72 69 65 72 69 20 61 2e 66 75 72 69 65   Furieri a.furie
0080: 72 69 40 6c 71 74 2e 69 74 0a 0a 20 2d 2d 2d 2d  ri@lqt.it.. ----
0090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 0a 20 56 65 72  ---------. . Ver
00e0: 73 69 6f 6e 3a 20 4d 50 4c 20 31 2e 31 2f 47 50  sion: MPL 1.1/GP
00f0: 4c 20 32 2e 30 2f 4c 47 50 4c 20 32 2e 31 0a 20  L 2.0/LGPL 2.1. 
0100: 0a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
0110: 66 20 74 68 69 73 20 66 69 6c 65 20 61 72 65 20  f this file are 
0120: 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4d  subject to the M
0130: 6f 7a 69 6c 6c 61 20 50 75 62 6c 69 63 20 4c 69  ozilla Public Li
0140: 63 65 6e 73 65 20 56 65 72 73 69 6f 6e 0a 20 31  cense Version. 1
0150: 2e 31 20 28 74 68 65 20 22 4c 69 63 65 6e 73 65  .1 (the "License
0160: 22 29 3b 20 79 6f 75 20 6d 61 79 20 6e 6f 74 20  "); you may not 
0170: 75 73 65 20 74 68 69 73 20 66 69 6c 65 20 65 78  use this file ex
0180: 63 65 70 74 20 69 6e 20 63 6f 6d 70 6c 69 61 6e  cept in complian
0190: 63 65 20 77 69 74 68 0a 20 74 68 65 20 4c 69 63  ce with. the Lic
01a0: 65 6e 73 65 2e 20 59 6f 75 20 6d 61 79 20 6f 62  ense. You may ob
01b0: 74 61 69 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  tain a copy of t
01c0: 68 65 20 4c 69 63 65 6e 73 65 20 61 74 0a 20 68  he License at. h
01d0: 74 74 70 3a 2f 2f 77 77 77 2e 6d 6f 7a 69 6c 6c  ttp://www.mozill
01e0: 61 2e 6f 72 67 2f 4d 50 4c 2f 0a 20 0a 53 6f 66  a.org/MPL/. .Sof
01f0: 74 77 61 72 65 20 64 69 73 74 72 69 62 75 74 65  tware distribute
0200: 64 20 75 6e 64 65 72 20 74 68 65 20 4c 69 63 65  d under the Lice
0210: 6e 73 65 20 69 73 20 64 69 73 74 72 69 62 75 74  nse is distribut
0220: 65 64 20 6f 6e 20 61 6e 20 22 41 53 20 49 53 22  ed on an "AS IS"
0230: 20 62 61 73 69 73 2c 0a 57 49 54 48 4f 55 54 20   basis,.WITHOUT 
0240: 57 41 52 52 41 4e 54 59 20 4f 46 20 41 4e 59 20  WARRANTY OF ANY 
0250: 4b 49 4e 44 2c 20 65 69 74 68 65 72 20 65 78 70  KIND, either exp
0260: 72 65 73 73 20 6f 72 20 69 6d 70 6c 69 65 64 2e  ress or implied.
0270: 20 53 65 65 20 74 68 65 20 4c 69 63 65 6e 73 65   See the License
0280: 0a 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69  .for the specifi
0290: 63 20 6c 61 6e 67 75 61 67 65 20 67 6f 76 65 72  c language gover
02a0: 6e 69 6e 67 20 72 69 67 68 74 73 20 61 6e 64 20  ning rights and 
02b0: 6c 69 6d 69 74 61 74 69 6f 6e 73 20 75 6e 64 65  limitations unde
02c0: 72 20 74 68 65 0a 4c 69 63 65 6e 73 65 2e 0a 0a  r the.License...
02d0: 54 68 65 20 4f 72 69 67 69 6e 61 6c 20 43 6f 64  The Original Cod
02e0: 65 20 69 73 20 74 68 65 20 53 70 61 74 69 61 4c  e is the SpatiaL
02f0: 69 74 65 20 6c 69 62 72 61 72 79 0a 0a 54 68 65  ite library..The
0300: 20 49 6e 69 74 69 61 6c 20 44 65 76 65 6c 6f 70   Initial Develop
0310: 65 72 20 6f 66 20 74 68 65 20 4f 72 69 67 69 6e  er of the Origin
0320: 61 6c 20 43 6f 64 65 20 69 73 20 41 6c 65 73 73  al Code is Aless
0330: 61 6e 64 72 6f 20 46 75 72 69 65 72 69 0a 20 0a  andro Furieri. .
0340: 50 6f 72 74 69 6f 6e 73 20 63 72 65 61 74 65 64  Portions created
0350: 20 62 79 20 74 68 65 20 49 6e 69 74 69 61 6c 20   by the Initial 
0360: 44 65 76 65 6c 6f 70 65 72 20 61 72 65 20 43 6f  Developer are Co
0370: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 38  pyright (C) 2008
0380: 2d 32 30 31 35 0a 74 68 65 20 49 6e 69 74 69 61  -2015.the Initia
0390: 6c 20 44 65 76 65 6c 6f 70 65 72 2e 20 41 6c 6c  l Developer. All
03a0: 20 52 69 67 68 74 73 20 52 65 73 65 72 76 65 64   Rights Reserved
03b0: 2e 0a 0a 43 6f 6e 74 72 69 62 75 74 6f 72 28 73  ...Contributor(s
03c0: 29 3a 0a 0a 41 6c 74 65 72 6e 61 74 69 76 65 6c  ):..Alternativel
03d0: 79 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  y, the contents 
03e0: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 6d 61 79  of this file may
03f0: 20 62 65 20 75 73 65 64 20 75 6e 64 65 72 20 74   be used under t
0400: 68 65 20 74 65 72 6d 73 20 6f 66 0a 65 69 74 68  he terms of.eith
0410: 65 72 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72  er the GNU Gener
0420: 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73  al Public Licens
0430: 65 20 56 65 72 73 69 6f 6e 20 32 20 6f 72 20 6c  e Version 2 or l
0440: 61 74 65 72 20 28 74 68 65 20 22 47 50 4c 22 29  ater (the "GPL")
0450: 2c 20 6f 72 0a 74 68 65 20 47 4e 55 20 4c 65 73  , or.the GNU Les
0460: 73 65 72 20 47 65 6e 65 72 61 6c 20 50 75 62 6c  ser General Publ
0470: 69 63 20 4c 69 63 65 6e 73 65 20 56 65 72 73 69  ic License Versi
0480: 6f 6e 20 32 2e 31 20 6f 72 20 6c 61 74 65 72 20  on 2.1 or later 
0490: 28 74 68 65 20 22 4c 47 50 4c 22 29 2c 0a 69 6e  (the "LGPL"),.in
04a0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
04b0: 70 72 6f 76 69 73 69 6f 6e 73 20 6f 66 20 74 68  provisions of th
04c0: 65 20 47 50 4c 20 6f 72 20 74 68 65 20 4c 47 50  e GPL or the LGP
04d0: 4c 20 61 72 65 20 61 70 70 6c 69 63 61 62 6c 65  L are applicable
04e0: 20 69 6e 73 74 65 61 64 0a 6f 66 20 74 68 6f 73   instead.of thos
04f0: 65 20 61 62 6f 76 65 2e 20 49 66 20 79 6f 75 20  e above. If you 
0500: 77 69 73 68 20 74 6f 20 61 6c 6c 6f 77 20 75 73  wish to allow us
0510: 65 20 6f 66 20 79 6f 75 72 20 76 65 72 73 69 6f  e of your versio
0520: 6e 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 6f  n of this file o
0530: 6e 6c 79 0a 75 6e 64 65 72 20 74 68 65 20 74 65  nly.under the te
0540: 72 6d 73 20 6f 66 20 65 69 74 68 65 72 20 74 68  rms of either th
0550: 65 20 47 50 4c 20 6f 72 20 74 68 65 20 4c 47 50  e GPL or the LGP
0560: 4c 2c 20 61 6e 64 20 6e 6f 74 20 74 6f 20 61 6c  L, and not to al
0570: 6c 6f 77 20 6f 74 68 65 72 73 20 74 6f 0a 75 73  low others to.us
0580: 65 20 79 6f 75 72 20 76 65 72 73 69 6f 6e 20 6f  e your version o
0590: 66 20 74 68 69 73 20 66 69 6c 65 20 75 6e 64 65  f this file unde
05a0: 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  r the terms of t
05b0: 68 65 20 4d 50 4c 2c 20 69 6e 64 69 63 61 74 65  he MPL, indicate
05c0: 20 79 6f 75 72 0a 64 65 63 69 73 69 6f 6e 20 62   your.decision b
05d0: 79 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 70  y deleting the p
05e0: 72 6f 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  rovisions above 
05f0: 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65 6d  and replace them
0600: 20 77 69 74 68 20 74 68 65 20 6e 6f 74 69 63 65   with the notice
0610: 0a 61 6e 64 20 6f 74 68 65 72 20 70 72 6f 76 69  .and other provi
0620: 73 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 62  sions required b
0630: 79 20 74 68 65 20 47 50 4c 20 6f 72 20 74 68 65  y the GPL or the
0640: 20 4c 47 50 4c 2e 20 49 66 20 79 6f 75 20 64 6f   LGPL. If you do
0650: 20 6e 6f 74 20 64 65 6c 65 74 65 0a 74 68 65 20   not delete.the 
0660: 70 72 6f 76 69 73 69 6f 6e 73 20 61 62 6f 76 65  provisions above
0670: 2c 20 61 20 72 65 63 69 70 69 65 6e 74 20 6d 61  , a recipient ma
0680: 79 20 75 73 65 20 79 6f 75 72 20 76 65 72 73 69  y use your versi
0690: 6f 6e 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  on of this file 
06a0: 75 6e 64 65 72 0a 74 68 65 20 74 65 72 6d 73 20  under.the terms 
06b0: 6f 66 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74 68  of any one of th
06c0: 65 20 4d 50 4c 2c 20 74 68 65 20 47 50 4c 20 6f  e MPL, the GPL o
06d0: 72 20 74 68 65 20 4c 47 50 4c 2e 0a 20 0a 2a 2f  r the LGPL.. .*/
06e0: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  ..#include <sys/
06f0: 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64  types.h>.#includ
0700: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e  e <stdlib.h>.#in
0710: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0720: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
0730: 2e 68 3e 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .h>..#if defined
0740: 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66  (_WIN32) && !def
0750: 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f  ined(__MINGW32__
0760: 29 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66  ).#include "conf
0770: 69 67 2d 6d 73 76 63 2e 68 22 0a 23 65 6c 73 65  ig-msvc.h".#else
0780: 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69  .#include "confi
0790: 67 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 6e  g.h".#endif..#in
07a0: 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c 69 74  clude <spatialit
07b0: 65 2f 73 71 6c 69 74 65 2e 68 3e 0a 0a 23 69 6e  e/sqlite.h>..#in
07c0: 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c 69 74  clude <spatialit
07d0: 65 2f 73 70 61 74 69 61 6c 69 74 65 2e 68 3e 0a  e/spatialite.h>.
07e0: 23 69 6e 63 6c 75 64 65 20 3c 73 70 61 74 69 61  #include <spatia
07f0: 6c 69 74 65 2f 67 61 69 61 61 75 78 2e 68 3e 0a  lite/gaiaaux.h>.
0800: 23 69 6e 63 6c 75 64 65 20 3c 73 70 61 74 69 61  #include <spatia
0810: 6c 69 74 65 2f 67 61 69 61 67 65 6f 2e 68 3e 0a  lite/gaiageo.h>.
0820: 0a 23 69 66 6e 64 65 66 20 4f 4d 49 54 5f 46 52  .#ifndef OMIT_FR
0830: 45 45 58 4c 0a 23 69 6e 63 6c 75 64 65 20 3c 66  EEXL.#include <f
0840: 72 65 65 78 6c 2e 68 3e 0a 23 65 6e 64 69 66 0a  reexl.h>.#endif.
0850: 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 23  .#ifdef _WIN32.#
0860: 64 65 66 69 6e 65 20 73 74 72 63 61 73 65 63 6d  define strcasecm
0870: 70 09 5f 73 74 72 69 63 6d 70 0a 23 65 6e 64 69  p._stricmp.#endi
0880: 66 20 2f 2a 20 6e 6f 74 20 57 49 4e 33 32 20 2a  f /* not WIN32 *
0890: 2f 0a 0a 23 69 66 6e 64 65 66 20 4f 4d 49 54 5f  /..#ifndef OMIT_
08a0: 49 43 4f 4e 56 09 09 2f 2a 20 69 66 20 49 43 4f  ICONV../* if ICO
08b0: 4e 56 20 69 73 20 64 69 73 61 62 6c 65 64 20 6e  NV is disabled n
08c0: 6f 20 58 4c 20 73 75 70 70 6f 72 74 20 69 73 20  o XL support is 
08d0: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 23 69 66  available */.#if
08e0: 6e 64 65 66 20 4f 4d 49 54 5f 46 52 45 45 58 4c  ndef OMIT_FREEXL
08f0: 09 09 2f 2a 20 46 72 65 65 58 4c 20 69 73 20 64  ../* FreeXL is d
0900: 69 73 61 62 6c 65 64 20 2a 2f 0a 0a 73 74 61 74  isabled */..stat
0910: 69 63 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  ic struct sqlite
0920: 33 5f 6d 6f 64 75 6c 65 20 6d 79 5f 58 4c 5f 6d  3_module my_XL_m
0930: 6f 64 75 6c 65 3b 0a 0a 74 79 70 65 64 65 66 20  odule;..typedef 
0940: 73 74 72 75 63 74 20 56 69 72 74 75 61 6c 58 4c  struct VirtualXL
0950: 53 74 72 75 63 74 0a 7b 0a 2f 2a 20 65 78 74 65  Struct.{./* exte
0960: 6e 64 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nds the sqlite3_
0970: 76 74 61 62 20 73 74 72 75 63 74 20 2a 2f 0a 20  vtab struct */. 
0980: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
0990: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
09a0: 3b 09 2f 2a 20 70 74 72 20 74 6f 20 73 71 6c 69  ;./* ptr to sqli
09b0: 74 65 20 6d 6f 64 75 6c 65 3a 20 55 53 45 44 20  te module: USED 
09c0: 49 4e 54 45 52 4e 41 4c 4c 59 20 42 59 20 53 51  INTERNALLY BY SQ
09d0: 4c 49 54 45 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LITE */.    int 
09e0: 6e 52 65 66 3b 09 09 09 2f 2a 20 23 20 72 65 66  nRef;.../* # ref
09f0: 65 72 65 6e 63 65 73 3a 20 55 53 45 44 20 49 4e  erences: USED IN
0a00: 54 45 52 4e 41 4c 4c 59 20 42 59 20 53 51 4c 49  TERNALLY BY SQLI
0a10: 54 45 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  TE */.    char *
0a20: 7a 45 72 72 4d 73 67 3b 09 09 2f 2a 20 65 72 72  zErrMsg;../* err
0a30: 6f 72 20 6d 65 73 73 61 67 65 3a 20 55 53 45 20  or message: USE 
0a40: 49 4e 54 45 52 4e 41 4c 4c 59 20 42 59 20 53 51  INTERNALLY BY SQ
0a50: 4c 49 54 45 20 2a 2f 0a 20 20 20 20 73 71 6c 69  LITE */.    sqli
0a60: 74 65 33 20 2a 64 62 3b 09 09 2f 2a 20 74 68 65  te3 *db;../* the
0a70: 20 73 71 6c 69 74 65 20 64 62 20 68 6f 6c 64 69   sqlite db holdi
0a80: 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  ng the virtual t
0a90: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  able */.    cons
0aa0: 74 20 76 6f 69 64 20 2a 58 4c 5f 68 61 6e 64 6c  t void *XL_handl
0ab0: 65 3b 09 2f 2a 20 74 68 65 20 58 4c 20 68 61 6e  e;./* the XL han
0ac0: 64 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67  dle */.    unsig
0ad0: 6e 65 64 20 69 6e 74 20 72 6f 77 73 3b 09 09 2f  ned int rows;../
0ae0: 2a 20 57 6f 72 6b 73 68 65 65 74 20 23 72 6f 77  * Worksheet #row
0af0: 73 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  s */.    unsigne
0b00: 64 20 73 68 6f 72 74 20 63 6f 6c 75 6d 6e 73 3b  d short columns;
0b10: 09 2f 2a 20 57 6f 72 6b 73 68 65 65 74 20 23 63  ./* Worksheet #c
0b20: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68  olumns */.    ch
0b30: 61 72 20 66 69 72 73 74 4c 69 6e 65 54 69 74 6c  ar firstLineTitl
0b40: 65 73 3b 09 2f 2a 20 27 59 27 20 6f 72 20 27 4e  es;./* 'Y' or 'N
0b50: 27 20 2a 2f 0a 7d 20 56 69 72 74 75 61 6c 58 4c  ' */.} VirtualXL
0b60: 3b 0a 74 79 70 65 64 65 66 20 56 69 72 74 75 61  ;.typedef Virtua
0b70: 6c 58 4c 20 2a 56 69 72 74 75 61 6c 58 4c 50 74  lXL *VirtualXLPt
0b80: 72 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  r;..typedef stru
0b90: 63 74 20 56 69 72 74 75 61 6c 58 4c 43 6f 6e 73  ct VirtualXLCons
0ba0: 74 72 61 69 6e 74 53 74 72 75 63 74 0a 7b 0a 2f  traintStruct.{./
0bb0: 2a 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  * a constraint t
0bc0: 6f 20 62 65 20 76 65 72 69 66 69 65 64 20 66 6f  o be verified fo
0bd0: 72 20 78 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20  r xFilter */.   
0be0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 09 09 2f   int iColumn;../
0bf0: 2a 20 43 6f 6c 75 6d 6e 20 6f 6e 20 6c 65 66 74  * Column on left
0c00: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f  -hand side of co
0c10: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
0c20: 69 6e 74 20 6f 70 3b 09 09 09 2f 2a 20 43 6f 6e  int op;.../* Con
0c30: 73 74 72 61 69 6e 74 20 6f 70 65 72 61 74 6f 72  straint operator
0c40: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 76 61 6c   */.    char val
0c50: 75 65 54 79 70 65 3b 09 09 2f 2a 20 76 61 6c 75  ueType;../* valu
0c60: 65 20 54 79 70 65 20 28 27 49 27 3d 69 6e 74 2c  e Type ('I'=int,
0c70: 27 44 27 3d 64 6f 75 62 6c 65 2c 27 54 27 3d 74  'D'=double,'T'=t
0c80: 65 78 74 29 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ext) */.    sqli
0c90: 74 65 33 5f 69 6e 74 36 34 20 69 6e 74 56 61 6c  te3_int64 intVal
0ca0: 75 65 3b 09 2f 2a 20 49 6e 74 36 34 20 63 6f 6d  ue;./* Int64 com
0cb0: 70 61 72 69 73 6f 6e 20 76 61 6c 75 65 20 2a 2f  parison value */
0cc0: 0a 20 20 20 20 64 6f 75 62 6c 65 20 64 62 6c 56  .    double dblV
0cd0: 61 6c 75 65 3b 09 09 2f 2a 20 44 6f 75 62 6c 65  alue;../* Double
0ce0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 76 61 6c 75   comparison valu
0cf0: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 74  e */.    char *t
0d00: 78 74 56 61 6c 75 65 3b 09 09 2f 2a 20 54 65 78  xtValue;../* Tex
0d10: 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 76 61 6c  t comparison val
0d20: 75 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ue */.    struct
0d30: 20 56 69 72 74 75 61 6c 58 4c 43 6f 6e 73 74 72   VirtualXLConstr
0d40: 61 69 6e 74 53 74 72 75 63 74 20 2a 6e 65 78 74  aintStruct *next
0d50: 3b 0a 7d 20 56 69 72 74 75 61 6c 58 4c 43 6f 6e  ;.} VirtualXLCon
0d60: 73 74 72 61 69 6e 74 3b 0a 74 79 70 65 64 65 66  straint;.typedef
0d70: 20 56 69 72 74 75 61 6c 58 4c 43 6f 6e 73 74 72   VirtualXLConstr
0d80: 61 69 6e 74 20 2a 56 69 72 74 75 61 6c 58 4c 43  aint *VirtualXLC
0d90: 6f 6e 73 74 72 61 69 6e 74 50 74 72 3b 0a 0a 74  onstraintPtr;..t
0da0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 69  ypedef struct Vi
0db0: 72 74 75 61 6c 58 4c 43 75 72 73 6f 72 53 74 72  rtualXLCursorStr
0dc0: 75 63 74 0a 7b 0a 2f 2a 20 65 78 74 65 6e 64 73  uct.{./* extends
0dd0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
0de0: 62 5f 63 75 72 73 6f 72 20 73 74 72 75 63 74 20  b_cursor struct 
0df0: 2a 2f 0a 20 20 20 20 56 69 72 74 75 61 6c 58 4c  */.    VirtualXL
0e00: 50 74 72 20 70 56 74 61 62 3b 09 09 2f 2a 20 56  Ptr pVtab;../* V
0e10: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 66 20  irtual table of 
0e20: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
0e30: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
0e40: 63 75 72 72 65 6e 74 5f 72 6f 77 3b 09 2f 2a 20  current_row;./* 
0e50: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
0e60: 49 44 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6f  ID */.    int eo
0e70: 66 3b 09 09 09 2f 2a 20 74 68 65 20 45 4f 46 20  f;.../* the EOF 
0e80: 6d 61 72 6b 65 72 20 2a 2f 0a 20 20 20 20 56 69  marker */.    Vi
0e90: 72 74 75 61 6c 58 4c 43 6f 6e 73 74 72 61 69 6e  rtualXLConstrain
0ea0: 74 50 74 72 20 66 69 72 73 74 43 6f 6e 73 74 72  tPtr firstConstr
0eb0: 61 69 6e 74 3b 0a 20 20 20 20 56 69 72 74 75 61  aint;.    Virtua
0ec0: 6c 58 4c 43 6f 6e 73 74 72 61 69 6e 74 50 74 72  lXLConstraintPtr
0ed0: 20 6c 61 73 74 43 6f 6e 73 74 72 61 69 6e 74 3b   lastConstraint;
0ee0: 0a 7d 20 56 69 72 74 75 61 6c 58 4c 43 75 72 73  .} VirtualXLCurs
0ef0: 6f 72 3b 0a 74 79 70 65 64 65 66 20 56 69 72 74  or;.typedef Virt
0f00: 75 61 6c 58 4c 43 75 72 73 6f 72 20 2a 56 69 72  ualXLCursor *Vir
0f10: 74 75 61 6c 58 4c 43 75 72 73 6f 72 50 74 72 3b  tualXLCursorPtr;
0f20: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 76 58 4c  ..static int.vXL
0f30: 5f 63 72 65 61 74 65 20 28 73 71 6c 69 74 65 33  _create (sqlite3
0f40: 20 2a 20 64 62 2c 20 76 6f 69 64 20 2a 70 41 75   * db, void *pAu
0f50: 78 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  x, int argc, con
0f60: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 2a  st char *const *
0f70: 61 72 67 76 2c 0a 09 20 20 20 20 73 71 6c 69 74  argv,..    sqlit
0f80: 65 33 5f 76 74 61 62 20 2a 2a 20 70 70 56 54 61  e3_vtab ** ppVTa
0f90: 62 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 29  b, char **pzErr)
0fa0: 0a 7b 0a 2f 2a 20 63 72 65 61 74 65 73 20 74 68  .{./* creates th
0fb0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
0fc0: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 73 6f 6d  connected to som
0fd0: 65 20 58 4c 53 20 66 69 6c 65 20 2a 2f 0a 20 20  e XLS file */.  
0fe0: 20 20 63 68 61 72 20 2a 73 71 6c 3b 0a 20 20 20    char *sql;.   
0ff0: 20 56 69 72 74 75 61 6c 58 4c 50 74 72 20 70 5f   VirtualXLPtr p_
1000: 76 74 3b 0a 20 20 20 20 63 68 61 72 20 70 61 74  vt;.    char pat
1010: 68 5b 32 30 34 38 5d 3b 0a 20 20 20 20 63 68 61  h[2048];.    cha
1020: 72 20 66 69 72 73 74 4c 69 6e 65 54 69 74 6c 65  r firstLineTitle
1030: 73 20 3d 20 27 4e 27 3b 0a 20 20 20 20 75 6e 73  s = 'N';.    uns
1040: 69 67 6e 65 64 20 69 6e 74 20 77 6f 72 6b 73 68  igned int worksh
1050: 65 65 74 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73  eet = 0;.    uns
1060: 69 67 6e 65 64 20 69 6e 74 20 6d 61 78 5f 77 6f  igned int max_wo
1070: 72 6b 73 68 65 65 74 3b 0a 20 20 20 20 75 6e 73  rksheet;.    uns
1080: 69 67 6e 65 64 20 69 6e 74 20 69 6e 66 6f 3b 0a  igned int info;.
1090: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
10a0: 20 72 6f 77 73 3b 0a 20 20 20 20 75 6e 73 69 67   rows;.    unsig
10b0: 6e 65 64 20 73 68 6f 72 74 20 63 6f 6c 75 6d 6e  ned short column
10c0: 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  s;.    unsigned 
10d0: 73 68 6f 72 74 20 63 6f 6c 3b 0a 20 20 20 20 69  short col;.    i
10e0: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20  nt len;.    int 
10f0: 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76  ret;.    const v
1100: 6f 69 64 20 2a 68 61 6e 64 6c 65 3b 0a 20 20 20  oid *handle;.   
1110: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 50 61   const char *pPa
1120: 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  th = NULL;.    c
1130: 68 61 72 20 2a 78 6e 61 6d 65 3b 0a 20 20 20 20  har *xname;.    
1140: 67 61 69 61 4f 75 74 42 75 66 66 65 72 20 73 71  gaiaOutBuffer sq
1150: 6c 5f 73 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20  l_statement;.   
1160: 20 69 66 20 28 70 41 75 78 29 0a 09 70 41 75 78   if (pAux)..pAux
1170: 20 3d 20 70 41 75 78 3b 09 09 2f 2a 20 75 6e 75   = pAux;../* unu
1180: 73 65 64 20 61 72 67 20 77 61 72 6e 69 6e 67 20  sed arg warning 
1190: 73 75 70 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 2f  suppression */./
11a0: 2a 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 58  * checking for X
11b0: 4c 53 20 50 41 54 48 20 2a 2f 0a 20 20 20 20 69  LS PATH */.    i
11c0: 66 20 28 61 72 67 63 20 3d 3d 20 34 20 7c 7c 20  f (argc == 4 || 
11d0: 61 72 67 63 20 3d 3d 20 35 20 7c 7c 20 61 72 67  argc == 5 || arg
11e0: 63 20 3d 3d 20 36 29 0a 20 20 20 20 20 20 7b 0a  c == 6).      {.
11f0: 09 20 20 70 50 61 74 68 20 3d 20 61 72 67 76 5b  .  pPath = argv[
1200: 33 5d 3b 0a 09 20 20 6c 65 6e 20 3d 20 73 74 72  3];..  len = str
1210: 6c 65 6e 20 28 70 50 61 74 68 29 3b 0a 09 20 20  len (pPath);..  
1220: 69 66 20 28 28 2a 28 70 50 61 74 68 20 2b 20 30  if ((*(pPath + 0
1230: 29 20 3d 3d 20 27 5c 27 27 20 7c 7c 20 2a 28 70  ) == '\'' || *(p
1240: 50 61 74 68 20 2b 20 30 29 20 3d 3d 20 27 22 27  Path + 0) == '"'
1250: 29 0a 09 20 20 20 20 20 20 26 26 20 28 2a 28 70  )..      && (*(p
1260: 50 61 74 68 20 2b 20 6c 65 6e 20 2d 20 31 29 20  Path + len - 1) 
1270: 3d 3d 20 27 5c 27 27 20 7c 7c 20 2a 28 70 50 61  == '\'' || *(pPa
1280: 74 68 20 2b 20 6c 65 6e 20 2d 20 31 29 20 3d 3d  th + len - 1) ==
1290: 20 27 22 27 29 29 0a 09 20 20 20 20 7b 0a 09 09   '"'))..    {...
12a0: 2f 2a 20 74 68 65 20 70 61 74 68 20 69 73 20 65  /* the path is e
12b0: 6e 63 6c 6f 73 65 64 20 62 65 74 77 65 65 6e 20  nclosed between 
12c0: 71 75 6f 74 65 73 20 2d 20 77 65 20 6e 65 65 64  quotes - we need
12d0: 20 74 6f 20 64 65 71 75 6f 74 65 20 69 74 20 2a   to dequote it *
12e0: 2f 0a 09 09 73 74 72 63 70 79 20 28 70 61 74 68  /...strcpy (path
12f0: 2c 20 70 50 61 74 68 20 2b 20 31 29 3b 0a 09 09  , pPath + 1);...
1300: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 70 61  len = strlen (pa
1310: 74 68 29 3b 0a 09 09 2a 28 70 61 74 68 20 2b 20  th);...*(path + 
1320: 6c 65 6e 20 2d 20 31 29 20 3d 20 27 5c 30 27 3b  len - 1) = '\0';
1330: 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
1340: 09 20 20 20 20 20 20 73 74 72 63 70 79 20 28 70  .      strcpy (p
1350: 61 74 68 2c 20 70 50 61 74 68 29 3b 0a 09 20 20  ath, pPath);..  
1360: 69 66 20 28 61 72 67 63 20 3d 3d 20 35 20 7c 7c  if (argc == 5 ||
1370: 20 61 72 67 63 20 3d 3d 20 36 29 0a 09 20 20 20   argc == 6)..   
1380: 20 20 20 77 6f 72 6b 73 68 65 65 74 20 3d 20 61     worksheet = a
1390: 74 6f 69 20 28 61 72 67 76 5b 34 5d 29 3b 0a 09  toi (argv[4]);..
13a0: 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 36 29    if (argc == 6)
13b0: 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 61 74  ..    {...if (at
13c0: 6f 69 20 28 61 72 67 76 5b 35 5d 29 20 3d 3d 20  oi (argv[5]) == 
13d0: 31 29 0a 09 09 20 20 20 20 66 69 72 73 74 4c 69  1)...    firstLi
13e0: 6e 65 54 69 74 6c 65 73 20 3d 20 27 59 27 3b 0a  neTitles = 'Y';.
13f0: 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20  .    }.      }. 
1400: 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
1410: 09 20 20 2a 70 7a 45 72 72 20 3d 0a 09 20 20 20  .  *pzErr =..   
1420: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
1430: 74 66 0a 09 20 20 20 20 20 20 28 22 5b 56 69 72  tf..      ("[Vir
1440: 74 75 61 6c 58 4c 20 6d 6f 64 75 6c 65 5d 20 43  tualXL module] C
1450: 52 45 41 54 45 20 56 49 52 54 55 41 4c 3a 20 69  REATE VIRTUAL: i
1460: 6c 6c 65 67 61 6c 20 61 72 67 20 6c 69 73 74 20  llegal arg list 
1470: 7b 78 6c 73 5f 70 61 74 68 20 5b 2c 20 77 6f 72  {xls_path [, wor
1480: 6b 73 68 65 65 74 5f 69 6e 64 65 78 20 5b 2c 20  ksheet_index [, 
1490: 66 69 72 73 74 5f 6c 69 6e 65 5f 74 69 74 6c 65  first_line_title
14a0: 73 28 31 2f 30 29 5d 5d 7d 22 29 3b 0a 09 20 20  s(1/0)]]}");..  
14b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
14c0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20  ROR;.      }./* 
14d0: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6d  allocating the m
14e0: 61 69 6e 20 58 4c 20 6d 6f 64 75 6c 65 20 2a 2f  ain XL module */
14f0: 0a 20 20 20 20 70 5f 76 74 20 3d 20 28 56 69 72  .    p_vt = (Vir
1500: 74 75 61 6c 58 4c 50 74 72 29 20 73 71 6c 69 74  tualXLPtr) sqlit
1510: 65 33 5f 6d 61 6c 6c 6f 63 20 28 73 69 7a 65 6f  e3_malloc (sizeo
1520: 66 20 28 56 69 72 74 75 61 6c 58 4c 29 29 3b 0a  f (VirtualXL));.
1530: 20 20 20 20 69 66 20 28 21 70 5f 76 74 29 0a 09      if (!p_vt)..
1540: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1550: 4d 45 4d 3b 0a 20 20 20 20 70 5f 76 74 2d 3e 70  MEM;.    p_vt->p
1560: 4d 6f 64 75 6c 65 20 3d 20 26 6d 79 5f 58 4c 5f  Module = &my_XL_
1570: 6d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 5f 76 74  module;.    p_vt
1580: 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 20 20  ->nRef = 0;.    
1590: 70 5f 76 74 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  p_vt->zErrMsg = 
15a0: 4e 55 4c 4c 3b 0a 20 20 20 20 70 5f 76 74 2d 3e  NULL;.    p_vt->
15b0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 5f 76  db = db;.    p_v
15c0: 74 2d 3e 58 4c 5f 68 61 6e 64 6c 65 20 3d 20 4e  t->XL_handle = N
15d0: 55 4c 4c 3b 0a 20 20 20 20 70 5f 76 74 2d 3e 72  ULL;.    p_vt->r
15e0: 6f 77 73 20 3d 20 30 3b 0a 20 20 20 20 70 5f 76  ows = 0;.    p_v
15f0: 74 2d 3e 63 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a  t->columns = 0;.
1600: 20 20 20 20 70 5f 76 74 2d 3e 66 69 72 73 74 4c      p_vt->firstL
1610: 69 6e 65 54 69 74 6c 65 73 20 3d 20 66 69 72 73  ineTitles = firs
1620: 74 4c 69 6e 65 54 69 74 6c 65 73 3b 0a 2f 2a 20  tLineTitles;./* 
1630: 6f 70 65 6e 69 6e 67 20 74 68 65 20 2e 58 4c 53  opening the .XLS
1640: 20 66 69 6c 65 20 5b 57 6f 72 6b 62 6f 6f 6b 5d   file [Workbook]
1650: 20 2a 2f 0a 20 20 20 20 72 65 74 20 3d 20 66 72   */.    ret = fr
1660: 65 65 78 6c 5f 6f 70 65 6e 20 28 70 61 74 68 2c  eexl_open (path,
1670: 20 26 68 61 6e 64 6c 65 29 3b 0a 20 20 20 20 69   &handle);.    i
1680: 66 20 28 72 65 74 20 21 3d 20 46 52 45 45 58 4c  f (ret != FREEXL
1690: 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  _OK).      {..  
16a0: 2f 2a 20 66 72 65 65 20 6d 65 6d 6f 72 79 20 2a  /* free memory *
16b0: 2f 0a 09 20 20 66 72 65 65 78 6c 5f 63 6c 6f 73  /..  freexl_clos
16c0: 65 20 28 68 61 6e 64 6c 65 29 3b 0a 09 20 20 2f  e (handle);..  /
16d0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 20 67  * something is g
16e0: 6f 69 6e 67 20 74 68 65 20 77 72 6f 6e 67 20 77  oing the wrong w
16f0: 61 79 3b 20 63 72 65 61 74 69 6e 67 20 61 20 73  ay; creating a s
1700: 74 75 70 69 64 20 64 65 66 61 75 6c 74 20 74 61  tupid default ta
1710: 62 6c 65 20 2a 2f 0a 09 20 20 78 6e 61 6d 65 20  ble */..  xname 
1720: 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74  = gaiaDoubleQuot
1730: 65 64 53 71 6c 20 28 61 72 67 76 5b 32 5d 29 3b  edSql (argv[2]);
1740: 0a 09 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65  ..  sql = sqlite
1750: 33 5f 6d 70 72 69 6e 74 66 20 28 22 43 52 45 41  3_mprintf ("CREA
1760: 54 45 20 54 41 42 4c 45 20 5c 22 25 73 5c 22 20  TE TABLE \"%s\" 
1770: 28 50 4b 55 49 44 20 49 4e 54 45 47 45 52 29 22  (PKUID INTEGER)"
1780: 2c 20 78 6e 61 6d 65 29 3b 0a 09 20 20 66 72 65  , xname);..  fre
1790: 65 20 28 78 6e 61 6d 65 29 3b 0a 09 20 20 69 66  e (xname);..  if
17a0: 20 28 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72   (sqlite3_declar
17b0: 65 5f 76 74 61 62 20 28 64 62 2c 20 73 71 6c 29  e_vtab (db, sql)
17c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09   != SQLITE_OK)..
17d0: 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f      {...sqlite3_
17e0: 66 72 65 65 20 28 73 71 6c 29 3b 0a 09 09 2a 70  free (sql);...*p
17f0: 7a 45 72 72 20 3d 0a 09 09 20 20 20 20 73 71 6c  zErr =...    sql
1800: 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 09 20  ite3_mprintf... 
1810: 20 20 20 28 22 5b 56 69 72 74 75 61 6c 58 4c 20     ("[VirtualXL 
1820: 6d 6f 64 75 6c 65 5d 20 63 61 6e 6e 6f 74 20 62  module] cannot b
1830: 75 69 6c 64 20 61 20 74 61 62 6c 65 20 66 72 6f  uild a table fro
1840: 6d 20 58 4c 5c 6e 22 29 3b 0a 09 09 72 65 74 75  m XL\n");...retu
1850: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1860: 0a 09 20 20 20 20 7d 0a 09 20 20 73 71 6c 69 74  ..    }..  sqlit
1870: 65 33 5f 66 72 65 65 20 28 73 71 6c 29 3b 0a 09  e3_free (sql);..
1880: 20 20 2a 70 70 56 54 61 62 20 3d 20 28 73 71 6c    *ppVTab = (sql
1890: 69 74 65 33 5f 76 74 61 62 20 2a 29 20 70 5f 76  ite3_vtab *) p_v
18a0: 74 3b 0a 09 20 20 72 65 74 75 72 6e 20 53 51 4c  t;..  return SQL
18b0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
18c0: 2f 2a 20 63 68 65 63 6b 69 6e 67 20 69 66 20 50  /* checking if P
18d0: 61 73 73 77 6f 72 64 20 50 72 6f 74 65 63 74 65  assword Protecte
18e0: 64 20 5b 6f 62 66 75 73 63 61 74 65 64 5d 20 2a  d [obfuscated] *
18f0: 2f 0a 20 20 20 20 66 72 65 65 78 6c 5f 67 65 74  /.    freexl_get
1900: 5f 69 6e 66 6f 20 28 68 61 6e 64 6c 65 2c 20 46  _info (handle, F
1910: 52 45 45 58 4c 5f 42 49 46 46 5f 50 41 53 53 57  REEXL_BIFF_PASSW
1920: 4f 52 44 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ORD, &info);.   
1930: 20 69 66 20 28 69 6e 66 6f 20 21 3d 20 46 52 45   if (info != FRE
1940: 45 58 4c 5f 42 49 46 46 5f 50 4c 41 49 4e 29 0a  EXL_BIFF_PLAIN).
1950: 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 66 72        {..  /* fr
1960: 65 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 09 20 20  ee memory */..  
1970: 66 72 65 65 78 6c 5f 63 6c 6f 73 65 20 28 68 61  freexl_close (ha
1980: 6e 64 6c 65 29 3b 0a 09 20 20 2f 2a 20 4f 62 66  ndle);..  /* Obf
1990: 75 73 63 61 74 65 64 3a 20 63 72 65 61 74 69 6e  uscated: creatin
19a0: 67 20 61 20 73 74 75 70 69 64 20 64 65 66 61 75  g a stupid defau
19b0: 6c 74 20 74 61 62 6c 65 20 2a 2f 0a 09 20 20 78  lt table */..  x
19c0: 6e 61 6d 65 20 3d 20 67 61 69 61 44 6f 75 62 6c  name = gaiaDoubl
19d0: 65 51 75 6f 74 65 64 53 71 6c 20 28 61 72 67 76  eQuotedSql (argv
19e0: 5b 32 5d 29 3b 0a 09 20 20 73 71 6c 20 3d 20 73  [2]);..  sql = s
19f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28  qlite3_mprintf (
1a00: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22  "CREATE TABLE \"
1a10: 25 73 5c 22 20 28 50 4b 55 49 44 20 49 4e 54 45  %s\" (PKUID INTE
1a20: 47 45 52 29 22 2c 20 78 6e 61 6d 65 29 3b 0a 09  GER)", xname);..
1a30: 20 20 66 72 65 65 20 28 78 6e 61 6d 65 29 3b 0a    free (xname);.
1a40: 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 64  .  if (sqlite3_d
1a50: 65 63 6c 61 72 65 5f 76 74 61 62 20 28 64 62 2c  eclare_vtab (db,
1a60: 20 73 71 6c 29 20 21 3d 20 53 51 4c 49 54 45 5f   sql) != SQLITE_
1a70: 4f 4b 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  OK)..    {...sql
1a80: 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c 29 3b  ite3_free (sql);
1a90: 0a 09 09 2a 70 7a 45 72 72 20 3d 0a 09 09 20 20  ...*pzErr =...  
1aa0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
1ab0: 66 0a 09 09 20 20 20 20 28 22 5b 56 69 72 74 75  f...    ("[Virtu
1ac0: 61 6c 58 4c 20 6d 6f 64 75 6c 65 5d 20 50 61 73  alXL module] Pas
1ad0: 73 77 6f 72 64 20 70 72 6f 74 65 63 74 65 64 20  sword protected 
1ae0: 5b 6f 62 66 75 73 63 61 74 65 64 5d 20 2e 78 6c  [obfuscated] .xl
1af0: 73 5c 6e 22 29 3b 0a 09 09 72 65 74 75 72 6e 20  s\n");...return 
1b00: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 09 20  SQLITE_ERROR;.. 
1b10: 20 20 20 7d 0a 09 20 20 73 71 6c 69 74 65 33 5f     }..  sqlite3_
1b20: 66 72 65 65 20 28 73 71 6c 29 3b 0a 09 20 20 2a  free (sql);..  *
1b30: 70 70 56 54 61 62 20 3d 20 28 73 71 6c 69 74 65  ppVTab = (sqlite
1b40: 33 5f 76 74 61 62 20 2a 29 20 70 5f 76 74 3b 0a  3_vtab *) p_vt;.
1b50: 09 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b60: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20  _OK;.      }./* 
1b70: 71 75 65 72 79 69 6e 67 20 68 6f 77 20 6d 61 6e  querying how man
1b80: 79 20 57 6f 72 6b 73 68 65 65 74 73 20 61 72 65  y Worksheets are
1b90: 20 74 68 65 72 65 20 2a 2f 0a 20 20 20 20 66 72   there */.    fr
1ba0: 65 65 78 6c 5f 67 65 74 5f 69 6e 66 6f 20 28 68  eexl_get_info (h
1bb0: 61 6e 64 6c 65 2c 20 46 52 45 45 58 4c 5f 42 49  andle, FREEXL_BI
1bc0: 46 46 5f 53 48 45 45 54 5f 43 4f 55 4e 54 2c 20  FF_SHEET_COUNT, 
1bd0: 26 6d 61 78 5f 77 6f 72 6b 73 68 65 65 74 29 3b  &max_worksheet);
1be0: 0a 20 20 20 20 69 66 20 28 77 6f 72 6b 73 68 65  .    if (workshe
1bf0: 65 74 20 3e 3d 20 6d 61 78 5f 77 6f 72 6b 73 68  et >= max_worksh
1c00: 65 65 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  eet).      {..  
1c10: 2f 2a 20 66 72 65 65 20 6d 65 6d 6f 72 79 20 2a  /* free memory *
1c20: 2f 0a 09 20 20 66 72 65 65 78 6c 5f 63 6c 6f 73  /..  freexl_clos
1c30: 65 20 28 68 61 6e 64 6c 65 29 3b 0a 09 20 20 2f  e (handle);..  /
1c40: 2a 20 6e 6f 20 73 75 63 68 20 57 6f 72 6b 73 68  * no such Worksh
1c50: 65 65 74 3a 20 63 72 65 61 74 69 6e 67 20 61 20  eet: creating a 
1c60: 73 74 75 70 69 64 20 64 65 66 61 75 6c 74 20 74  stupid default t
1c70: 61 62 6c 65 20 2a 2f 0a 09 20 20 78 6e 61 6d 65  able */..  xname
1c80: 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f   = gaiaDoubleQuo
1c90: 74 65 64 53 71 6c 20 28 61 72 67 76 5b 32 5d 29  tedSql (argv[2])
1ca0: 3b 0a 09 20 20 73 71 6c 20 3d 20 73 71 6c 69 74  ;..  sql = sqlit
1cb0: 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 43 52 45  e3_mprintf ("CRE
1cc0: 41 54 45 20 54 41 42 4c 45 20 5c 22 25 73 5c 22  ATE TABLE \"%s\"
1cd0: 20 28 50 4b 55 49 44 20 49 4e 54 45 47 45 52 29   (PKUID INTEGER)
1ce0: 22 2c 20 78 6e 61 6d 65 29 3b 0a 09 20 20 66 72  ", xname);..  fr
1cf0: 65 65 20 28 78 6e 61 6d 65 29 3b 0a 09 20 20 69  ee (xname);..  i
1d00: 66 20 28 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  f (sqlite3_decla
1d10: 72 65 5f 76 74 61 62 20 28 64 62 2c 20 73 71 6c  re_vtab (db, sql
1d20: 29 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  ) != SQLITE_OK).
1d30: 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
1d40: 5f 66 72 65 65 20 28 73 71 6c 29 3b 0a 09 09 2a  _free (sql);...*
1d50: 70 7a 45 72 72 20 3d 0a 09 09 20 20 20 20 73 71  pzErr =...    sq
1d60: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 09  lite3_mprintf...
1d70: 20 20 20 20 28 22 5b 56 69 72 74 75 61 6c 58 4c      ("[VirtualXL
1d80: 20 6d 6f 64 75 6c 65 5d 20 6e 6f 20 73 75 63 68   module] no such
1d90: 20 57 6f 72 6b 73 68 65 65 74 20 5b 69 6e 64 65   Worksheet [inde
1da0: 78 3d 25 75 5d 5c 6e 22 2c 0a 09 09 20 20 20 20  x=%u]\n",...    
1db0: 20 77 6f 72 6b 73 68 65 65 74 29 3b 0a 09 09 72   worksheet);...r
1dc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1dd0: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 73 71  OR;..    }..  sq
1de0: 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c 29  lite3_free (sql)
1df0: 3b 0a 09 20 20 2a 70 70 56 54 61 62 20 3d 20 28  ;..  *ppVTab = (
1e00: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 20  sqlite3_vtab *) 
1e10: 70 5f 76 74 3b 0a 09 20 20 72 65 74 75 72 6e 20  p_vt;..  return 
1e20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1e30: 20 7d 0a 2f 2a 20 73 65 6c 65 63 74 69 6e 67 20   }./* selecting 
1e40: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 61 63  the currently ac
1e50: 74 69 76 65 20 58 4c 20 57 6f 72 6b 73 68 65 65  tive XL Workshee
1e60: 74 20 2a 2f 0a 20 20 20 20 66 72 65 65 78 6c 5f  t */.    freexl_
1e70: 73 65 6c 65 63 74 5f 61 63 74 69 76 65 5f 77 6f  select_active_wo
1e80: 72 6b 73 68 65 65 74 20 28 68 61 6e 64 6c 65 2c  rksheet (handle,
1e90: 20 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74   (unsigned short
1ea0: 29 20 77 6f 72 6b 73 68 65 65 74 29 3b 0a 20 20  ) worksheet);.  
1eb0: 20 20 66 72 65 65 78 6c 5f 77 6f 72 6b 73 68 65    freexl_workshe
1ec0: 65 74 5f 64 69 6d 65 6e 73 69 6f 6e 73 20 28 68  et_dimensions (h
1ed0: 61 6e 64 6c 65 2c 20 26 72 6f 77 73 2c 20 26 63  andle, &rows, &c
1ee0: 6f 6c 75 6d 6e 73 29 3b 0a 20 20 20 20 70 5f 76  olumns);.    p_v
1ef0: 74 2d 3e 58 4c 5f 68 61 6e 64 6c 65 20 3d 20 68  t->XL_handle = h
1f00: 61 6e 64 6c 65 3b 0a 20 20 20 20 70 5f 76 74 2d  andle;.    p_vt-
1f10: 3e 72 6f 77 73 20 3d 20 72 6f 77 73 3b 0a 20 20  >rows = rows;.  
1f20: 20 20 70 5f 76 74 2d 3e 63 6f 6c 75 6d 6e 73 20    p_vt->columns 
1f30: 3d 20 63 6f 6c 75 6d 6e 73 3b 0a 2f 2a 20 70 72  = columns;./* pr
1f40: 65 70 61 72 69 6e 67 20 74 68 65 20 43 4f 4c 55  eparing the COLU
1f50: 4d 4e 73 20 66 6f 72 20 74 68 69 73 20 56 49 52  MNs for this VIR
1f60: 54 55 41 4c 20 54 41 42 4c 45 20 2a 2f 0a 20 20  TUAL TABLE */.  
1f70: 20 20 67 61 69 61 4f 75 74 42 75 66 66 65 72 49    gaiaOutBufferI
1f80: 6e 69 74 69 61 6c 69 7a 65 20 28 26 73 71 6c 5f  nitialize (&sql_
1f90: 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20  statement);.    
1fa0: 78 6e 61 6d 65 20 3d 20 67 61 69 61 44 6f 75 62  xname = gaiaDoub
1fb0: 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 61 72 67  leQuotedSql (arg
1fc0: 76 5b 32 5d 29 3b 0a 20 20 20 20 73 71 6c 20 3d  v[2]);.    sql =
1fd0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1fe0: 20 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20   ("CREATE TABLE 
1ff0: 5c 22 25 73 5c 22 20 28 72 6f 77 5f 6e 6f 20 49  \"%s\" (row_no I
2000: 4e 54 45 47 45 52 22 2c 20 78 6e 61 6d 65 29 3b  NTEGER", xname);
2010: 0a 20 20 20 20 66 72 65 65 20 28 78 6e 61 6d 65  .    free (xname
2020: 29 3b 0a 20 20 20 20 67 61 69 61 41 70 70 65 6e  );.    gaiaAppen
2030: 64 54 6f 4f 75 74 42 75 66 66 65 72 20 28 26 73  dToOutBuffer (&s
2040: 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 73 71  ql_statement, sq
2050: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
2060: 66 72 65 65 20 28 73 71 6c 29 3b 0a 20 20 20 20  free (sql);.    
2070: 69 66 20 28 66 69 72 73 74 4c 69 6e 65 54 69 74  if (firstLineTit
2080: 6c 65 73 20 3d 3d 20 27 59 27 29 0a 20 20 20 20  les == 'Y').    
2090: 20 20 7b 0a 09 20 20 2f 2a 20 66 65 74 63 68 69    {..  /* fetchi
20a0: 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ng column names 
20b0: 2a 2f 0a 09 20 20 66 6f 72 20 28 63 6f 6c 20 3d  */..  for (col =
20c0: 20 30 3b 20 63 6f 6c 20 3c 20 63 6f 6c 75 6d 6e   0; col < column
20d0: 73 3b 20 63 6f 6c 2b 2b 29 0a 09 20 20 20 20 7b  s; col++)..    {
20e0: 0a 09 09 46 72 65 65 58 4c 5f 43 65 6c 6c 56 61  ...FreeXL_CellVa
20f0: 6c 75 65 20 63 65 6c 6c 3b 0a 09 09 69 6e 74 20  lue cell;...int 
2100: 72 65 74 20 3d 20 66 72 65 65 78 6c 5f 67 65 74  ret = freexl_get
2110: 5f 63 65 6c 6c 5f 76 61 6c 75 65 20 28 68 61 6e  _cell_value (han
2120: 64 6c 65 2c 20 30 2c 20 63 6f 6c 2c 20 26 63 65  dle, 0, col, &ce
2130: 6c 6c 29 3b 0a 09 09 69 66 20 28 72 65 74 20 21  ll);...if (ret !
2140: 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 09 20  = FREEXL_OK)... 
2150: 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33     sql = sqlite3
2160: 5f 6d 70 72 69 6e 74 66 20 28 22 63 6f 6c 5f 25  _mprintf ("col_%
2170: 64 22 2c 20 63 6f 6c 29 3b 0a 09 09 65 6c 73 65  d", col);...else
2180: 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 69  ...  {...      i
2190: 66 20 28 63 65 6c 6c 2e 74 79 70 65 20 3d 3d 20  f (cell.type == 
21a0: 46 52 45 45 58 4c 5f 43 45 4c 4c 5f 49 4e 54 29  FREEXL_CELL_INT)
21b0: 0a 09 09 09 20 20 73 71 6c 20 3d 20 73 71 6c 69  ....  sql = sqli
21c0: 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 64  te3_mprintf ("%d
21d0: 22 2c 20 63 65 6c 6c 2e 76 61 6c 75 65 2e 69 6e  ", cell.value.in
21e0: 74 5f 76 61 6c 75 65 29 3b 0a 09 09 20 20 20 20  t_value);...    
21f0: 20 20 65 6c 73 65 20 69 66 20 28 63 65 6c 6c 2e    else if (cell.
2200: 74 79 70 65 20 3d 3d 20 46 52 45 45 58 4c 5f 43  type == FREEXL_C
2210: 45 4c 4c 5f 44 4f 55 42 4c 45 29 0a 09 09 09 20  ELL_DOUBLE).... 
2220: 20 73 71 6c 20 3d 0a 09 09 09 20 20 20 20 20 20   sql =....      
2230: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
2240: 28 22 25 31 2e 32 66 22 2c 0a 09 09 09 09 09 20  ("%1.2f",...... 
2250: 20 20 20 20 20 20 63 65 6c 6c 2e 76 61 6c 75 65        cell.value
2260: 2e 64 6f 75 62 6c 65 5f 76 61 6c 75 65 29 3b 0a  .double_value);.
2270: 09 09 20 20 20 20 20 20 65 6c 73 65 20 69 66 20  ..      else if 
2280: 28 63 65 6c 6c 2e 74 79 70 65 20 3d 3d 20 46 52  (cell.type == FR
2290: 45 45 58 4c 5f 43 45 4c 4c 5f 54 45 58 54 0a 09  EEXL_CELL_TEXT..
22a0: 09 09 20 20 20 20 20 20 20 7c 7c 20 63 65 6c 6c  ..       || cell
22b0: 2e 74 79 70 65 20 3d 3d 20 46 52 45 45 58 4c 5f  .type == FREEXL_
22c0: 43 45 4c 4c 5f 53 53 54 5f 54 45 58 54 0a 09 09  CELL_SST_TEXT...
22d0: 09 20 20 20 20 20 20 20 7c 7c 20 63 65 6c 6c 2e  .       || cell.
22e0: 74 79 70 65 20 3d 3d 20 46 52 45 45 58 4c 5f 43  type == FREEXL_C
22f0: 45 4c 4c 5f 44 41 54 45 0a 09 09 09 20 20 20 20  ELL_DATE....    
2300: 20 20 20 7c 7c 20 63 65 6c 6c 2e 74 79 70 65 20     || cell.type 
2310: 3d 3d 20 46 52 45 45 58 4c 5f 43 45 4c 4c 5f 44  == FREEXL_CELL_D
2320: 41 54 45 54 49 4d 45 0a 09 09 09 20 20 20 20 20  ATETIME....     
2330: 20 20 7c 7c 20 63 65 6c 6c 2e 74 79 70 65 20 3d    || cell.type =
2340: 3d 20 46 52 45 45 58 4c 5f 43 45 4c 4c 5f 54 49  = FREEXL_CELL_TI
2350: 4d 45 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20  ME)....{....    
2360: 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
2370: 20 28 63 65 6c 6c 2e 76 61 6c 75 65 2e 74 65 78   (cell.value.tex
2380: 74 5f 76 61 6c 75 65 29 3b 0a 09 09 09 20 20 20  t_value);....   
2390: 20 69 66 20 28 6c 65 6e 20 3c 20 32 35 36 29 0a   if (len < 256).
23a0: 09 09 09 09 73 71 6c 20 3d 0a 09 09 09 09 20 20  ....sql =.....  
23b0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
23c0: 66 20 28 22 25 73 22 2c 0a 09 09 09 09 09 09 20  f ("%s",....... 
23d0: 20 20 20 20 63 65 6c 6c 2e 76 61 6c 75 65 2e 74      cell.value.t
23e0: 65 78 74 5f 76 61 6c 75 65 29 3b 0a 09 09 09 20  ext_value);.... 
23f0: 20 20 20 65 6c 73 65 0a 09 09 09 09 73 71 6c 20     else.....sql 
2400: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2410: 66 20 28 22 63 6f 6c 5f 25 64 22 2c 20 63 6f 6c  f ("col_%d", col
2420: 29 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20  );....}...      
2430: 65 6c 73 65 0a 09 09 09 20 20 73 71 6c 20 3d 20  else....  sql = 
2440: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
2450: 28 22 63 6f 6c 5f 25 64 22 2c 20 63 6f 6c 29 3b  ("col_%d", col);
2460: 0a 09 09 20 20 7d 0a 09 09 78 6e 61 6d 65 20 3d  ...  }...xname =
2470: 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65   gaiaDoubleQuote
2480: 64 53 71 6c 20 28 73 71 6c 29 3b 0a 09 09 73 71  dSql (sql);...sq
2490: 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c 29  lite3_free (sql)
24a0: 3b 0a 09 09 73 71 6c 20 3d 20 73 71 6c 69 74 65  ;...sql = sqlite
24b0: 33 5f 6d 70 72 69 6e 74 66 20 28 22 2c 20 5c 22  3_mprintf (", \"
24c0: 25 73 5c 22 22 2c 20 78 6e 61 6d 65 29 3b 0a 09  %s\"", xname);..
24d0: 09 66 72 65 65 20 28 78 6e 61 6d 65 29 3b 0a 09  .free (xname);..
24e0: 09 67 61 69 61 41 70 70 65 6e 64 54 6f 4f 75 74  .gaiaAppendToOut
24f0: 42 75 66 66 65 72 20 28 26 73 71 6c 5f 73 74 61  Buffer (&sql_sta
2500: 74 65 6d 65 6e 74 2c 20 73 71 6c 29 3b 0a 09 09  tement, sql);...
2510: 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71  sqlite3_free (sq
2520: 6c 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20  l);..    }.     
2530: 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
2540: 20 20 7b 0a 09 20 20 2f 2a 20 73 65 74 74 69 6e    {..  /* settin
2550: 67 20 64 65 66 61 75 6c 74 20 63 6f 6c 75 6d 6e  g default column
2560: 20 6e 61 6d 65 73 20 2a 2f 0a 09 20 20 66 6f 72   names */..  for
2570: 20 28 63 6f 6c 20 3d 20 30 3b 20 63 6f 6c 20 3c   (col = 0; col <
2580: 20 63 6f 6c 75 6d 6e 73 3b 20 63 6f 6c 2b 2b 29   columns; col++)
2590: 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 20 3d 20  ..    {...sql = 
25a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
25b0: 28 22 63 6f 6c 5f 25 64 22 2c 20 63 6f 6c 29 3b  ("col_%d", col);
25c0: 0a 09 09 78 6e 61 6d 65 20 3d 20 67 61 69 61 44  ...xname = gaiaD
25d0: 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28  oubleQuotedSql (
25e0: 73 71 6c 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f  sql);...sqlite3_
25f0: 66 72 65 65 20 28 73 71 6c 29 3b 0a 09 09 73 71  free (sql);...sq
2600: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
2610: 6e 74 66 20 28 22 2c 20 5c 22 25 73 5c 22 22 2c  ntf (", \"%s\"",
2620: 20 78 6e 61 6d 65 29 3b 0a 09 09 66 72 65 65 20   xname);...free 
2630: 28 78 6e 61 6d 65 29 3b 0a 09 09 67 61 69 61 41  (xname);...gaiaA
2640: 70 70 65 6e 64 54 6f 4f 75 74 42 75 66 66 65 72  ppendToOutBuffer
2650: 20 28 26 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74   (&sql_statement
2660: 2c 20 73 71 6c 29 3b 0a 09 09 73 71 6c 69 74 65  , sql);...sqlite
2670: 33 5f 66 72 65 65 20 28 73 71 6c 29 3b 0a 09 20  3_free (sql);.. 
2680: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2690: 20 67 61 69 61 41 70 70 65 6e 64 54 6f 4f 75 74   gaiaAppendToOut
26a0: 42 75 66 66 65 72 20 28 26 73 71 6c 5f 73 74 61  Buffer (&sql_sta
26b0: 74 65 6d 65 6e 74 2c 20 22 29 22 29 3b 0a 20 20  tement, ")");.  
26c0: 20 20 69 66 20 28 73 71 6c 5f 73 74 61 74 65 6d    if (sql_statem
26d0: 65 6e 74 2e 45 72 72 6f 72 20 3d 3d 20 30 20 26  ent.Error == 0 &
26e0: 26 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2e  & sql_statement.
26f0: 42 75 66 66 65 72 20 21 3d 20 4e 55 4c 4c 29 0a  Buffer != NULL).
2700: 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73        {..  if (s
2710: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
2720: 74 61 62 20 28 64 62 2c 20 73 71 6c 5f 73 74 61  tab (db, sql_sta
2730: 74 65 6d 65 6e 74 2e 42 75 66 66 65 72 29 20 21  tement.Buffer) !
2740: 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 20  = SQLITE_OK)..  
2750: 20 20 7b 0a 09 09 2a 70 7a 45 72 72 20 3d 0a 09    {...*pzErr =..
2760: 09 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
2770: 69 6e 74 66 0a 09 09 20 20 20 20 28 22 5b 56 69  intf...    ("[Vi
2780: 72 74 75 61 6c 58 4c 20 6d 6f 64 75 6c 65 5d 20  rtualXL module] 
2790: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 3a 20  CREATE VIRTUAL: 
27a0: 69 6e 76 61 6c 69 64 20 53 51 4c 20 73 74 61 74  invalid SQL stat
27b0: 65 6d 65 6e 74 20 5c 22 25 73 5c 22 22 2c 0a 09  ement \"%s\"",..
27c0: 09 20 20 20 20 20 73 71 6c 5f 73 74 61 74 65 6d  .     sql_statem
27d0: 65 6e 74 2e 42 75 66 66 65 72 29 3b 0a 09 09 67  ent.Buffer);...g
27e0: 61 69 61 4f 75 74 42 75 66 66 65 72 52 65 73 65  aiaOutBufferRese
27f0: 74 20 28 26 73 71 6c 5f 73 74 61 74 65 6d 65 6e  t (&sql_statemen
2800: 74 29 3b 0a 09 09 72 65 74 75 72 6e 20 53 51 4c  t);...return SQL
2810: 49 54 45 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  ITE_ERROR;..    
2820: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61  }.      }.    ga
2830: 69 61 4f 75 74 42 75 66 66 65 72 52 65 73 65 74  iaOutBufferReset
2840: 20 28 26 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74   (&sql_statement
2850: 29 3b 0a 20 20 20 20 2a 70 70 56 54 61 62 20 3d  );.    *ppVTab =
2860: 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a   (sqlite3_vtab *
2870: 29 20 70 5f 76 74 3b 0a 20 20 20 20 72 65 74 75  ) p_vt;.    retu
2880: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2890: 0a 73 74 61 74 69 63 20 69 6e 74 0a 76 58 4c 5f  .static int.vXL_
28a0: 63 6f 6e 6e 65 63 74 20 28 73 71 6c 69 74 65 33  connect (sqlite3
28b0: 20 2a 20 64 62 2c 20 76 6f 69 64 20 2a 70 41 75   * db, void *pAu
28c0: 78 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  x, int argc, con
28d0: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 2a  st char *const *
28e0: 61 72 67 76 2c 0a 09 20 20 20 20 20 73 71 6c 69  argv,..     sqli
28f0: 74 65 33 5f 76 74 61 62 20 2a 2a 20 70 70 56 54  te3_vtab ** ppVT
2900: 61 62 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ab, char **pzErr
2910: 29 0a 7b 0a 2f 2a 20 63 6f 6e 6e 65 63 74 73 20  ).{./* connects 
2920: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
2930: 65 20 74 6f 20 61 20 2e 78 6c 73 20 66 69 6c 65  e to a .xls file
2940: 20 2d 20 73 69 6d 70 6c 79 20 61 6c 69 61 73 65   - simply aliase
2950: 73 20 76 58 4c 5f 63 72 65 61 74 65 28 29 20 2a  s vXL_create() *
2960: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 76 58 4c  /.    return vXL
2970: 5f 63 72 65 61 74 65 20 28 64 62 2c 20 70 41 75  _create (db, pAu
2980: 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 70  x, argc, argv, p
2990: 70 56 54 61 62 2c 20 70 7a 45 72 72 29 3b 0a 7d  pVTab, pzErr);.}
29a0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 76 58 4c  ..static int.vXL
29b0: 5f 62 65 73 74 5f 69 6e 64 65 78 20 28 73 71 6c  _best_index (sql
29c0: 69 74 65 33 5f 76 74 61 62 20 2a 20 70 56 54 61  ite3_vtab * pVTa
29d0: 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
29e0: 5f 69 6e 66 6f 20 2a 20 70 49 6e 64 65 78 29 0a  _info * pIndex).
29f0: 7b 0a 2f 2a 20 62 65 73 74 20 69 6e 64 65 78 20  {./* best index 
2a00: 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  selection */.   
2a10: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
2a20: 69 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 63 68  iArg = 0;.    ch
2a30: 61 72 20 73 74 72 5b 32 30 34 38 5d 3b 0a 20 20  ar str[2048];.  
2a40: 20 20 63 68 61 72 20 62 75 66 5b 36 34 5d 3b 0a    char buf[64];.
2a50: 0a 20 20 20 20 69 66 20 28 70 56 54 61 62 29 0a  .    if (pVTab).
2a60: 09 70 56 54 61 62 20 3d 20 70 56 54 61 62 3b 09  .pVTab = pVTab;.
2a70: 09 2f 2a 20 75 6e 75 73 65 64 20 61 72 67 20 77  ./* unused arg w
2a80: 61 72 6e 69 6e 67 20 73 75 70 70 72 65 73 73 69  arning suppressi
2a90: 6f 6e 20 2a 2f 0a 0a 20 20 20 20 2a 73 74 72 20  on */..    *str 
2aa0: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6f 72 20  = '\0';.    for 
2ab0: 28 69 20 3d 20 30 3b 20 69 20 3c 20 70 49 6e 64  (i = 0; i < pInd
2ac0: 65 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ex->nConstraint;
2ad0: 20 69 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20   i++).      {.. 
2ae0: 20 69 66 20 28 70 49 6e 64 65 78 2d 3e 61 43 6f   if (pIndex->aCo
2af0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
2b00: 6c 65 29 0a 09 20 20 20 20 7b 0a 09 09 69 41 72  le)..    {...iAr
2b10: 67 2b 2b 3b 0a 09 09 70 49 6e 64 65 78 2d 3e 61  g++;...pIndex->a
2b20: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
2b30: 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 69  i].argvIndex = i
2b40: 41 72 67 3b 0a 09 09 70 49 6e 64 65 78 2d 3e 61  Arg;...pIndex->a
2b50: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
2b60: 69 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 09 09 73  i].omit = 1;...s
2b70: 70 72 69 6e 74 66 20 28 62 75 66 2c 20 22 25 64  printf (buf, "%d
2b80: 3a 25 64 2c 22 2c 20 70 49 6e 64 65 78 2d 3e 61  :%d,", pIndex->a
2b90: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
2ba0: 6f 6c 75 6d 6e 2c 0a 09 09 09 20 70 49 6e 64 65  olumn,.... pInde
2bb0: 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  x->aConstraint[i
2bc0: 5d 2e 6f 70 29 3b 0a 09 09 73 74 72 63 61 74 20  ].op);...strcat 
2bd0: 28 73 74 72 2c 20 62 75 66 29 3b 0a 09 20 20 20  (str, buf);..   
2be0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69   }.      }.    i
2bf0: 66 20 28 2a 73 74 72 20 21 3d 20 27 5c 30 27 29  f (*str != '\0')
2c00: 0a 20 20 20 20 20 20 7b 0a 09 20 20 70 49 6e 64  .      {..  pInd
2c10: 65 78 2d 3e 69 64 78 53 74 72 20 3d 20 73 71 6c  ex->idxStr = sql
2c20: 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25  ite3_mprintf ("%
2c30: 73 22 2c 20 73 74 72 29 3b 0a 09 20 20 70 49 6e  s", str);..  pIn
2c40: 64 65 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  dex->needToFreeI
2c50: 64 78 53 74 72 20 3d 20 31 3b 0a 20 20 20 20 20  dxStr = 1;.     
2c60: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53   }..    return S
2c70: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
2c80: 74 69 63 20 69 6e 74 0a 76 58 4c 5f 64 69 73 63  tic int.vXL_disc
2c90: 6f 6e 6e 65 63 74 20 28 73 71 6c 69 74 65 33 5f  onnect (sqlite3_
2ca0: 76 74 61 62 20 2a 20 70 56 54 61 62 29 0a 7b 0a  vtab * pVTab).{.
2cb0: 2f 2a 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 74  /* disconnects t
2cc0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
2cd0: 20 2a 2f 0a 20 20 20 20 56 69 72 74 75 61 6c 58   */.    VirtualX
2ce0: 4c 50 74 72 20 70 5f 76 74 20 3d 20 28 56 69 72  LPtr p_vt = (Vir
2cf0: 74 75 61 6c 58 4c 50 74 72 29 20 70 56 54 61 62  tualXLPtr) pVTab
2d00: 3b 0a 20 20 20 20 69 66 20 28 70 5f 76 74 2d 3e  ;.    if (p_vt->
2d10: 58 4c 5f 68 61 6e 64 6c 65 29 0a 09 66 72 65 65  XL_handle)..free
2d20: 78 6c 5f 63 6c 6f 73 65 20 28 70 5f 76 74 2d 3e  xl_close (p_vt->
2d30: 58 4c 5f 68 61 6e 64 6c 65 29 3b 0a 20 20 20 20  XL_handle);.    
2d40: 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 5f  sqlite3_free (p_
2d50: 76 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  vt);.    return 
2d60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
2d70: 61 74 69 63 20 69 6e 74 0a 76 58 4c 5f 64 65 73  atic int.vXL_des
2d80: 74 72 6f 79 20 28 73 71 6c 69 74 65 33 5f 76 74  troy (sqlite3_vt
2d90: 61 62 20 2a 20 70 56 54 61 62 29 0a 7b 0a 2f 2a  ab * pVTab).{./*
2da0: 20 64 65 73 74 72 6f 79 73 20 74 68 65 20 76 69   destroys the vi
2db0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2d 20 73 69  rtual table - si
2dc0: 6d 70 6c 79 20 61 6c 69 61 73 65 73 20 76 58 4c  mply aliases vXL
2dd0: 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 20 2a 2f  _disconnect() */
2de0: 0a 20 20 20 20 72 65 74 75 72 6e 20 76 58 4c 5f  .    return vXL_
2df0: 64 69 73 63 6f 6e 6e 65 63 74 20 28 70 56 54 61  disconnect (pVTa
2e00: 62 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  b);.}..static vo
2e10: 69 64 0a 76 58 4c 5f 72 65 61 64 5f 72 6f 77 20  id.vXL_read_row 
2e20: 28 56 69 72 74 75 61 6c 58 4c 43 75 72 73 6f 72  (VirtualXLCursor
2e30: 50 74 72 20 63 75 72 73 6f 72 29 0a 7b 0a 2f 2a  Ptr cursor).{./*
2e40: 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   trying to read 
2e50: 61 20 22 72 6f 77 22 20 66 72 6f 6d 20 58 4c 20  a "row" from XL 
2e60: 2a 2f 0a 20 20 20 20 63 75 72 73 6f 72 2d 3e 63  */.    cursor->c
2e70: 75 72 72 65 6e 74 5f 72 6f 77 2b 2b 3b 0a 20 20  urrent_row++;.  
2e80: 20 20 69 66 20 28 63 75 72 73 6f 72 2d 3e 63 75    if (cursor->cu
2e90: 72 72 65 6e 74 5f 72 6f 77 20 3e 20 63 75 72 73  rrent_row > curs
2ea0: 6f 72 2d 3e 70 56 74 61 62 2d 3e 72 6f 77 73 29  or->pVtab->rows)
2eb0: 0a 20 20 20 20 20 20 7b 0a 09 20 20 63 75 72 73  .      {..  curs
2ec0: 6f 72 2d 3e 65 6f 66 20 3d 20 31 3b 0a 09 20 20  or->eof = 1;..  
2ed0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
2ee0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 76 58  }..static int.vX
2ef0: 4c 5f 6f 70 65 6e 20 28 73 71 6c 69 74 65 33 5f  L_open (sqlite3_
2f00: 76 74 61 62 20 2a 20 70 56 54 61 62 2c 20 73 71  vtab * pVTab, sq
2f10: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
2f20: 72 20 2a 2a 20 70 70 43 75 72 73 6f 72 29 0a 7b  r ** ppCursor).{
2f30: 0a 2f 2a 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65  ./* opening a ne
2f40: 77 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  w cursor */.    
2f50: 56 69 72 74 75 61 6c 58 4c 43 75 72 73 6f 72 50  VirtualXLCursorP
2f60: 74 72 20 63 75 72 73 6f 72 20 3d 0a 09 28 56 69  tr cursor =..(Vi
2f70: 72 74 75 61 6c 58 4c 43 75 72 73 6f 72 50 74 72  rtualXLCursorPtr
2f80: 29 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ) sqlite3_malloc
2f90: 20 28 73 69 7a 65 6f 66 20 28 56 69 72 74 75 61   (sizeof (Virtua
2fa0: 6c 58 4c 43 75 72 73 6f 72 29 29 3b 0a 20 20 20  lXLCursor));.   
2fb0: 20 69 66 20 28 63 75 72 73 6f 72 20 3d 3d 20 4e   if (cursor == N
2fc0: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 53 51 4c  ULL)..return SQL
2fd0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 63  ITE_ERROR;.    c
2fe0: 75 72 73 6f 72 2d 3e 66 69 72 73 74 43 6f 6e 73  ursor->firstCons
2ff0: 74 72 61 69 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 20  traint = NULL;. 
3000: 20 20 20 63 75 72 73 6f 72 2d 3e 6c 61 73 74 43     cursor->lastC
3010: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 4e 55 4c 4c  onstraint = NULL
3020: 3b 0a 20 20 20 20 63 75 72 73 6f 72 2d 3e 70 56  ;.    cursor->pV
3030: 74 61 62 20 3d 20 28 56 69 72 74 75 61 6c 58 4c  tab = (VirtualXL
3040: 50 74 72 29 20 70 56 54 61 62 3b 0a 20 20 20 20  Ptr) pVTab;.    
3050: 69 66 20 28 63 75 72 73 6f 72 2d 3e 70 56 74 61  if (cursor->pVta
3060: 62 2d 3e 66 69 72 73 74 4c 69 6e 65 54 69 74 6c  b->firstLineTitl
3070: 65 73 20 3d 3d 20 27 59 27 29 0a 09 63 75 72 73  es == 'Y')..curs
3080: 6f 72 2d 3e 63 75 72 72 65 6e 74 5f 72 6f 77 20  or->current_row 
3090: 3d 20 31 3b 0a 20 20 20 20 65 6c 73 65 0a 09 63  = 1;.    else..c
30a0: 75 72 73 6f 72 2d 3e 63 75 72 72 65 6e 74 5f 72  ursor->current_r
30b0: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 63 75 72 73  ow = 0;.    curs
30c0: 6f 72 2d 3e 65 6f 66 20 3d 20 30 3b 0a 20 20 20  or->eof = 0;.   
30d0: 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 28 73 71   *ppCursor = (sq
30e0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
30f0: 72 20 2a 29 20 63 75 72 73 6f 72 3b 0a 20 20 20  r *) cursor;.   
3100: 20 76 58 4c 5f 72 65 61 64 5f 72 6f 77 20 28 63   vXL_read_row (c
3110: 75 72 73 6f 72 29 3b 0a 20 20 20 20 72 65 74 75  ursor);.    retu
3120: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3130: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 76 58 4c  .static void.vXL
3140: 5f 66 72 65 65 5f 63 6f 6e 73 74 72 61 69 6e 74  _free_constraint
3150: 73 20 28 56 69 72 74 75 61 6c 58 4c 43 75 72 73  s (VirtualXLCurs
3160: 6f 72 50 74 72 20 63 75 72 73 6f 72 29 0a 7b 0a  orPtr cursor).{.
3170: 2f 2a 20 6d 65 6d 6f 72 79 20 63 6c 65 61 6e 75  /* memory cleanu
3180: 70 20 2d 20 63 75 72 73 6f 72 20 63 6f 6e 73 74  p - cursor const
3190: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 56 69  raints */.    Vi
31a0: 72 74 75 61 6c 58 4c 43 6f 6e 73 74 72 61 69 6e  rtualXLConstrain
31b0: 74 50 74 72 20 70 43 3b 0a 20 20 20 20 56 69 72  tPtr pC;.    Vir
31c0: 74 75 61 6c 58 4c 43 6f 6e 73 74 72 61 69 6e 74  tualXLConstraint
31d0: 50 74 72 20 70 43 6e 3b 0a 20 20 20 20 70 43 20  Ptr pCn;.    pC 
31e0: 3d 20 63 75 72 73 6f 72 2d 3e 66 69 72 73 74 43  = cursor->firstC
31f0: 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 77  onstraint;.    w
3200: 68 69 6c 65 20 28 70 43 29 0a 20 20 20 20 20 20  hile (pC).      
3210: 7b 0a 09 20 20 70 43 6e 20 3d 20 70 43 2d 3e 6e  {..  pCn = pC->n
3220: 65 78 74 3b 0a 09 20 20 69 66 20 28 70 43 2d 3e  ext;..  if (pC->
3230: 74 78 74 56 61 6c 75 65 29 0a 09 20 20 20 20 20  txtValue)..     
3240: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70   sqlite3_free (p
3250: 43 2d 3e 74 78 74 56 61 6c 75 65 29 3b 0a 09 20  C->txtValue);.. 
3260: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70   sqlite3_free (p
3270: 43 29 3b 0a 09 20 20 70 43 20 3d 20 70 43 6e 3b  C);..  pC = pCn;
3280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 75 72  .      }.    cur
3290: 73 6f 72 2d 3e 66 69 72 73 74 43 6f 6e 73 74 72  sor->firstConstr
32a0: 61 69 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  aint = NULL;.   
32b0: 20 63 75 72 73 6f 72 2d 3e 6c 61 73 74 43 6f 6e   cursor->lastCon
32c0: 73 74 72 61 69 6e 74 20 3d 20 4e 55 4c 4c 3b 0a  straint = NULL;.
32d0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 76 58  }..static int.vX
32e0: 4c 5f 63 6c 6f 73 65 20 28 73 71 6c 69 74 65 33  L_close (sqlite3
32f0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 20 70  _vtab_cursor * p
3300: 43 75 72 73 6f 72 29 0a 7b 0a 2f 2a 20 63 6c 6f  Cursor).{./* clo
3310: 73 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  sing the cursor 
3320: 2a 2f 0a 20 20 20 20 56 69 72 74 75 61 6c 58 4c  */.    VirtualXL
3330: 43 75 72 73 6f 72 50 74 72 20 63 75 72 73 6f 72  CursorPtr cursor
3340: 20 3d 20 28 56 69 72 74 75 61 6c 58 4c 43 75 72   = (VirtualXLCur
3350: 73 6f 72 50 74 72 29 20 70 43 75 72 73 6f 72 3b  sorPtr) pCursor;
3360: 0a 20 20 20 20 76 58 4c 5f 66 72 65 65 5f 63 6f  .    vXL_free_co
3370: 6e 73 74 72 61 69 6e 74 73 20 28 63 75 72 73 6f  nstraints (curso
3380: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
3390: 66 72 65 65 20 28 70 43 75 72 73 6f 72 29 3b 0a  free (pCursor);.
33a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
33c0: 69 6e 74 0a 76 58 4c 5f 70 61 72 73 65 5f 63 6f  int.vXL_parse_co
33d0: 6e 73 74 72 61 69 6e 74 20 28 63 6f 6e 73 74 20  nstraint (const 
33e0: 63 68 61 72 20 2a 73 74 72 2c 20 69 6e 74 20 69  char *str, int i
33f0: 6e 64 65 78 2c 20 69 6e 74 20 2a 69 43 6f 6c 75  ndex, int *iColu
3400: 6d 6e 2c 20 69 6e 74 20 2a 6f 70 29 0a 7b 0a 2f  mn, int *op).{./
3410: 2a 20 70 61 72 73 69 6e 67 20 61 20 63 6f 6e 73  * parsing a cons
3420: 74 72 61 69 6e 74 20 73 74 72 69 6e 67 20 2a 2f  traint string */
3430: 0a 20 20 20 20 63 68 61 72 20 62 75 66 5b 36 34  .    char buf[64
3440: 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ];.    const cha
3450: 72 20 2a 69 6e 20 3d 20 73 74 72 3b 0a 20 20 20  r *in = str;.   
3460: 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 62 75 66   char *out = buf
3470: 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  ;.    int i = 0;
3480: 0a 20 20 20 20 69 6e 74 20 66 6f 75 6e 64 20 3d  .    int found =
3490: 20 30 3b 0a 0a 20 20 20 20 2a 6f 75 74 20 3d 20   0;..    *out = 
34a0: 27 5c 30 27 3b 0a 20 20 20 20 77 68 69 6c 65 20  '\0';.    while 
34b0: 28 2a 69 6e 20 21 3d 20 27 5c 30 27 29 0a 20 20  (*in != '\0').  
34c0: 20 20 20 20 7b 0a 09 20 20 69 66 20 28 2a 69 6e      {..  if (*in
34d0: 20 3d 3d 20 27 2c 27 29 0a 09 20 20 20 20 7b 0a   == ',')..    {.
34e0: 09 09 69 66 20 28 69 6e 64 65 78 20 3d 3d 20 69  ..if (index == i
34f0: 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
3500: 2a 6f 75 74 20 3d 20 27 5c 30 27 3b 0a 09 09 20  *out = '\0';... 
3510: 20 20 20 20 20 66 6f 75 6e 64 20 3d 20 31 3b 0a       found = 1;.
3520: 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09  ..      break;..
3530: 09 20 20 7d 0a 09 09 69 2b 2b 3b 0a 09 09 69 6e  .  }...i++;...in
3540: 2b 2b 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ++;...continue;.
3550: 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 69 6e  .    }..  if (in
3560: 64 65 78 20 3d 3d 20 69 29 0a 09 20 20 20 20 20  dex == i)..     
3570: 20 2a 6f 75 74 2b 2b 20 3d 20 2a 69 6e 3b 0a 09   *out++ = *in;..
3580: 20 20 69 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a    in++;.      }.
3590: 20 20 20 20 69 66 20 28 21 66 6f 75 6e 64 29 0a      if (!found).
35a0: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69  .return 0;.    i
35b0: 6e 20 3d 20 62 75 66 3b 0a 20 20 20 20 66 6f 72  n = buf;.    for
35c0: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 28 69 6e   (i = 0; i < (in
35d0: 74 29 20 73 74 72 6c 65 6e 20 28 62 75 66 29 3b  t) strlen (buf);
35e0: 20 69 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20   i++).      {.. 
35f0: 20 69 66 20 28 62 75 66 5b 69 5d 20 3d 3d 20 27   if (buf[i] == '
3600: 3a 27 29 0a 09 20 20 20 20 7b 0a 09 09 62 75 66  :')..    {...buf
3610: 5b 69 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 2a 69  [i] = '\0';...*i
3620: 43 6f 6c 75 6d 6e 20 3d 20 61 74 6f 69 20 28 62  Column = atoi (b
3630: 75 66 29 3b 0a 09 09 2a 6f 70 20 3d 20 61 74 6f  uf);...*op = ato
3640: 69 20 28 62 75 66 20 2b 20 69 20 2b 20 31 29 3b  i (buf + i + 1);
3650: 0a 09 09 72 65 74 75 72 6e 20 31 3b 0a 09 20 20  ...return 1;..  
3660: 20 20 7d 0a 09 20 20 69 6e 2b 2b 3b 0a 20 20 20    }..  in++;.   
3670: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
3680: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  0;.}..static int
3690: 0a 76 58 4c 5f 65 76 61 6c 5f 63 6f 6e 73 74 72  .vXL_eval_constr
36a0: 61 69 6e 74 73 20 28 56 69 72 74 75 61 6c 58 4c  aints (VirtualXL
36b0: 43 75 72 73 6f 72 50 74 72 20 63 75 72 73 6f 72  CursorPtr cursor
36c0: 29 0a 7b 0a 2f 2a 20 65 76 61 6c 75 61 74 69 6e  ).{./* evaluatin
36d0: 67 20 46 69 6c 74 65 72 20 63 6f 6e 73 74 72 61  g Filter constra
36e0: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 46 72 65 65  ints */.    Free
36f0: 58 4c 5f 43 65 6c 6c 56 61 6c 75 65 20 63 65 6c  XL_CellValue cel
3700: 6c 3b 0a 20 20 20 20 56 69 72 74 75 61 6c 58 4c  l;.    VirtualXL
3710: 43 6f 6e 73 74 72 61 69 6e 74 50 74 72 20 70 43  ConstraintPtr pC
3720: 20 3d 20 63 75 72 73 6f 72 2d 3e 66 69 72 73 74   = cursor->first
3730: 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
3740: 69 66 20 28 70 43 20 3d 3d 20 4e 55 4c 4c 29 0a  if (pC == NULL).
3750: 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63  .return 1;.    c
3760: 65 6c 6c 2e 76 61 6c 75 65 2e 69 6e 74 5f 76 61  ell.value.int_va
3770: 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  lue = 0;.    whi
3780: 6c 65 20 28 70 43 29 0a 20 20 20 20 20 20 7b 0a  le (pC).      {.
3790: 09 20 20 69 6e 74 20 6f 6b 20 3d 20 30 3b 0a 09  .  int ok = 0;..
37a0: 20 20 69 66 20 28 70 43 2d 3e 69 43 6f 6c 75 6d    if (pC->iColum
37b0: 6e 20 3d 3d 20 30 29 0a 09 20 20 20 20 7b 0a 09  n == 0)..    {..
37c0: 09 2f 2a 20 74 68 65 20 50 52 49 4d 41 52 59 20  ./* the PRIMARY 
37d0: 4b 45 59 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 09 09  KEY column */...
37e0: 69 66 20 28 70 43 2d 3e 76 61 6c 75 65 54 79 70  if (pC->valueTyp
37f0: 65 20 3d 3d 20 27 49 27 29 0a 09 09 20 20 7b 0a  e == 'I')...  {.
3800: 09 09 20 20 20 20 20 20 69 6e 74 20 63 75 72 5f  ..      int cur_
3810: 72 6f 77 20 3d 20 63 75 72 73 6f 72 2d 3e 63 75  row = cursor->cu
3820: 72 72 65 6e 74 5f 72 6f 77 3b 0a 09 09 20 20 20  rrent_row;...   
3830: 20 20 20 69 66 20 28 63 75 72 73 6f 72 2d 3e 70     if (cursor->p
3840: 56 74 61 62 2d 3e 66 69 72 73 74 4c 69 6e 65 54  Vtab->firstLineT
3850: 69 74 6c 65 73 20 3d 3d 20 27 59 27 29 0a 09 09  itles == 'Y')...
3860: 09 20 20 63 75 72 5f 72 6f 77 2d 2d 3b 0a 09 09  .  cur_row--;...
3870: 20 20 20 20 20 20 73 77 69 74 63 68 20 28 70 43        switch (pC
3880: 2d 3e 6f 70 29 0a 09 09 09 7b 0a 09 09 09 63 61  ->op)....{....ca
3890: 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  se SQLITE_INDEX_
38a0: 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 3a 0a 09  CONSTRAINT_EQ:..
38b0: 09 09 20 20 20 20 69 66 20 28 63 75 72 5f 72 6f  ..    if (cur_ro
38c0: 77 20 3d 3d 20 70 43 2d 3e 69 6e 74 56 61 6c 75  w == pC->intValu
38d0: 65 29 0a 09 09 09 09 6f 6b 20 3d 20 31 3b 0a 09  e).....ok = 1;..
38e0: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09  ..    break;....
38f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45  case SQLITE_INDE
3900: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 3a  X_CONSTRAINT_GT:
3910: 0a 09 09 09 20 20 20 20 69 66 20 28 63 75 72 5f  ....    if (cur_
3920: 72 6f 77 20 3e 20 70 43 2d 3e 69 6e 74 56 61 6c  row > pC->intVal
3930: 75 65 29 0a 09 09 09 09 6f 6b 20 3d 20 31 3b 0a  ue).....ok = 1;.
3940: 09 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09  ...    break;...
3950: 09 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44  .case SQLITE_IND
3960: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
3970: 3a 0a 09 09 09 20 20 20 20 69 66 20 28 63 75 72  :....    if (cur
3980: 5f 72 6f 77 20 3c 3d 20 70 43 2d 3e 69 6e 74 56  _row <= pC->intV
3990: 61 6c 75 65 29 0a 09 09 09 09 6f 6b 20 3d 20 31  alue).....ok = 1
39a0: 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b 0a  ;....    break;.
39b0: 09 09 09 63 61 73 65 20 53 51 4c 49 54 45 5f 49  ...case SQLITE_I
39c0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
39d0: 4c 54 3a 0a 09 09 09 20 20 20 20 69 66 20 28 63  LT:....    if (c
39e0: 75 72 5f 72 6f 77 20 3c 20 70 43 2d 3e 69 6e 74  ur_row < pC->int
39f0: 56 61 6c 75 65 29 0a 09 09 09 09 6f 6b 20 3d 20  Value).....ok = 
3a00: 31 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b  1;....    break;
3a10: 0a 09 09 09 63 61 73 65 20 53 51 4c 49 54 45 5f  ....case SQLITE_
3a20: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
3a30: 5f 47 45 3a 0a 09 09 09 20 20 20 20 69 66 20 28  _GE:....    if (
3a40: 63 75 72 5f 72 6f 77 20 3e 3d 20 70 43 2d 3e 69  cur_row >= pC->i
3a50: 6e 74 56 61 6c 75 65 29 0a 09 09 09 09 6f 6b 20  ntValue).....ok 
3a60: 3d 20 31 3b 0a 09 09 09 20 20 20 20 62 72 65 61  = 1;....    brea
3a70: 6b 3b 0a 09 09 09 7d 3b 0a 09 09 20 20 7d 0a 09  k;....};...  }..
3a80: 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 20 20 20  .goto done;..   
3a90: 20 7d 0a 09 20 20 69 66 20 28 63 75 72 73 6f 72   }..  if (cursor
3aa0: 2d 3e 70 56 74 61 62 2d 3e 58 4c 5f 68 61 6e 64  ->pVtab->XL_hand
3ab0: 6c 65 20 21 3d 20 4e 55 4c 4c 0a 09 20 20 20 20  le != NULL..    
3ac0: 20 20 26 26 20 63 75 72 73 6f 72 2d 3e 63 75 72    && cursor->cur
3ad0: 72 65 6e 74 5f 72 6f 77 20 3c 3d 20 63 75 72 73  rent_row <= curs
3ae0: 6f 72 2d 3e 70 56 74 61 62 2d 3e 72 6f 77 73 0a  or->pVtab->rows.
3af0: 09 20 20 20 20 20 20 26 26 20 70 43 2d 3e 69 43  .      && pC->iC
3b00: 6f 6c 75 6d 6e 20 3c 3d 20 63 75 72 73 6f 72 2d  olumn <= cursor-
3b10: 3e 70 56 74 61 62 2d 3e 63 6f 6c 75 6d 6e 73 29  >pVtab->columns)
3b20: 0a 09 20 20 20 20 20 20 66 72 65 65 78 6c 5f 67  ..      freexl_g
3b30: 65 74 5f 63 65 6c 6c 5f 76 61 6c 75 65 20 28 63  et_cell_value (c
3b40: 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 58 4c  ursor->pVtab->XL
3b50: 5f 68 61 6e 64 6c 65 2c 0a 09 09 09 09 20 20 20  _handle,.....   
3b60: 20 20 28 69 6e 74 29 20 63 75 72 73 6f 72 2d 3e    (int) cursor->
3b70: 63 75 72 72 65 6e 74 5f 72 6f 77 20 2d 20 31 2c  current_row - 1,
3b80: 0a 09 09 09 09 20 20 20 20 20 28 75 6e 73 69 67  .....     (unsig
3b90: 6e 65 64 20 73 68 6f 72 74 29 20 70 43 2d 3e 69  ned short) pC->i
3ba0: 43 6f 6c 75 6d 6e 20 2d 20 31 2c 20 26 63 65 6c  Column - 1, &cel
3bb0: 6c 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  l);..  else..   
3bc0: 20 20 20 63 65 6c 6c 2e 74 79 70 65 20 3d 20 46     cell.type = F
3bd0: 52 45 45 58 4c 5f 43 45 4c 4c 5f 4e 55 4c 4c 3b  REEXL_CELL_NULL;
3be0: 0a 09 20 20 69 66 20 28 63 65 6c 6c 2e 74 79 70  ..  if (cell.typ
3bf0: 65 20 3d 3d 20 46 52 45 45 58 4c 5f 43 45 4c 4c  e == FREEXL_CELL
3c00: 5f 49 4e 54 29 0a 09 20 20 20 20 7b 0a 09 09 69  _INT)..    {...i
3c10: 66 20 28 70 43 2d 3e 76 61 6c 75 65 54 79 70 65  f (pC->valueType
3c20: 20 3d 3d 20 27 49 27 29 0a 09 09 20 20 7b 0a 09   == 'I')...  {..
3c30: 09 20 20 20 20 20 20 73 77 69 74 63 68 20 28 70  .      switch (p
3c40: 43 2d 3e 6f 70 29 0a 09 09 09 7b 0a 09 09 09 63  C->op)....{....c
3c50: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ase SQLITE_INDEX
3c60: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 3a 0a  _CONSTRAINT_EQ:.
3c70: 09 09 09 20 20 20 20 69 66 20 28 63 65 6c 6c 2e  ...    if (cell.
3c80: 76 61 6c 75 65 2e 69 6e 74 5f 76 61 6c 75 65 20  value.int_value 
3c90: 3d 3d 20 70 43 2d 3e 69 6e 74 56 61 6c 75 65 29  == pC->intValue)
3ca0: 0a 09 09 09 09 6f 6b 20 3d 20 31 3b 0a 09 09 09  .....ok = 1;....
3cb0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61      break;....ca
3cc0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  se SQLITE_INDEX_
3cd0: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 3a 0a 09  CONSTRAINT_GT:..
3ce0: 09 09 20 20 20 20 69 66 20 28 63 65 6c 6c 2e 76  ..    if (cell.v
3cf0: 61 6c 75 65 2e 69 6e 74 5f 76 61 6c 75 65 20 3e  alue.int_value >
3d00: 20 70 43 2d 3e 69 6e 74 56 61 6c 75 65 29 0a 09   pC->intValue)..
3d10: 09 09 09 6f 6b 20 3d 20 31 3b 0a 09 09 09 20 20  ...ok = 1;....  
3d20: 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65    break;....case
3d30: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
3d40: 4e 53 54 52 41 49 4e 54 5f 4c 45 3a 0a 09 09 09  NSTRAINT_LE:....
3d50: 20 20 20 20 69 66 20 28 63 65 6c 6c 2e 76 61 6c      if (cell.val
3d60: 75 65 2e 69 6e 74 5f 76 61 6c 75 65 20 3c 3d 20  ue.int_value <= 
3d70: 70 43 2d 3e 69 6e 74 56 61 6c 75 65 29 0a 09 09  pC->intValue)...
3d80: 09 09 6f 6b 20 3d 20 31 3b 0a 09 09 09 20 20 20  ..ok = 1;....   
3d90: 20 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20   break;....case 
3da0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
3db0: 53 54 52 41 49 4e 54 5f 4c 54 3a 0a 09 09 09 20  STRAINT_LT:.... 
3dc0: 20 20 20 69 66 20 28 63 65 6c 6c 2e 76 61 6c 75     if (cell.valu
3dd0: 65 2e 69 6e 74 5f 76 61 6c 75 65 20 3c 20 70 43  e.int_value < pC
3de0: 2d 3e 69 6e 74 56 61 6c 75 65 29 0a 09 09 09 09  ->intValue).....
3df0: 6f 6b 20 3d 20 31 3b 0a 09 09 09 20 20 20 20 62  ok = 1;....    b
3e00: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 53 51  reak;....case SQ
3e10: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
3e20: 52 41 49 4e 54 5f 47 45 3a 0a 09 09 09 20 20 20  RAINT_GE:....   
3e30: 20 69 66 20 28 63 65 6c 6c 2e 76 61 6c 75 65 2e   if (cell.value.
3e40: 69 6e 74 5f 76 61 6c 75 65 20 3e 3d 20 70 43 2d  int_value >= pC-
3e50: 3e 69 6e 74 56 61 6c 75 65 29 0a 09 09 09 09 6f  >intValue).....o
3e60: 6b 20 3d 20 31 3b 0a 09 09 09 20 20 20 20 62 72  k = 1;....    br
3e70: 65 61 6b 3b 0a 09 09 09 7d 3b 0a 09 09 20 20 7d  eak;....};...  }
3e80: 0a 09 09 69 66 20 28 70 43 2d 3e 76 61 6c 75 65  ...if (pC->value
3e90: 54 79 70 65 20 3d 3d 20 27 44 27 29 0a 09 09 20  Type == 'D')... 
3ea0: 20 7b 0a 09 09 20 20 20 20 20 20 73 77 69 74 63   {...      switc
3eb0: 68 20 28 70 43 2d 3e 6f 70 29 0a 09 09 09 7b 0a  h (pC->op)....{.
3ec0: 09 09 09 63 61 73 65 20 53 51 4c 49 54 45 5f 49  ...case SQLITE_I
3ed0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
3ee0: 45 51 3a 0a 09 09 09 20 20 20 20 69 66 20 28 63  EQ:....    if (c
3ef0: 65 6c 6c 2e 76 61 6c 75 65 2e 69 6e 74 5f 76 61  ell.value.int_va
3f00: 6c 75 65 20 3d 3d 20 70 43 2d 3e 64 62 6c 56 61  lue == pC->dblVa
3f10: 6c 75 65 29 0a 09 09 09 09 6f 6b 20 3d 20 31 3b  lue).....ok = 1;
3f20: 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  ....    break;..
3f30: 09 09 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e  ..case SQLITE_IN
3f40: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
3f50: 54 3a 0a 09 09 09 20 20 20 20 69 66 20 28 63 65  T:....    if (ce
3f60: 6c 6c 2e 76 61 6c 75 65 2e 69 6e 74 5f 76 61 6c  ll.value.int_val
3f70: 75 65 20 3e 20 70 43 2d 3e 64 62 6c 56 61 6c 75  ue > pC->dblValu
3f80: 65 29 0a 09 09 09 09 6f 6b 20 3d 20 31 3b 0a 09  e).....ok = 1;..
3f90: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09  ..    break;....
3fa0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45  case SQLITE_INDE
3fb0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 3a  X_CONSTRAINT_LE:
3fc0: 0a 09 09 09 20 20 20 20 69 66 20 28 63 65 6c 6c  ....    if (cell
3fd0: 2e 76 61 6c 75 65 2e 69 6e 74 5f 76 61 6c 75 65  .value.int_value
3fe0: 20 3c 3d 20 70 43 2d 3e 64 62 6c 56 61 6c 75 65   <= pC->dblValue
3ff0: 29 0a 09 09 09 09 6f 6b 20 3d 20 31 3b 0a 09 09  ).....ok = 1;...
4000: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63  .    break;....c
4010: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ase SQLITE_INDEX
4020: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 3a 0a  _CONSTRAINT_LT:.
4030: 09 09 09 20 20 20 20 69 66 20 28 63 65 6c 6c 2e  ...    if (cell.
4040: 76 61 6c 75 65 2e 69 6e 74 5f 76 61 6c 75 65 20  value.int_value 
4050: 3c 20 70 43 2d 3e 64 62 6c 56 61 6c 75 65 29 0a  < pC->dblValue).
4060: 09 09 09 09 6f 6b 20 3d 20 31 3b 0a 09 09 09 20  ....ok = 1;.... 
4070: 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61 73     break;....cas
4080: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  e SQLITE_INDEX_C
4090: 4f 4e 53 54 52 41 49 4e 54 5f 47 45 3a 0a 09 09  ONSTRAINT_GE:...
40a0: 09 20 20 20 20 69 66 20 28 63 65 6c 6c 2e 76 61  .    if (cell.va
40b0: 6c 75 65 2e 69 6e 74 5f 76 61 6c 75 65 20 3e 3d  lue.int_value >=
40c0: 20 70 43 2d 3e 64 62 6c 56 61 6c 75 65 29 0a 09   pC->dblValue)..
40d0: 09 09 09 6f 6b 20 3d 20 31 3b 0a 09 09 09 20 20  ...ok = 1;....  
40e0: 20 20 62 72 65 61 6b 3b 0a 09 09 09 7d 3b 0a 09    break;....};..
40f0: 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 69  .  }..    }..  i
4100: 66 20 28 63 65 6c 6c 2e 74 79 70 65 20 3d 3d 20  f (cell.type == 
4110: 46 52 45 45 58 4c 5f 43 45 4c 4c 5f 44 4f 55 42  FREEXL_CELL_DOUB
4120: 4c 45 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20  LE)..    {...if 
4130: 28 70 43 2d 3e 76 61 6c 75 65 54 79 70 65 20 3d  (pC->valueType =
4140: 3d 20 27 49 27 29 0a 09 09 20 20 7b 0a 09 09 20  = 'I')...  {... 
4150: 20 20 20 20 20 73 77 69 74 63 68 20 28 70 43 2d       switch (pC-
4160: 3e 6f 70 29 0a 09 09 09 7b 0a 09 09 09 63 61 73  >op)....{....cas
4170: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  e SQLITE_INDEX_C
4180: 4f 4e 53 54 52 41 49 4e 54 5f 45 51 3a 0a 09 09  ONSTRAINT_EQ:...
4190: 09 20 20 20 20 69 66 20 28 63 65 6c 6c 2e 76 61  .    if (cell.va
41a0: 6c 75 65 2e 64 6f 75 62 6c 65 5f 76 61 6c 75 65  lue.double_value
41b0: 20 3d 3d 20 70 43 2d 3e 69 6e 74 56 61 6c 75 65   == pC->intValue
41c0: 29 0a 09 09 09 09 6f 6b 20 3d 20 31 3b 0a 09 09  ).....ok = 1;...
41d0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63  .    break;....c
41e0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ase SQLITE_INDEX
41f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 3a 0a  _CONSTRAINT_GT:.
4200: 09 09 09 20 20 20 20 69 66 20 28 63 65 6c 6c 2e  ...    if (cell.
4210: 76 61 6c 75 65 2e 64 6f 75 62 6c 65 5f 76 61 6c  value.double_val
4220: 75 65 20 3e 20 70 43 2d 3e 69 6e 74 56 61 6c 75  ue > pC->intValu
4230: 65 29 0a 09 09 09 09 6f 6b 20 3d 20 31 3b 0a 09  e).....ok = 1;..
4240: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09  ..    break;....
4250: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45  case SQLITE_INDE
4260: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 3a  X_CONSTRAINT_LE:
4270: 0a 09 09 09 20 20 20 20 69 66 20 28 63 65 6c 6c  ....    if (cell
4280: 2e 76 61 6c 75 65 2e 64 6f 75 62 6c 65 5f 76 61  .value.double_va
4290: 6c 75 65 20 3c 3d 20 70 43 2d 3e 69 6e 74 56 61  lue <= pC->intVa
42a0: 6c 75 65 29 0a 09 09 09 09 6f 6b 20 3d 20 31 3b  lue).....ok = 1;
42b0: 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  ....    break;..
42c0: 09 09 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e  ..case SQLITE_IN
42d0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
42e0: 54 3a 0a 09 09 09 20 20 20 20 69 66 20 28 63 65  T:....    if (ce
42f0: 6c 6c 2e 76 61 6c 75 65 2e 64 6f 75 62 6c 65 5f  ll.value.double_
4300: 76 61 6c 75 65 20 3c 20 70 43 2d 3e 69 6e 74 56  value < pC->intV
4310: 61 6c 75 65 29 0a 09 09 09 09 6f 6b 20 3d 20 31  alue).....ok = 1
4320: 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b 0a  ;....    break;.
4330: 09 09 09 63 61 73 65 20 53 51 4c 49 54 45 5f 49  ...case SQLITE_I
4340: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
4350: 47 45 3a 0a 09 09 09 20 20 20 20 69 66 20 28 63  GE:....    if (c
4360: 65 6c 6c 2e 76 61 6c 75 65 2e 64 6f 75 62 6c 65  ell.value.double
4370: 5f 76 61 6c 75 65 20 3e 3d 20 70 43 2d 3e 69 6e  _value >= pC->in
4380: 74 56 61 6c 75 65 29 0a 09 09 09 09 6f 6b 20 3d  tValue).....ok =
4390: 20 31 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b   1;....    break
43a0: 3b 0a 09 09 09 7d 3b 0a 09 09 20 20 7d 0a 09 09  ;....};...  }...
43b0: 69 66 20 28 70 43 2d 3e 76 61 6c 75 65 54 79 70  if (pC->valueTyp
43c0: 65 20 3d 3d 20 27 44 27 29 0a 09 09 20 20 7b 0a  e == 'D')...  {.
43d0: 09 09 20 20 20 20 20 20 73 77 69 74 63 68 20 28  ..      switch (
43e0: 70 43 2d 3e 6f 70 29 0a 09 09 09 7b 0a 09 09 09  pC->op)....{....
43f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45  case SQLITE_INDE
4400: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 3a  X_CONSTRAINT_EQ:
4410: 0a 09 09 09 20 20 20 20 69 66 20 28 63 65 6c 6c  ....    if (cell
4420: 2e 76 61 6c 75 65 2e 64 6f 75 62 6c 65 5f 76 61  .value.double_va
4430: 6c 75 65 20 3d 3d 20 70 43 2d 3e 64 62 6c 56 61  lue == pC->dblVa
4440: 6c 75 65 29 0a 09 09 09 09 6f 6b 20 3d 20 31 3b  lue).....ok = 1;
4450: 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  ....    break;..
4460: 09 09 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e  ..case SQLITE_IN
4470: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
4480: 54 3a 0a 09 09 09 20 20 20 20 69 66 20 28 63 65  T:....    if (ce
4490: 6c 6c 2e 76 61 6c 75 65 2e 64 6f 75 62 6c 65 5f  ll.value.double_
44a0: 76 61 6c 75 65 20 3e 20 70 43 2d 3e 64 62 6c 56  value > pC->dblV
44b0: 61 6c 75 65 29 0a 09 09 09 09 6f 6b 20 3d 20 31  alue).....ok = 1
44c0: 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b 0a  ;....    break;.
44d0: 09 09 09 63 61 73 65 20 53 51 4c 49 54 45 5f 49  ...case SQLITE_I
44e0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
44f0: 4c 45 3a 0a 09 09 09 20 20 20 20 69 66 20 28 63  LE:....    if (c
4500: 65 6c 6c 2e 76 61 6c 75 65 2e 64 6f 75 62 6c 65  ell.value.double
4510: 5f 76 61 6c 75 65 20 3c 3d 20 70 43 2d 3e 64 62  _value <= pC->db
4520: 6c 56 61 6c 75 65 29 0a 09 09 09 09 6f 6b 20 3d  lValue).....ok =
4530: 20 31 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b   1;....    break
4540: 3b 0a 09 09 09 63 61 73 65 20 53 51 4c 49 54 45  ;....case SQLITE
4550: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
4560: 54 5f 4c 54 3a 0a 09 09 09 20 20 20 20 69 66 20  T_LT:....    if 
4570: 28 63 65 6c 6c 2e 76 61 6c 75 65 2e 64 6f 75 62  (cell.value.doub
4580: 6c 65 5f 76 61 6c 75 65 20 3c 20 70 43 2d 3e 64  le_value < pC->d
4590: 62 6c 56 61 6c 75 65 29 0a 09 09 09 09 6f 6b 20  blValue).....ok 
45a0: 3d 20 31 3b 0a 09 09 09 20 20 20 20 62 72 65 61  = 1;....    brea
45b0: 6b 3b 0a 09 09 09 63 61 73 65 20 53 51 4c 49 54  k;....case SQLIT
45c0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
45d0: 4e 54 5f 47 45 3a 0a 09 09 09 20 20 20 20 69 66  NT_GE:....    if
45e0: 20 28 63 65 6c 6c 2e 76 61 6c 75 65 2e 64 6f 75   (cell.value.dou
45f0: 62 6c 65 5f 76 61 6c 75 65 20 3e 3d 20 70 43 2d  ble_value >= pC-
4600: 3e 64 62 6c 56 61 6c 75 65 29 0a 09 09 09 09 6f  >dblValue).....o
4610: 6b 20 3d 20 31 3b 0a 09 09 09 20 20 20 20 62 72  k = 1;....    br
4620: 65 61 6b 3b 0a 09 09 09 7d 3b 0a 09 09 20 20 7d  eak;....};...  }
4630: 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 28  ..    }..  if ((
4640: 63 65 6c 6c 2e 74 79 70 65 20 3d 3d 20 46 52 45  cell.type == FRE
4650: 45 58 4c 5f 43 45 4c 4c 5f 54 45 58 54 0a 09 20  EXL_CELL_TEXT.. 
4660: 20 20 20 20 20 20 7c 7c 20 63 65 6c 6c 2e 74 79        || cell.ty
4670: 70 65 20 3d 3d 20 46 52 45 45 58 4c 5f 43 45 4c  pe == FREEXL_CEL
4680: 4c 5f 53 53 54 5f 54 45 58 54 0a 09 20 20 20 20  L_SST_TEXT..    
4690: 20 20 20 7c 7c 20 63 65 6c 6c 2e 74 79 70 65 20     || cell.type 
46a0: 3d 3d 20 46 52 45 45 58 4c 5f 43 45 4c 4c 5f 44  == FREEXL_CELL_D
46b0: 41 54 45 0a 09 20 20 20 20 20 20 20 7c 7c 20 63  ATE..       || c
46c0: 65 6c 6c 2e 74 79 70 65 20 3d 3d 20 46 52 45 45  ell.type == FREE
46d0: 58 4c 5f 43 45 4c 4c 5f 44 41 54 45 54 49 4d 45  XL_CELL_DATETIME
46e0: 0a 09 20 20 20 20 20 20 20 7c 7c 20 63 65 6c 6c  ..       || cell
46f0: 2e 74 79 70 65 20 3d 3d 20 46 52 45 45 58 4c 5f  .type == FREEXL_
4700: 43 45 4c 4c 5f 54 49 4d 45 29 20 26 26 20 70 43  CELL_TIME) && pC
4710: 2d 3e 76 61 6c 75 65 54 79 70 65 20 3d 3d 20 27  ->valueType == '
4720: 54 27 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74  T')..    {...int
4730: 20 72 65 74 20 3d 20 73 74 72 63 6d 70 20 28 63   ret = strcmp (c
4740: 65 6c 6c 2e 76 61 6c 75 65 2e 74 65 78 74 5f 76  ell.value.text_v
4750: 61 6c 75 65 2c 20 70 43 2d 3e 74 78 74 56 61 6c  alue, pC->txtVal
4760: 75 65 29 3b 0a 09 09 73 77 69 74 63 68 20 28 70  ue);...switch (p
4770: 43 2d 3e 6f 70 29 0a 09 09 20 20 7b 0a 09 09 20  C->op)...  {... 
4780: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44   case SQLITE_IND
4790: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
47a0: 3a 0a 09 09 20 20 20 20 20 20 69 66 20 28 72 65  :...      if (re
47b0: 74 20 3d 3d 20 30 29 0a 09 09 09 20 20 6f 6b 20  t == 0)....  ok 
47c0: 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 62 72 65  = 1;...      bre
47d0: 61 6b 3b 0a 09 09 20 20 63 61 73 65 20 53 51 4c  ak;...  case SQL
47e0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
47f0: 41 49 4e 54 5f 47 54 3a 0a 09 09 20 20 20 20 20  AINT_GT:...     
4800: 20 69 66 20 28 72 65 74 20 3e 20 30 29 0a 09 09   if (ret > 0)...
4810: 09 20 20 6f 6b 20 3d 20 31 3b 0a 09 09 20 20 20  .  ok = 1;...   
4820: 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 63 61     break;...  ca
4830: 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  se SQLITE_INDEX_
4840: 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 3a 0a 09  CONSTRAINT_LE:..
4850: 09 20 20 20 20 20 20 69 66 20 28 72 65 74 20 3c  .      if (ret <
4860: 3d 20 30 29 0a 09 09 09 20 20 6f 6b 20 3d 20 31  = 0)....  ok = 1
4870: 3b 0a 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b  ;...      break;
4880: 0a 09 09 20 20 63 61 73 65 20 53 51 4c 49 54 45  ...  case SQLITE
4890: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
48a0: 54 5f 4c 54 3a 0a 09 09 20 20 20 20 20 20 69 66  T_LT:...      if
48b0: 20 28 72 65 74 20 3c 20 30 29 0a 09 09 09 20 20   (ret < 0)....  
48c0: 6f 6b 20 3d 20 31 3b 0a 09 09 20 20 20 20 20 20  ok = 1;...      
48d0: 62 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65 20  break;...  case 
48e0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
48f0: 53 54 52 41 49 4e 54 5f 47 45 3a 0a 09 09 20 20  STRAINT_GE:...  
4900: 20 20 20 20 69 66 20 28 72 65 74 20 3e 3d 20 30      if (ret >= 0
4910: 29 0a 09 09 09 20 20 6f 6b 20 3d 20 31 3b 0a 09  )....  ok = 1;..
4920: 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 23 69  .      break;.#i
4930: 66 64 65 66 20 48 41 56 45 5f 44 45 43 4c 5f 53  fdef HAVE_DECL_S
4940: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
4950: 54 52 41 49 4e 54 5f 4c 49 4b 45 0a 09 09 20 20  TRAINT_LIKE...  
4960: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45  case SQLITE_INDE
4970: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 49 4b  X_CONSTRAINT_LIK
4980: 45 3a 0a 09 09 20 20 20 20 20 20 69 66 20 28 72  E:...      if (r
4990: 65 74 20 3e 3d 20 30 29 0a 09 09 09 20 20 6f 6b  et >= 0)....  ok
49a0: 20 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 62 72   = 1;...      br
49b0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20  eak;.#endif...  
49c0: 7d 3b 0a 09 20 20 20 20 7d 0a 09 64 6f 6e 65 3a  };..    }..done:
49d0: 0a 09 20 20 69 66 20 28 21 6f 6b 29 0a 09 20 20  ..  if (!ok)..  
49e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 20      return 0;.. 
49f0: 20 70 43 20 3d 20 70 43 2d 3e 6e 65 78 74 3b 0a   pC = pC->next;.
4a00: 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75        }.    retu
4a10: 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 1;.}..static 
4a20: 69 6e 74 0a 76 58 4c 5f 66 69 6c 74 65 72 20 28  int.vXL_filter (
4a30: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
4a40: 73 6f 72 20 2a 20 70 43 75 72 73 6f 72 2c 20 69  sor * pCursor, i
4a50: 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74  nt idxNum, const
4a60: 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 09   char *idxStr,..
4a70: 20 20 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71      int argc, sq
4a80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
4a90: 72 67 76 29 0a 7b 0a 2f 2a 20 73 65 74 74 69 6e  rgv).{./* settin
4aa0: 67 20 75 70 20 61 20 63 75 72 73 6f 72 20 66 69  g up a cursor fi
4ab0: 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lter */.    int 
4ac0: 69 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  i;.    int iColu
4ad0: 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a  mn;.    int op;.
4ae0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
4af0: 20 56 69 72 74 75 61 6c 58 4c 43 6f 6e 73 74 72   VirtualXLConstr
4b00: 61 69 6e 74 50 74 72 20 70 43 3b 0a 20 20 20 20  aintPtr pC;.    
4b10: 56 69 72 74 75 61 6c 58 4c 43 75 72 73 6f 72 50  VirtualXLCursorP
4b20: 74 72 20 63 75 72 73 6f 72 20 3d 20 28 56 69 72  tr cursor = (Vir
4b30: 74 75 61 6c 58 4c 43 75 72 73 6f 72 50 74 72 29  tualXLCursorPtr)
4b40: 20 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66   pCursor;.    if
4b50: 20 28 69 64 78 4e 75 6d 29 0a 09 69 64 78 4e 75   (idxNum)..idxNu
4b60: 6d 20 3d 20 69 64 78 4e 75 6d 3b 09 2f 2a 20 75  m = idxNum;./* u
4b70: 6e 75 73 65 64 20 61 72 67 20 77 61 72 6e 69 6e  nused arg warnin
4b80: 67 20 73 75 70 70 72 65 73 73 69 6f 6e 20 2a 2f  g suppression */
4b90: 0a 0a 2f 2a 20 72 65 73 65 74 74 69 6e 67 20 61  ../* resetting a
4ba0: 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  ny previously se
4bb0: 74 20 66 69 6c 74 65 72 20 63 6f 6e 73 74 72 61  t filter constra
4bc0: 69 6e 74 20 2a 2f 0a 20 20 20 20 76 58 4c 5f 66  int */.    vXL_f
4bd0: 72 65 65 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  ree_constraints 
4be0: 28 63 75 72 73 6f 72 29 3b 0a 0a 20 20 20 20 66  (cursor);..    f
4bf0: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 61  or (i = 0; i < a
4c00: 72 67 63 3b 20 69 2b 2b 29 0a 20 20 20 20 20 20  rgc; i++).      
4c10: 7b 0a 09 20 20 69 66 20 28 21 76 58 4c 5f 70 61  {..  if (!vXL_pa
4c20: 72 73 65 5f 63 6f 6e 73 74 72 61 69 6e 74 20 28  rse_constraint (
4c30: 69 64 78 53 74 72 2c 20 69 2c 20 26 69 43 6f 6c  idxStr, i, &iCol
4c40: 75 6d 6e 2c 20 26 6f 70 29 29 0a 09 20 20 20 20  umn, &op))..    
4c50: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 70    continue;..  p
4c60: 43 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  C = sqlite3_mall
4c70: 6f 63 20 28 73 69 7a 65 6f 66 20 28 56 69 72 74  oc (sizeof (Virt
4c80: 75 61 6c 58 4c 43 6f 6e 73 74 72 61 69 6e 74 29  ualXLConstraint)
4c90: 29 3b 0a 09 20 20 69 66 20 28 21 70 43 29 0a 09  );..  if (!pC)..
4ca0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
4cb0: 09 20 20 70 43 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  .  pC->iColumn =
4cc0: 20 69 43 6f 6c 75 6d 6e 3b 0a 09 20 20 70 43 2d   iColumn;..  pC-
4cd0: 3e 6f 70 20 3d 20 6f 70 3b 0a 09 20 20 70 43 2d  >op = op;..  pC-
4ce0: 3e 76 61 6c 75 65 54 79 70 65 20 3d 20 27 5c 30  >valueType = '\0
4cf0: 27 3b 0a 09 20 20 70 43 2d 3e 74 78 74 56 61 6c  ';..  pC->txtVal
4d00: 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 70 43  ue = NULL;..  pC
4d10: 2d 3e 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a  ->next = NULL;..
4d20: 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
4d30: 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
4d40: 69 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  i]) == SQLITE_IN
4d50: 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09  TEGER)..    {...
4d60: 70 43 2d 3e 76 61 6c 75 65 54 79 70 65 20 3d 20  pC->valueType = 
4d70: 27 49 27 3b 0a 09 09 70 43 2d 3e 69 6e 74 56 61  'I';...pC->intVa
4d80: 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lue = sqlite3_va
4d90: 6c 75 65 5f 69 6e 74 36 34 20 28 61 72 67 76 5b  lue_int64 (argv[
4da0: 69 5d 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69  i]);..    }..  i
4db0: 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
4dc0: 5f 74 79 70 65 20 28 61 72 67 76 5b 69 5d 29 20  _type (argv[i]) 
4dd0: 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
4de0: 0a 09 20 20 20 20 7b 0a 09 09 70 43 2d 3e 76 61  ..    {...pC->va
4df0: 6c 75 65 54 79 70 65 20 3d 20 27 44 27 3b 0a 09  lueType = 'D';..
4e00: 09 70 43 2d 3e 64 62 6c 56 61 6c 75 65 20 3d 20  .pC->dblValue = 
4e10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
4e20: 75 62 6c 65 20 28 61 72 67 76 5b 69 5d 29 3b 0a  uble (argv[i]);.
4e30: 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71  .    }..  if (sq
4e40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
4e50: 20 28 61 72 67 76 5b 69 5d 29 20 3d 3d 20 53 51   (argv[i]) == SQ
4e60: 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20 20 20  LITE_TEXT)..    
4e70: 7b 0a 09 09 70 43 2d 3e 76 61 6c 75 65 54 79 70  {...pC->valueTyp
4e80: 65 20 3d 20 27 54 27 3b 0a 09 09 6c 65 6e 20 3d  e = 'T';...len =
4e90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
4ea0: 79 74 65 73 20 28 61 72 67 76 5b 69 5d 29 20 2b  ytes (argv[i]) +
4eb0: 20 31 3b 0a 09 09 70 43 2d 3e 74 78 74 56 61 6c   1;...pC->txtVal
4ec0: 75 65 20 3d 20 28 63 68 61 72 20 2a 29 20 73 71  ue = (char *) sq
4ed0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 28 6c 65  lite3_malloc (le
4ee0: 6e 29 3b 0a 09 09 69 66 20 28 70 43 2d 3e 74 78  n);...if (pC->tx
4ef0: 74 56 61 6c 75 65 29 0a 09 09 20 20 20 20 73 74  tValue)...    st
4f00: 72 63 70 79 20 28 70 43 2d 3e 74 78 74 56 61 6c  rcpy (pC->txtVal
4f10: 75 65 2c 0a 09 09 09 20 20 20 20 28 63 68 61 72  ue,....    (char
4f20: 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
4f30: 65 5f 74 65 78 74 20 28 61 72 67 76 5b 69 5d 29  e_text (argv[i])
4f40: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20  );..    }..  if 
4f50: 28 63 75 72 73 6f 72 2d 3e 66 69 72 73 74 43 6f  (cursor->firstCo
4f60: 6e 73 74 72 61 69 6e 74 20 3d 3d 20 4e 55 4c 4c  nstraint == NULL
4f70: 29 0a 09 20 20 20 20 20 20 63 75 72 73 6f 72 2d  )..      cursor-
4f80: 3e 66 69 72 73 74 43 6f 6e 73 74 72 61 69 6e 74  >firstConstraint
4f90: 20 3d 20 70 43 3b 0a 09 20 20 69 66 20 28 63 75   = pC;..  if (cu
4fa0: 72 73 6f 72 2d 3e 6c 61 73 74 43 6f 6e 73 74 72  rsor->lastConstr
4fb0: 61 69 6e 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 20  aint != NULL).. 
4fc0: 20 20 20 20 20 63 75 72 73 6f 72 2d 3e 6c 61 73       cursor->las
4fd0: 74 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6e 65 78  tConstraint->nex
4fe0: 74 20 3d 20 70 43 3b 0a 09 20 20 63 75 72 73 6f  t = pC;..  curso
4ff0: 72 2d 3e 6c 61 73 74 43 6f 6e 73 74 72 61 69 6e  r->lastConstrain
5000: 74 20 3d 20 70 43 3b 0a 20 20 20 20 20 20 7d 0a  t = pC;.      }.
5010: 0a 20 20 20 20 69 66 20 28 63 75 72 73 6f 72 2d  .    if (cursor-
5020: 3e 70 56 74 61 62 2d 3e 66 69 72 73 74 4c 69 6e  >pVtab->firstLin
5030: 65 54 69 74 6c 65 73 20 3d 3d 20 27 59 27 29 0a  eTitles == 'Y').
5040: 09 63 75 72 73 6f 72 2d 3e 63 75 72 72 65 6e 74  .cursor->current
5050: 5f 72 6f 77 20 3d 20 31 3b 0a 20 20 20 20 65 6c  _row = 1;.    el
5060: 73 65 0a 09 63 75 72 73 6f 72 2d 3e 63 75 72 72  se..cursor->curr
5070: 65 6e 74 5f 72 6f 77 20 3d 20 30 3b 0a 20 20 20  ent_row = 0;.   
5080: 20 63 75 72 73 6f 72 2d 3e 65 6f 66 20 3d 20 30   cursor->eof = 0
5090: 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29 0a  ;.    while (1).
50a0: 20 20 20 20 20 20 7b 0a 09 20 20 76 58 4c 5f 72        {..  vXL_r
50b0: 65 61 64 5f 72 6f 77 20 28 63 75 72 73 6f 72 29  ead_row (cursor)
50c0: 3b 0a 09 20 20 69 66 20 28 63 75 72 73 6f 72 2d  ;..  if (cursor-
50d0: 3e 65 6f 66 29 0a 09 20 20 20 20 20 20 62 72 65  >eof)..      bre
50e0: 61 6b 3b 0a 09 20 20 69 66 20 28 76 58 4c 5f 65  ak;..  if (vXL_e
50f0: 76 61 6c 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  val_constraints 
5100: 28 63 75 72 73 6f 72 29 29 0a 09 20 20 20 20 20  (cursor))..     
5110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5120: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5130: 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
5140: 69 6e 74 0a 76 58 4c 5f 6e 65 78 74 20 28 73 71  int.vXL_next (sq
5150: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
5160: 72 20 2a 20 70 43 75 72 73 6f 72 29 0a 7b 0a 2f  r * pCursor).{./
5170: 2a 20 66 65 74 63 68 69 6e 67 20 61 20 6e 65 78  * fetching a nex
5180: 74 20 72 6f 77 20 66 72 6f 6d 20 63 75 72 73 6f  t row from curso
5190: 72 20 2a 2f 0a 20 20 20 20 56 69 72 74 75 61 6c  r */.    Virtual
51a0: 58 4c 43 75 72 73 6f 72 50 74 72 20 63 75 72 73  XLCursorPtr curs
51b0: 6f 72 20 3d 20 28 56 69 72 74 75 61 6c 58 4c 43  or = (VirtualXLC
51c0: 75 72 73 6f 72 50 74 72 29 20 70 43 75 72 73 6f  ursorPtr) pCurso
51d0: 72 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29  r;.    while (1)
51e0: 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 58 4c 5f  .      {..  vXL_
51f0: 72 65 61 64 5f 72 6f 77 20 28 63 75 72 73 6f 72  read_row (cursor
5200: 29 3b 0a 09 20 20 69 66 20 28 63 75 72 73 6f 72  );..  if (cursor
5210: 2d 3e 65 6f 66 29 0a 09 20 20 20 20 20 20 62 72  ->eof)..      br
5220: 65 61 6b 3b 0a 09 20 20 69 66 20 28 76 58 4c 5f  eak;..  if (vXL_
5230: 65 76 61 6c 5f 63 6f 6e 73 74 72 61 69 6e 74 73  eval_constraints
5240: 20 28 63 75 72 73 6f 72 29 29 0a 09 20 20 20 20   (cursor))..    
5250: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5260: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5270: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
5280: 20 69 6e 74 0a 76 58 4c 5f 65 6f 66 20 28 73 71   int.vXL_eof (sq
5290: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
52a0: 72 20 2a 20 70 43 75 72 73 6f 72 29 0a 7b 0a 2f  r * pCursor).{./
52b0: 2a 20 63 75 72 73 6f 72 20 45 4f 46 20 2a 2f 0a  * cursor EOF */.
52c0: 20 20 20 20 56 69 72 74 75 61 6c 58 4c 43 75 72      VirtualXLCur
52d0: 73 6f 72 50 74 72 20 63 75 72 73 6f 72 20 3d 20  sorPtr cursor = 
52e0: 28 56 69 72 74 75 61 6c 58 4c 43 75 72 73 6f 72  (VirtualXLCursor
52f0: 50 74 72 29 20 70 43 75 72 73 6f 72 3b 0a 20 20  Ptr) pCursor;.  
5300: 20 20 72 65 74 75 72 6e 20 63 75 72 73 6f 72 2d    return cursor-
5310: 3e 65 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  >eof;.}..static 
5320: 69 6e 74 0a 76 58 4c 5f 63 6f 6c 75 6d 6e 20 28  int.vXL_column (
5330: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
5340: 73 6f 72 20 2a 20 70 43 75 72 73 6f 72 2c 20 73  sor * pCursor, s
5350: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5360: 20 70 43 6f 6e 74 65 78 74 2c 0a 09 20 20 20 20   pContext,..    
5370: 69 6e 74 20 63 6f 6c 75 6d 6e 29 0a 7b 0a 2f 2a  int column).{./*
5380: 20 66 65 74 63 68 69 6e 67 20 76 61 6c 75 65 20   fetching value 
5390: 66 6f 72 20 74 68 65 20 4e 74 68 20 63 6f 6c 75  for the Nth colu
53a0: 6d 6e 20 2a 2f 0a 20 20 20 20 46 72 65 65 58 4c  mn */.    FreeXL
53b0: 5f 43 65 6c 6c 56 61 6c 75 65 20 63 65 6c 6c 3b  _CellValue cell;
53c0: 0a 20 20 20 20 63 65 6c 6c 2e 76 61 6c 75 65 2e  .    cell.value.
53d0: 69 6e 74 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 20  int_value = 0;. 
53e0: 20 20 20 56 69 72 74 75 61 6c 58 4c 43 75 72 73     VirtualXLCurs
53f0: 6f 72 50 74 72 20 63 75 72 73 6f 72 20 3d 20 28  orPtr cursor = (
5400: 56 69 72 74 75 61 6c 58 4c 43 75 72 73 6f 72 50  VirtualXLCursorP
5410: 74 72 29 20 70 43 75 72 73 6f 72 3b 0a 20 20 20  tr) pCursor;.   
5420: 20 69 66 20 28 63 6f 6c 75 6d 6e 20 3d 3d 20 30   if (column == 0
5430: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20  ).      {..  /* 
5440: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
5450: 63 6f 6c 75 6d 6e 20 2a 2f 0a 09 20 20 69 66 20  column */..  if 
5460: 28 63 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e  (cursor->pVtab->
5470: 66 69 72 73 74 4c 69 6e 65 54 69 74 6c 65 73 20  firstLineTitles 
5480: 3d 3d 20 27 59 27 29 0a 09 20 20 20 20 20 20 73  == 'Y')..      s
5490: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
54a0: 74 20 28 70 43 6f 6e 74 65 78 74 2c 20 63 75 72  t (pContext, cur
54b0: 73 6f 72 2d 3e 63 75 72 72 65 6e 74 5f 72 6f 77  sor->current_row
54c0: 20 2d 20 31 29 3b 0a 09 20 20 65 6c 73 65 0a 09   - 1);..  else..
54d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
54e0: 73 75 6c 74 5f 69 6e 74 20 28 70 43 6f 6e 74 65  sult_int (pConte
54f0: 78 74 2c 20 63 75 72 73 6f 72 2d 3e 63 75 72 72  xt, cursor->curr
5500: 65 6e 74 5f 72 6f 77 29 3b 0a 09 20 20 72 65 74  ent_row);..  ret
5510: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5520: 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63       }.    if (c
5530: 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 58 4c  ursor->pVtab->XL
5540: 5f 68 61 6e 64 6c 65 20 21 3d 20 4e 55 4c 4c 0a  _handle != NULL.
5550: 09 26 26 20 63 75 72 73 6f 72 2d 3e 63 75 72 72  .&& cursor->curr
5560: 65 6e 74 5f 72 6f 77 20 3c 3d 20 63 75 72 73 6f  ent_row <= curso
5570: 72 2d 3e 70 56 74 61 62 2d 3e 72 6f 77 73 0a 09  r->pVtab->rows..
5580: 26 26 20 63 6f 6c 75 6d 6e 20 3c 3d 20 63 75 72  && column <= cur
5590: 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 63 6f 6c 75  sor->pVtab->colu
55a0: 6d 6e 73 29 0a 09 66 72 65 65 78 6c 5f 67 65 74  mns)..freexl_get
55b0: 5f 63 65 6c 6c 5f 76 61 6c 75 65 20 28 63 75 72  _cell_value (cur
55c0: 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 58 4c 5f 68  sor->pVtab->XL_h
55d0: 61 6e 64 6c 65 2c 0a 09 09 09 20 20 20 20 20 20  andle,....      
55e0: 20 63 75 72 73 6f 72 2d 3e 63 75 72 72 65 6e 74   cursor->current
55f0: 5f 72 6f 77 20 2d 20 31 2c 0a 09 09 09 20 20 20  _row - 1,....   
5600: 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 73 68      (unsigned sh
5610: 6f 72 74 29 20 63 6f 6c 75 6d 6e 20 2d 20 31 2c  ort) column - 1,
5620: 20 26 63 65 6c 6c 29 3b 0a 20 20 20 20 65 6c 73   &cell);.    els
5630: 65 0a 09 63 65 6c 6c 2e 74 79 70 65 20 3d 20 46  e..cell.type = F
5640: 52 45 45 58 4c 5f 43 45 4c 4c 5f 4e 55 4c 4c 3b  REEXL_CELL_NULL;
5650: 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 65 6c  .    switch (cel
5660: 6c 2e 74 79 70 65 29 0a 20 20 20 20 20 20 7b 0a  l.type).      {.
5670: 20 20 20 20 20 20 63 61 73 65 20 46 52 45 45 58        case FREEX
5680: 4c 5f 43 45 4c 4c 5f 49 4e 54 3a 0a 09 20 20 73  L_CELL_INT:..  s
5690: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
56a0: 74 20 28 70 43 6f 6e 74 65 78 74 2c 20 63 65 6c  t (pContext, cel
56b0: 6c 2e 76 61 6c 75 65 2e 69 6e 74 5f 76 61 6c 75  l.value.int_valu
56c0: 65 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20  e);..  break;.  
56d0: 20 20 20 20 63 61 73 65 20 46 52 45 45 58 4c 5f      case FREEXL_
56e0: 43 45 4c 4c 5f 44 4f 55 42 4c 45 3a 0a 09 20 20  CELL_DOUBLE:..  
56f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
5700: 6f 75 62 6c 65 20 28 70 43 6f 6e 74 65 78 74 2c  ouble (pContext,
5710: 20 63 65 6c 6c 2e 76 61 6c 75 65 2e 64 6f 75 62   cell.value.doub
5720: 6c 65 5f 76 61 6c 75 65 29 3b 0a 09 20 20 62 72  le_value);..  br
5730: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
5740: 46 52 45 45 58 4c 5f 43 45 4c 4c 5f 54 45 58 54  FREEXL_CELL_TEXT
5750: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 46 52 45  :.      case FRE
5760: 45 58 4c 5f 43 45 4c 4c 5f 53 53 54 5f 54 45 58  EXL_CELL_SST_TEX
5770: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 46 52  T:.      case FR
5780: 45 45 58 4c 5f 43 45 4c 4c 5f 44 41 54 45 3a 0a  EEXL_CELL_DATE:.
5790: 20 20 20 20 20 20 63 61 73 65 20 46 52 45 45 58        case FREEX
57a0: 4c 5f 43 45 4c 4c 5f 44 41 54 45 54 49 4d 45 3a  L_CELL_DATETIME:
57b0: 0a 20 20 20 20 20 20 63 61 73 65 20 46 52 45 45  .      case FREE
57c0: 58 4c 5f 43 45 4c 4c 5f 54 49 4d 45 3a 0a 09 20  XL_CELL_TIME:.. 
57d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
57e0: 74 65 78 74 20 28 70 43 6f 6e 74 65 78 74 2c 20  text (pContext, 
57f0: 63 65 6c 6c 2e 76 61 6c 75 65 2e 74 65 78 74 5f  cell.value.text_
5800: 76 61 6c 75 65 2c 0a 09 09 09 20 20 20 20 20 20  value,....      
5810: 20 73 74 72 6c 65 6e 20 28 63 65 6c 6c 2e 76 61   strlen (cell.va
5820: 6c 75 65 2e 74 65 78 74 5f 76 61 6c 75 65 29 2c  lue.text_value),
5830: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
5840: 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
5850: 20 64 65 66 61 75 6c 74 3a 0a 09 20 20 73 71 6c   default:..  sql
5860: 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
5870: 20 28 70 43 6f 6e 74 65 78 74 29 3b 0a 09 20 20   (pContext);..  
5880: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 3b 0a  break;.      };.
5890: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
58a0: 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
58b0: 69 6e 74 0a 76 58 4c 5f 72 6f 77 69 64 20 28 73  int.vXL_rowid (s
58c0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
58d0: 6f 72 20 2a 20 70 43 75 72 73 6f 72 2c 20 73 71  or * pCursor, sq
58e0: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 20 70 52 6f  lite_int64 * pRo
58f0: 77 69 64 29 0a 7b 0a 2f 2a 20 66 65 74 63 68 69  wid).{./* fetchi
5900: 6e 67 20 74 68 65 20 52 4f 57 49 44 20 2a 2f 0a  ng the ROWID */.
5910: 20 20 20 20 56 69 72 74 75 61 6c 58 4c 43 75 72      VirtualXLCur
5920: 73 6f 72 50 74 72 20 63 75 72 73 6f 72 20 3d 20  sorPtr cursor = 
5930: 28 56 69 72 74 75 61 6c 58 4c 43 75 72 73 6f 72  (VirtualXLCursor
5940: 50 74 72 29 20 70 43 75 72 73 6f 72 3b 0a 20 20  Ptr) pCursor;.  
5950: 20 20 69 66 20 28 63 75 72 73 6f 72 2d 3e 70 56    if (cursor->pV
5960: 74 61 62 2d 3e 66 69 72 73 74 4c 69 6e 65 54 69  tab->firstLineTi
5970: 74 6c 65 73 20 3d 3d 20 27 59 27 29 0a 09 2a 70  tles == 'Y')..*p
5980: 52 6f 77 69 64 20 3d 20 63 75 72 73 6f 72 2d 3e  Rowid = cursor->
5990: 63 75 72 72 65 6e 74 5f 72 6f 77 20 2d 20 31 3b  current_row - 1;
59a0: 0a 20 20 20 20 65 6c 73 65 0a 09 2a 70 52 6f 77  .    else..*pRow
59b0: 69 64 20 3d 20 63 75 72 73 6f 72 2d 3e 63 75 72  id = cursor->cur
59c0: 72 65 6e 74 5f 72 6f 77 3b 0a 20 20 20 20 72 65  rent_row;.    re
59d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
59e0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 76 58  }..static int.vX
59f0: 4c 5f 75 70 64 61 74 65 20 28 73 71 6c 69 74 65  L_update (sqlite
5a00: 33 5f 76 74 61 62 20 2a 20 70 56 54 61 62 2c 20  3_vtab * pVTab, 
5a10: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
5a20: 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 2c  3_value ** argv,
5a30: 0a 09 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74  ..    sqlite_int
5a40: 36 34 20 2a 20 70 52 6f 77 69 64 29 0a 7b 0a 2f  64 * pRowid).{./
5a50: 2a 20 67 65 6e 65 72 69 63 20 75 70 64 61 74 65  * generic update
5a60: 20 5b 49 4e 53 45 52 54 20 2f 20 55 50 44 41 54   [INSERT / UPDAT
5a70: 45 20 2f 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20  E / DELETE */.  
5a80: 20 20 69 66 20 28 70 56 54 61 62 20 7c 7c 20 61    if (pVTab || a
5a90: 72 67 63 20 7c 7c 20 61 72 67 76 20 7c 7c 20 70  rgc || argv || p
5aa0: 52 6f 77 69 64 29 0a 09 70 56 54 61 62 20 3d 20  Rowid)..pVTab = 
5ab0: 70 56 54 61 62 3b 09 09 2f 2a 20 75 6e 75 73 65  pVTab;../* unuse
5ac0: 64 20 61 72 67 20 77 61 72 6e 69 6e 67 20 73 75  d arg warning su
5ad0: 70 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  ppression */.   
5ae0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
5af0: 45 41 44 4f 4e 4c 59 3b 0a 7d 0a 0a 73 74 61 74  EADONLY;.}..stat
5b00: 69 63 20 69 6e 74 0a 76 58 4c 5f 62 65 67 69 6e  ic int.vXL_begin
5b10: 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a   (sqlite3_vtab *
5b20: 20 70 56 54 61 62 29 0a 7b 0a 2f 2a 20 42 45 47   pVTab).{./* BEG
5b30: 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 20 2a  IN TRANSACTION *
5b40: 2f 0a 20 20 20 20 69 66 20 28 70 56 54 61 62 29  /.    if (pVTab)
5b50: 0a 09 70 56 54 61 62 20 3d 20 70 56 54 61 62 3b  ..pVTab = pVTab;
5b60: 09 09 2f 2a 20 75 6e 75 73 65 64 20 61 72 67 20  ../* unused arg 
5b70: 77 61 72 6e 69 6e 67 20 73 75 70 70 72 65 73 73  warning suppress
5b80: 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ion */.    retur
5b90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5ba0: 73 74 61 74 69 63 20 69 6e 74 0a 76 58 4c 5f 73  static int.vXL_s
5bb0: 79 6e 63 20 28 73 71 6c 69 74 65 33 5f 76 74 61  ync (sqlite3_vta
5bc0: 62 20 2a 20 70 56 54 61 62 29 0a 7b 0a 2f 2a 20  b * pVTab).{./* 
5bd0: 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f  BEGIN TRANSACTIO
5be0: 4e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 56 54  N */.    if (pVT
5bf0: 61 62 29 0a 09 70 56 54 61 62 20 3d 20 70 56 54  ab)..pVTab = pVT
5c00: 61 62 3b 09 09 2f 2a 20 75 6e 75 73 65 64 20 61  ab;../* unused a
5c10: 72 67 20 77 61 72 6e 69 6e 67 20 73 75 70 70 72  rg warning suppr
5c20: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 65  ession */.    re
5c30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5c40: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 76 58  }..static int.vX
5c50: 4c 5f 63 6f 6d 6d 69 74 20 28 73 71 6c 69 74 65  L_commit (sqlite
5c60: 33 5f 76 74 61 62 20 2a 20 70 56 54 61 62 29 0a  3_vtab * pVTab).
5c70: 7b 0a 2f 2a 20 42 45 47 49 4e 20 54 52 41 4e 53  {./* BEGIN TRANS
5c80: 41 43 54 49 4f 4e 20 2a 2f 0a 20 20 20 20 69 66  ACTION */.    if
5c90: 20 28 70 56 54 61 62 29 0a 09 70 56 54 61 62 20   (pVTab)..pVTab 
5ca0: 3d 20 70 56 54 61 62 3b 09 09 2f 2a 20 75 6e 75  = pVTab;../* unu
5cb0: 73 65 64 20 61 72 67 20 77 61 72 6e 69 6e 67 20  sed arg warning 
5cc0: 73 75 70 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  suppression */. 
5cd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5ce0: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
5cf0: 6e 74 0a 76 58 4c 5f 72 6f 6c 6c 62 61 63 6b 20  nt.vXL_rollback 
5d00: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 20  (sqlite3_vtab * 
5d10: 70 56 54 61 62 29 0a 7b 0a 2f 2a 20 42 45 47 49  pVTab).{./* BEGI
5d20: 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 20 2a 2f  N TRANSACTION */
5d30: 0a 20 20 20 20 69 66 20 28 70 56 54 61 62 29 0a  .    if (pVTab).
5d40: 09 70 56 54 61 62 20 3d 20 70 56 54 61 62 3b 09  .pVTab = pVTab;.
5d50: 09 2f 2a 20 75 6e 75 73 65 64 20 61 72 67 20 77  ./* unused arg w
5d60: 61 72 6e 69 6e 67 20 73 75 70 70 72 65 73 73 69  arning suppressi
5d70: 6f 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  on */.    return
5d80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
5d90: 74 61 74 69 63 20 69 6e 74 0a 76 58 4c 5f 72 65  tatic int.vXL_re
5da0: 6e 61 6d 65 20 28 73 71 6c 69 74 65 33 5f 76 74  name (sqlite3_vt
5db0: 61 62 20 2a 20 70 56 54 61 62 2c 20 63 6f 6e 73  ab * pVTab, cons
5dc0: 74 20 63 68 61 72 20 2a 7a 4e 65 77 29 0a 7b 0a  t char *zNew).{.
5dd0: 2f 2a 20 42 45 47 49 4e 20 54 52 41 4e 53 41 43  /* BEGIN TRANSAC
5de0: 54 49 4f 4e 20 2a 2f 0a 20 20 20 20 69 66 20 28  TION */.    if (
5df0: 70 56 54 61 62 29 0a 09 70 56 54 61 62 20 3d 20  pVTab)..pVTab = 
5e00: 70 56 54 61 62 3b 09 09 2f 2a 20 75 6e 75 73 65  pVTab;../* unuse
5e10: 64 20 61 72 67 20 77 61 72 6e 69 6e 67 20 73 75  d arg warning su
5e20: 70 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  ppression */.   
5e30: 20 69 66 20 28 7a 4e 65 77 29 0a 09 7a 4e 65 77   if (zNew)..zNew
5e40: 20 3d 20 7a 4e 65 77 3b 09 09 2f 2a 20 75 6e 75   = zNew;../* unu
5e50: 73 65 64 20 61 72 67 20 77 61 72 6e 69 6e 67 20  sed arg warning 
5e60: 73 75 70 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  suppression */. 
5e70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5e80: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69  _ERROR;.}..stati
5e90: 63 20 69 6e 74 0a 73 70 6c 69 74 65 56 69 72 74  c int.spliteVirt
5ea0: 75 61 6c 58 4c 49 6e 69 74 20 28 73 71 6c 69 74  ualXLInit (sqlit
5eb0: 65 33 20 2a 20 64 62 29 0a 7b 0a 20 20 20 20 69  e3 * db).{.    i
5ec0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5ed0: 4b 3b 0a 20 20 20 20 6d 79 5f 58 4c 5f 6d 6f 64  K;.    my_XL_mod
5ee0: 75 6c 65 2e 69 56 65 72 73 69 6f 6e 20 3d 20 31  ule.iVersion = 1
5ef0: 3b 0a 20 20 20 20 6d 79 5f 58 4c 5f 6d 6f 64 75  ;.    my_XL_modu
5f00: 6c 65 2e 78 43 72 65 61 74 65 20 3d 20 26 76 58  le.xCreate = &vX
5f10: 4c 5f 63 72 65 61 74 65 3b 0a 20 20 20 20 6d 79  L_create;.    my
5f20: 5f 58 4c 5f 6d 6f 64 75 6c 65 2e 78 43 6f 6e 6e  _XL_module.xConn
5f30: 65 63 74 20 3d 20 26 76 58 4c 5f 63 6f 6e 6e 65  ect = &vXL_conne
5f40: 63 74 3b 0a 20 20 20 20 6d 79 5f 58 4c 5f 6d 6f  ct;.    my_XL_mo
5f50: 64 75 6c 65 2e 78 42 65 73 74 49 6e 64 65 78 20  dule.xBestIndex 
5f60: 3d 20 26 76 58 4c 5f 62 65 73 74 5f 69 6e 64 65  = &vXL_best_inde
5f70: 78 3b 0a 20 20 20 20 6d 79 5f 58 4c 5f 6d 6f 64  x;.    my_XL_mod
5f80: 75 6c 65 2e 78 44 69 73 63 6f 6e 6e 65 63 74 20  ule.xDisconnect 
5f90: 3d 20 26 76 58 4c 5f 64 69 73 63 6f 6e 6e 65 63  = &vXL_disconnec
5fa0: 74 3b 0a 20 20 20 20 6d 79 5f 58 4c 5f 6d 6f 64  t;.    my_XL_mod
5fb0: 75 6c 65 2e 78 44 65 73 74 72 6f 79 20 3d 20 26  ule.xDestroy = &
5fc0: 76 58 4c 5f 64 65 73 74 72 6f 79 3b 0a 20 20 20  vXL_destroy;.   
5fd0: 20 6d 79 5f 58 4c 5f 6d 6f 64 75 6c 65 2e 78 4f   my_XL_module.xO
5fe0: 70 65 6e 20 3d 20 26 76 58 4c 5f 6f 70 65 6e 3b  pen = &vXL_open;
5ff0: 0a 20 20 20 20 6d 79 5f 58 4c 5f 6d 6f 64 75 6c  .    my_XL_modul
6000: 65 2e 78 43 6c 6f 73 65 20 3d 20 26 76 58 4c 5f  e.xClose = &vXL_
6010: 63 6c 6f 73 65 3b 0a 20 20 20 20 6d 79 5f 58 4c  close;.    my_XL
6020: 5f 6d 6f 64 75 6c 65 2e 78 46 69 6c 74 65 72 20  _module.xFilter 
6030: 3d 20 26 76 58 4c 5f 66 69 6c 74 65 72 3b 0a 20  = &vXL_filter;. 
6040: 20 20 20 6d 79 5f 58 4c 5f 6d 6f 64 75 6c 65 2e     my_XL_module.
6050: 78 4e 65 78 74 20 3d 20 26 76 58 4c 5f 6e 65 78  xNext = &vXL_nex
6060: 74 3b 0a 20 20 20 20 6d 79 5f 58 4c 5f 6d 6f 64  t;.    my_XL_mod
6070: 75 6c 65 2e 78 45 6f 66 20 3d 20 26 76 58 4c 5f  ule.xEof = &vXL_
6080: 65 6f 66 3b 0a 20 20 20 20 6d 79 5f 58 4c 5f 6d  eof;.    my_XL_m
6090: 6f 64 75 6c 65 2e 78 43 6f 6c 75 6d 6e 20 3d 20  odule.xColumn = 
60a0: 26 76 58 4c 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 20  &vXL_column;.   
60b0: 20 6d 79 5f 58 4c 5f 6d 6f 64 75 6c 65 2e 78 52   my_XL_module.xR
60c0: 6f 77 69 64 20 3d 20 26 76 58 4c 5f 72 6f 77 69  owid = &vXL_rowi
60d0: 64 3b 0a 20 20 20 20 6d 79 5f 58 4c 5f 6d 6f 64  d;.    my_XL_mod
60e0: 75 6c 65 2e 78 55 70 64 61 74 65 20 3d 20 26 76  ule.xUpdate = &v
60f0: 58 4c 5f 75 70 64 61 74 65 3b 0a 20 20 20 20 6d  XL_update;.    m
6100: 79 5f 58 4c 5f 6d 6f 64 75 6c 65 2e 78 42 65 67  y_XL_module.xBeg
6110: 69 6e 20 3d 20 26 76 58 4c 5f 62 65 67 69 6e 3b  in = &vXL_begin;
6120: 0a 20 20 20 20 6d 79 5f 58 4c 5f 6d 6f 64 75 6c  .    my_XL_modul
6130: 65 2e 78 53 79 6e 63 20 3d 20 26 76 58 4c 5f 73  e.xSync = &vXL_s
6140: 79 6e 63 3b 0a 20 20 20 20 6d 79 5f 58 4c 5f 6d  ync;.    my_XL_m
6150: 6f 64 75 6c 65 2e 78 43 6f 6d 6d 69 74 20 3d 20  odule.xCommit = 
6160: 26 76 58 4c 5f 63 6f 6d 6d 69 74 3b 0a 20 20 20  &vXL_commit;.   
6170: 20 6d 79 5f 58 4c 5f 6d 6f 64 75 6c 65 2e 78 52   my_XL_module.xR
6180: 6f 6c 6c 62 61 63 6b 20 3d 20 26 76 58 4c 5f 72  ollback = &vXL_r
6190: 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 6d 79 5f  ollback;.    my_
61a0: 58 4c 5f 6d 6f 64 75 6c 65 2e 78 46 69 6e 64 46  XL_module.xFindF
61b0: 75 6e 63 74 69 6f 6e 20 3d 20 4e 55 4c 4c 3b 0a  unction = NULL;.
61c0: 20 20 20 20 6d 79 5f 58 4c 5f 6d 6f 64 75 6c 65      my_XL_module
61d0: 2e 78 52 65 6e 61 6d 65 20 3d 20 26 76 58 4c 5f  .xRename = &vXL_
61e0: 72 65 6e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69  rename;.    sqli
61f0: 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
6200: 65 5f 76 32 20 28 64 62 2c 20 22 56 69 72 74 75  e_v2 (db, "Virtu
6210: 61 6c 58 4c 22 2c 20 26 6d 79 5f 58 4c 5f 6d 6f  alXL", &my_XL_mo
6220: 64 75 6c 65 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  dule, NULL, 0);.
6230: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d      return rc;.}
6240: 0a 0a 53 50 41 54 49 41 4c 49 54 45 5f 50 52 49  ..SPATIALITE_PRI
6250: 56 41 54 45 20 69 6e 74 0a 76 69 72 74 75 61 6c  VATE int.virtual
6260: 58 4c 5f 65 78 74 65 6e 73 69 6f 6e 5f 69 6e 69  XL_extension_ini
6270: 74 20 28 76 6f 69 64 20 2a 78 64 62 29 0a 7b 0a  t (void *xdb).{.
6280: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
6290: 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 20 78 64  = (sqlite3 *) xd
62a0: 62 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 70  b;.    return sp
62b0: 6c 69 74 65 56 69 72 74 75 61 6c 58 4c 49 6e 69  liteVirtualXLIni
62c0: 74 20 28 64 62 29 3b 0a 7d 0a 0a 23 65 6e 64 69  t (db);.}..#endi
62d0: 66 20 2f 2a 20 46 72 65 65 58 4c 20 65 6e 61 62  f /* FreeXL enab
62e0: 6c 65 64 2f 64 69 73 61 62 6c 65 64 20 2a 2f 0a  led/disabled */.
62f0: 23 65 6e 64 69 66 20 2f 2a 20 49 43 4f 4e 56 20  #endif /* ICONV 
6300: 65 6e 61 62 6c 65 64 2f 64 69 73 61 62 6c 65 64  enabled/disabled
6310: 20 2a 2f 0a                                       */.