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 */.