SQLite
Hex Artifact Content
Not logged in

Artifact ed96c218ea940b85c9a274c4d9c59fe9491c299147a38a8bba537687bd6c6005:


0000: 2f 2a 0a 2a 2a 20 32 30 31 36 2d 30 36 2d 32 39  /*.** 2016-06-29
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 68 6f 77  demonstrates how
0190: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
01a0: 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69  le-valued-functi
01b0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 72 65 74 75 72  on that.** retur
01c0: 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  ns the values in
01d0: 20 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 61 72   a C-language ar
01e0: 72 61 79 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  ray..** Examples
01f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c  :.**.**      SEL
0200: 45 43 54 20 2a 20 46 52 4f 4d 20 63 61 72 72 61  ECT * FROM carra
0210: 79 28 24 70 74 72 2c 35 29 0a 2a 2a 0a 2a 2a 20  y($ptr,5).**.** 
0220: 54 68 65 20 71 75 65 72 79 20 61 62 6f 76 65 20  The query above 
0230: 72 65 74 75 72 6e 73 20 35 20 69 6e 74 65 67 65  returns 5 intege
0240: 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  rs contained in 
0250: 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 61 72 72  a C-language arr
0260: 61 79 0a 2a 2a 20 61 74 20 74 68 65 20 61 64 64  ay.** at the add
0270: 72 65 73 73 20 24 70 74 72 2e 20 20 24 70 74 72  ress $ptr.  $ptr
0280: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
0290: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 69 6e   the array of in
02a0: 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68 65 20 70  tegers..** The p
02b0: 6f 69 6e 74 65 72 20 76 61 6c 75 65 20 6d 75 73  ointer value mus
02c0: 74 20 62 65 20 61 73 73 69 67 6e 65 64 20 74 6f  t be assigned to
02d0: 20 24 70 74 72 20 75 73 69 6e 67 20 74 68 65 0a   $ptr using the.
02e0: 2a 2a 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  ** sqlite3_bind_
02f0: 70 6f 69 6e 74 65 72 28 29 20 69 6e 74 65 72 66  pointer() interf
0300: 61 63 65 20 77 69 74 68 20 61 20 70 6f 69 6e 74  ace with a point
0310: 65 72 20 74 79 70 65 20 6f 66 20 22 63 61 72 72  er type of "carr
0320: 61 79 22 2e 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ay"..** For exam
0330: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 74  ple:.**.**    st
0340: 61 74 69 63 20 69 6e 74 20 61 58 5b 5d 20 3d 20  atic int aX[] = 
0350: 7b 20 35 33 2c 20 39 2c 20 31 37 2c 20 32 32 33  { 53, 9, 17, 223
0360: 31 2c 20 34 2c 20 39 39 20 7d 3b 0a 2a 2a 20 20  1, 4, 99 };.**  
0370: 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65    int i = sqlite
0380: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
0390: 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 20 22 24  _index(pStmt, "$
03a0: 70 74 72 22 29 3b 0a 2a 2a 20 20 20 20 73 71 6c  ptr");.**    sql
03b0: 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
03c0: 70 53 74 6d 74 2c 20 69 2c 20 61 58 2c 20 22 63  pStmt, i, aX, "c
03d0: 61 72 72 61 79 22 2c 20 30 29 3b 0a 2a 2a 0a 2a  array", 0);.**.*
03e0: 2a 20 54 68 65 72 65 20 69 73 20 61 6e 20 6f 70  * There is an op
03f0: 74 69 6f 6e 61 6c 20 74 68 69 72 64 20 70 61 72  tional third par
0400: 61 6d 65 74 65 72 20 74 6f 20 64 65 74 65 72 6d  ameter to determ
0410: 69 6e 65 20 74 68 65 20 64 61 74 61 74 79 70 65  ine the datatype
0420: 20 6f 66 0a 2a 2a 20 74 68 65 20 43 2d 6c 61 6e   of.** the C-lan
0430: 67 75 61 67 65 20 61 72 72 61 79 2e 20 20 41 6c  guage array.  Al
0440: 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20  lowed values of 
0450: 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65  the third parame
0460: 74 65 72 20 61 72 65 0a 2a 2a 20 27 69 6e 74 33  ter are.** 'int3
0470: 32 27 2c 20 27 69 6e 74 36 34 27 2c 20 27 64 6f  2', 'int64', 'do
0480: 75 62 6c 65 27 2c 20 27 63 68 61 72 2a 27 2e 20  uble', 'char*'. 
0490: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
04a0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
04b0: 4f 4d 20 63 61 72 72 61 79 28 24 70 74 72 2c 31  OM carray($ptr,1
04c0: 30 2c 27 63 68 61 72 2a 27 29 3b 0a 2a 2a 0a 2a  0,'char*');.**.*
04d0: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  * The default va
04e0: 6c 75 65 20 6f 66 20 74 68 65 20 74 68 69 72 64  lue of the third
04f0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 27 69   parameter is 'i
0500: 6e 74 33 32 27 2e 0a 2a 2a 0a 2a 2a 20 48 4f 57  nt32'..**.** HOW
0510: 20 49 54 20 57 4f 52 4b 53 0a 2a 2a 0a 2a 2a 20   IT WORKS.**.** 
0520: 54 68 65 20 63 61 72 72 61 79 20 22 66 75 6e 63  The carray "func
0530: 74 69 6f 6e 22 20 69 73 20 72 65 61 6c 6c 79 20  tion" is really 
0540: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
0550: 77 69 74 68 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  with the.** foll
0560: 6f 77 69 6e 67 20 73 63 68 65 6d 61 3a 0a 2a 2a  owing schema:.**
0570: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0580: 41 42 4c 45 20 63 61 72 72 61 79 28 0a 2a 2a 20  ABLE carray(.** 
0590: 20 20 20 20 20 20 76 61 6c 75 65 2c 0a 2a 2a 20        value,.** 
05a0: 20 20 20 20 20 20 70 6f 69 6e 74 65 72 20 48 49        pointer HI
05b0: 44 44 45 4e 2c 0a 2a 2a 20 20 20 20 20 20 20 63  DDEN,.**       c
05c0: 6f 75 6e 74 20 48 49 44 44 45 4e 2c 0a 2a 2a 20  ount HIDDEN,.** 
05d0: 20 20 20 20 20 20 63 74 79 70 65 20 54 45 58 54        ctype TEXT
05e0: 20 48 49 44 44 45 4e 0a 2a 2a 20 20 20 20 20 29   HIDDEN.**     )
05f0: 3b 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ;.**.** If the h
0600: 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 22 70  idden columns "p
0610: 6f 69 6e 74 65 72 22 20 61 6e 64 20 22 63 6f 75  ointer" and "cou
0620: 6e 74 22 20 61 72 65 20 75 6e 63 6f 6e 73 74 72  nt" are unconstr
0630: 61 69 6e 65 64 2c 20 74 68 65 6e 20 0a 2a 2a 20  ained, then .** 
0640: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
0650: 65 20 68 61 73 20 6e 6f 20 72 6f 77 73 2e 20 20  e has no rows.  
0660: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 76  Otherwise, the v
0670: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 74  irtual table int
0680: 65 72 70 72 65 74 73 0a 2a 2a 20 74 68 65 20 69  erprets.** the i
0690: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6f 66 20  nteger value of 
06a0: 22 70 6f 69 6e 74 65 72 22 20 61 73 20 61 20 70  "pointer" as a p
06b0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72  ointer to the ar
06c0: 72 61 79 20 61 6e 64 20 22 63 6f 75 6e 74 22 0a  ray and "count".
06d0: 2a 2a 20 61 73 20 74 68 65 20 6e 75 6d 62 65 72  ** as the number
06e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
06f0: 74 68 65 20 61 72 72 61 79 2e 20 20 54 68 65 20  the array.  The 
0700: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 74  virtual table st
0710: 65 70 73 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  eps through.** t
0720: 68 65 20 61 72 72 61 79 2c 20 65 6c 65 6d 65 6e  he array, elemen
0730: 74 20 62 79 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f  t by element..*/
0740: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0750: 65 33 65 78 74 2e 68 22 0a 53 51 4c 49 54 45 5f  e3ext.h".SQLITE_
0760: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a  EXTENSION_INIT1.
0770: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0780: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0790: 72 69 6e 67 2e 68 3e 0a 0a 23 69 66 6e 64 65 66  ring.h>..#ifndef
07a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
07b0: 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a  TUALTABLE../*.**
07c0: 20 41 6c 6c 6f 77 65 64 20 64 61 74 61 74 79 70   Allowed datatyp
07d0: 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41  es.*/.#define CA
07e0: 52 52 41 59 5f 49 4e 54 33 32 20 20 20 20 30 0a  RRAY_INT32    0.
07f0: 23 64 65 66 69 6e 65 20 43 41 52 52 41 59 5f 49  #define CARRAY_I
0800: 4e 54 36 34 20 20 20 20 31 0a 23 64 65 66 69 6e  NT64    1.#defin
0810: 65 20 43 41 52 52 41 59 5f 44 4f 55 42 4c 45 20  e CARRAY_DOUBLE 
0820: 20 20 32 0a 23 64 65 66 69 6e 65 20 43 41 52 52    2.#define CARR
0830: 41 59 5f 54 45 58 54 20 20 20 20 20 33 0a 0a 2f  AY_TEXT     3../
0840: 2a 0a 2a 2a 20 4e 61 6d 65 73 20 6f 66 20 74 79  *.** Names of ty
0850: 70 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  pes.*/.static co
0860: 6e 73 74 20 63 68 61 72 20 2a 61 7a 54 79 70 65  nst char *azType
0870: 5b 5d 20 3d 20 7b 20 22 69 6e 74 33 32 22 2c 20  [] = { "int32", 
0880: 22 69 6e 74 36 34 22 2c 20 22 64 6f 75 62 6c 65  "int64", "double
0890: 22 2c 20 22 63 68 61 72 2a 22 20 7d 3b 0a 0a 0a  ", "char*" };...
08a0: 2f 2a 20 63 61 72 72 61 79 5f 63 75 72 73 6f 72  /* carray_cursor
08b0: 20 69 73 20 61 20 73 75 62 63 6c 61 73 73 20 6f   is a subclass o
08c0: 66 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  f sqlite3_vtab_c
08d0: 75 72 73 6f 72 20 77 68 69 63 68 20 77 69 6c 6c  ursor which will
08e0: 0a 2a 2a 20 73 65 72 76 65 20 61 73 20 74 68 65  .** serve as the
08f0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 72 65 70 72   underlying repr
0900: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20  esentation of a 
0910: 63 75 72 73 6f 72 20 74 68 61 74 20 73 63 61 6e  cursor that scan
0920: 73 0a 2a 2a 20 6f 76 65 72 20 72 6f 77 73 20 6f  s.** over rows o
0930: 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2f 0a  f the result.*/.
0940: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 63  typedef struct c
0950: 61 72 72 61 79 5f 63 75 72 73 6f 72 20 63 61 72  array_cursor car
0960: 72 61 79 5f 63 75 72 73 6f 72 3b 0a 73 74 72 75  ray_cursor;.stru
0970: 63 74 20 63 61 72 72 61 79 5f 63 75 72 73 6f 72  ct carray_cursor
0980: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
0990: 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 20 20  b_cursor base;  
09a0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2d 20  /* Base class - 
09b0: 6d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f  must be first */
09c0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
09d0: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a   iRowid;      /*
09e0: 20 54 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   The rowid */.  
09f0: 76 6f 69 64 20 2a 70 50 74 72 3b 20 20 20 20 20  void *pPtr;     
0a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
0a10: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
0a20: 61 79 20 6f 66 20 76 61 6c 75 65 73 20 2a 2f 0a  ay of values */.
0a30: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0a40: 69 43 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  iCnt;        /* 
0a50: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65  Number of intege
0a60: 72 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  rs in the array 
0a70: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
0a80: 61 72 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  ar eType;       
0a90: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 41  /* One of the CA
0aa0: 52 52 41 59 5f 74 79 70 65 20 76 61 6c 75 65 73  RRAY_type values
0ab0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
0ac0: 65 20 63 61 72 72 61 79 43 6f 6e 6e 65 63 74 28  e carrayConnect(
0ad0: 29 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f  ) method is invo
0ae0: 6b 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  ked to create a 
0af0: 6e 65 77 0a 2a 2a 20 63 61 72 72 61 79 5f 76 74  new.** carray_vt
0b00: 61 62 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ab that describe
0b10: 73 20 74 68 65 20 63 61 72 72 61 79 20 76 69 72  s the carray vir
0b20: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
0b30: 2a 20 54 68 69 6e 6b 20 6f 66 20 74 68 69 73 20  * Think of this 
0b40: 72 6f 75 74 69 6e 65 20 61 73 20 74 68 65 20 63  routine as the c
0b50: 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20 63  onstructor for c
0b60: 61 72 72 61 79 5f 76 74 61 62 20 6f 62 6a 65 63  array_vtab objec
0b70: 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68  ts..**.** All th
0b80: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
0b90: 20 74 6f 20 64 6f 20 69 73 3a 0a 2a 2a 0a 2a 2a   to do is:.**.**
0ba0: 20 20 20 20 28 31 29 20 41 6c 6c 6f 63 61 74 65      (1) Allocate
0bb0: 20 74 68 65 20 63 61 72 72 61 79 5f 76 74 61 62   the carray_vtab
0bc0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 6e 69 74   object and init
0bd0: 69 61 6c 69 7a 65 20 61 6c 6c 20 66 69 65 6c 64  ialize all field
0be0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  s..**.**    (2) 
0bf0: 54 65 6c 6c 20 53 51 4c 69 74 65 20 28 76 69 61  Tell SQLite (via
0c00: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 64 65 63   the sqlite3_dec
0c10: 6c 61 72 65 5f 76 74 61 62 28 29 20 69 6e 74 65  lare_vtab() inte
0c20: 72 66 61 63 65 29 20 77 68 61 74 20 74 68 65 0a  rface) what the.
0c30: 2a 2a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  **        result
0c40: 20 73 65 74 20 6f 66 20 71 75 65 72 69 65 73 20   set of queries 
0c50: 61 67 61 69 6e 73 74 20 63 61 72 72 61 79 20 77  against carray w
0c60: 69 6c 6c 20 6c 6f 6f 6b 20 6c 69 6b 65 2e 0a 2a  ill look like..*
0c70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 72  /.static int car
0c80: 72 61 79 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71  rayConnect(.  sq
0c90: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
0ca0: 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
0cb0: 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
0cc0: 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
0cd0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
0ce0: 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  Vtab,.  char **p
0cf0: 7a 45 72 72 0a 29 7b 0a 20 20 73 71 6c 69 74 65  zErr.){.  sqlite
0d00: 33 5f 76 74 61 62 20 2a 70 4e 65 77 3b 0a 20 20  3_vtab *pNew;.  
0d10: 69 6e 74 20 72 63 3b 0a 0a 2f 2a 20 43 6f 6c 75  int rc;../* Colu
0d20: 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 23 64  mn numbers */.#d
0d30: 65 66 69 6e 65 20 43 41 52 52 41 59 5f 43 4f 4c  efine CARRAY_COL
0d40: 55 4d 4e 5f 56 41 4c 55 45 20 20 20 30 0a 23 64  UMN_VALUE   0.#d
0d50: 65 66 69 6e 65 20 43 41 52 52 41 59 5f 43 4f 4c  efine CARRAY_COL
0d60: 55 4d 4e 5f 50 4f 49 4e 54 45 52 20 31 0a 23 64  UMN_POINTER 1.#d
0d70: 65 66 69 6e 65 20 43 41 52 52 41 59 5f 43 4f 4c  efine CARRAY_COL
0d80: 55 4d 4e 5f 43 4f 55 4e 54 20 20 20 32 0a 23 64  UMN_COUNT   2.#d
0d90: 65 66 69 6e 65 20 43 41 52 52 41 59 5f 43 4f 4c  efine CARRAY_COL
0da0: 55 4d 4e 5f 43 54 59 50 45 20 20 20 33 0a 0a 20  UMN_CTYPE   3.. 
0db0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
0dc0: 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 0a 20  clare_vtab(db,. 
0dd0: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
0de0: 45 20 78 28 76 61 6c 75 65 2c 70 6f 69 6e 74 65  E x(value,pointe
0df0: 72 20 68 69 64 64 65 6e 2c 63 6f 75 6e 74 20 68  r hidden,count h
0e00: 69 64 64 65 6e 2c 63 74 79 70 65 20 68 69 64 64  idden,ctype hidd
0e10: 65 6e 29 22 29 3b 0a 20 20 69 66 28 20 72 63 3d  en)");.  if( rc=
0e20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
0e30: 20 20 70 4e 65 77 20 3d 20 2a 70 70 56 74 61 62    pNew = *ppVtab
0e40: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
0e50: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
0e60: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
0e70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
0e80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d  ITE_NOMEM;.    m
0e90: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
0ea0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
0eb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
0ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  }../*.** This me
0ed0: 74 68 6f 64 20 69 73 20 74 68 65 20 64 65 73 74  thod is the dest
0ee0: 72 75 63 74 6f 72 20 66 6f 72 20 63 61 72 72 61  ructor for carra
0ef0: 79 5f 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 73  y_cursor objects
0f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0f10: 63 61 72 72 61 79 44 69 73 63 6f 6e 6e 65 63 74  carrayDisconnect
0f20: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
0f30: 56 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33  Vtab){.  sqlite3
0f40: 5f 66 72 65 65 28 70 56 74 61 62 29 3b 0a 20 20  _free(pVtab);.  
0f50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0f60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  ;.}../*.** Const
0f70: 72 75 63 74 6f 72 20 66 6f 72 20 61 20 6e 65 77  ructor for a new
0f80: 20 63 61 72 72 61 79 5f 63 75 72 73 6f 72 20 6f   carray_cursor o
0f90: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
0fa0: 20 69 6e 74 20 63 61 72 72 61 79 4f 70 65 6e 28   int carrayOpen(
0fb0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 2c  sqlite3_vtab *p,
0fc0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
0fd0: 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29  rsor **ppCursor)
0fe0: 7b 0a 20 20 63 61 72 72 61 79 5f 63 75 72 73 6f  {.  carray_curso
0ff0: 72 20 2a 70 43 75 72 3b 0a 20 20 70 43 75 72 20  r *pCur;.  pCur 
1000: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1010: 28 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 20  ( sizeof(*pCur) 
1020: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30  );.  if( pCur==0
1030: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1040: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
1050: 28 70 43 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCur, 0, sizeof
1060: 28 2a 70 43 75 72 29 29 3b 0a 20 20 2a 70 70 43  (*pCur));.  *ppC
1070: 75 72 73 6f 72 20 3d 20 26 70 43 75 72 2d 3e 62  ursor = &pCur->b
1080: 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ase;.  return SQ
1090: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10a0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
10b0: 20 61 20 63 61 72 72 61 79 5f 63 75 72 73 6f 72   a carray_cursor
10c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10d0: 63 61 72 72 61 79 43 6c 6f 73 65 28 73 71 6c 69  carrayClose(sqli
10e0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
10f0: 2a 63 75 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  *cur){.  sqlite3
1100: 5f 66 72 65 65 28 63 75 72 29 3b 0a 20 20 72 65  _free(cur);.  re
1110: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1120: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  }.../*.** Advanc
1130: 65 20 61 20 63 61 72 72 61 79 5f 63 75 72 73 6f  e a carray_curso
1140: 72 20 74 6f 20 69 74 73 20 6e 65 78 74 20 72 6f  r to its next ro
1150: 77 20 6f 66 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a  w of output..*/.
1160: 73 74 61 74 69 63 20 69 6e 74 20 63 61 72 72 61  static int carra
1170: 79 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74  yNext(sqlite3_vt
1180: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
1190: 0a 20 20 63 61 72 72 61 79 5f 63 75 72 73 6f 72  .  carray_cursor
11a0: 20 2a 70 43 75 72 20 3d 20 28 63 61 72 72 61 79   *pCur = (carray
11b0: 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20  _cursor*)cur;.  
11c0: 70 43 75 72 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a  pCur->iRowid++;.
11d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
11f0: 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 63 6f  urn values of co
1200: 6c 75 6d 6e 73 20 66 6f 72 20 74 68 65 20 72 6f  lumns for the ro
1210: 77 20 61 74 20 77 68 69 63 68 20 74 68 65 20 63  w at which the c
1220: 61 72 72 61 79 5f 63 75 72 73 6f 72 0a 2a 2a 20  array_cursor.** 
1230: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1240: 6e 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  nting..*/.static
1250: 20 69 6e 74 20 63 61 72 72 61 79 43 6f 6c 75 6d   int carrayColum
1260: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  n(.  sqlite3_vta
1270: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 20  b_cursor *cur,  
1280: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 2a   /* The cursor *
1290: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  /.  sqlite3_cont
12a0: 65 78 74 20 2a 63 74 78 2c 20 20 20 20 20 20 20  ext *ctx,       
12b0: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
12c0: 74 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73  t to sqlite3_res
12d0: 75 6c 74 5f 2e 2e 2e 28 29 20 2a 2f 0a 20 20 69  ult_...() */.  i
12e0: 6e 74 20 69 20 20 20 20 20 20 20 20 20 20 20 20  nt i            
12f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
1300: 69 63 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65  ich column to re
1310: 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 63 61 72  turn */.){.  car
1320: 72 61 79 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ray_cursor *pCur
1330: 20 3d 20 28 63 61 72 72 61 79 5f 63 75 72 73 6f   = (carray_curso
1340: 72 2a 29 63 75 72 3b 0a 20 20 73 71 6c 69 74 65  r*)cur;.  sqlite
1350: 33 5f 69 6e 74 36 34 20 78 20 3d 20 30 3b 0a 20  3_int64 x = 0;. 
1360: 20 73 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20   switch( i ){.  
1370: 20 20 63 61 73 65 20 43 41 52 52 41 59 5f 43 4f    case CARRAY_CO
1380: 4c 55 4d 4e 5f 50 4f 49 4e 54 45 52 3a 20 20 20  LUMN_POINTER:   
1390: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13a0: 3b 0a 20 20 20 20 63 61 73 65 20 43 41 52 52 41  ;.    case CARRA
13b0: 59 5f 43 4f 4c 55 4d 4e 5f 43 4f 55 4e 54 3a 20  Y_COLUMN_COUNT: 
13c0: 20 20 20 20 78 20 3d 20 70 43 75 72 2d 3e 69 43      x = pCur->iC
13d0: 6e 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  nt;   break;.   
13e0: 20 63 61 73 65 20 43 41 52 52 41 59 5f 43 4f 4c   case CARRAY_COL
13f0: 55 4d 4e 5f 43 54 59 50 45 3a 20 7b 0a 20 20 20  UMN_CTYPE: {.   
1400: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1410: 74 5f 74 65 78 74 28 63 74 78 2c 20 61 7a 54 79  t_text(ctx, azTy
1420: 70 65 5b 70 43 75 72 2d 3e 65 54 79 70 65 5d 2c  pe[pCur->eType],
1430: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
1440: 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  IC);.      retur
1450: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1460: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
1470: 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  {.      switch( 
1480: 70 43 75 72 2d 3e 65 54 79 70 65 20 29 7b 0a 20  pCur->eType ){. 
1490: 20 20 20 20 20 20 20 63 61 73 65 20 43 41 52 52         case CARR
14a0: 41 59 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20  AY_INT32: {.    
14b0: 20 20 20 20 20 20 69 6e 74 20 2a 70 20 3d 20 28        int *p = (
14c0: 69 6e 74 2a 29 70 43 75 72 2d 3e 70 50 74 72 3b  int*)pCur->pPtr;
14d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14e0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74  e3_result_int(ct
14f0: 78 2c 20 70 5b 70 43 75 72 2d 3e 69 52 6f 77 69  x, p[pCur->iRowi
1500: 64 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  d-1]);.         
1510: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1520: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
1530: 20 20 20 20 20 63 61 73 65 20 43 41 52 52 41 59       case CARRAY
1540: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
1550: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
1560: 34 20 2a 70 20 3d 20 28 73 71 6c 69 74 65 33 5f  4 *p = (sqlite3_
1570: 69 6e 74 36 34 2a 29 70 43 75 72 2d 3e 70 50 74  int64*)pCur->pPt
1580: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  r;.          sql
1590: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
15a0: 34 28 63 74 78 2c 20 70 5b 70 43 75 72 2d 3e 69  4(ctx, p[pCur->i
15b0: 52 6f 77 69 64 2d 31 5d 29 3b 0a 20 20 20 20 20  Rowid-1]);.     
15c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15d0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
15e0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 43 41  .        case CA
15f0: 52 52 41 59 5f 44 4f 55 42 4c 45 3a 20 7b 0a 20  RRAY_DOUBLE: {. 
1600: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
1610: 2a 70 20 3d 20 28 64 6f 75 62 6c 65 2a 29 70 43  *p = (double*)pC
1620: 75 72 2d 3e 70 50 74 72 3b 0a 20 20 20 20 20 20  ur->pPtr;.      
1630: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1640: 6c 74 5f 64 6f 75 62 6c 65 28 63 74 78 2c 20 70  lt_double(ctx, p
1650: 5b 70 43 75 72 2d 3e 69 52 6f 77 69 64 2d 31 5d  [pCur->iRowid-1]
1660: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1670: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1680: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1690: 20 63 61 73 65 20 43 41 52 52 41 59 5f 54 45 58   case CARRAY_TEX
16a0: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63  T: {.          c
16b0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 20 3d 20  onst char **p = 
16c0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 43  (const char**)pC
16d0: 75 72 2d 3e 70 50 74 72 3b 0a 20 20 20 20 20 20  ur->pPtr;.      
16e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
16f0: 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 5b 70  lt_text(ctx, p[p
1700: 43 75 72 2d 3e 69 52 6f 77 69 64 2d 31 5d 2c 20  Cur->iRowid-1], 
1710: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
1720: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 20  IENT);.         
1730: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1740: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
1750: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1760: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1770: 69 6e 74 36 34 28 63 74 78 2c 20 78 29 3b 0a 20  int64(ctx, x);. 
1780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1790: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
17a0: 72 6e 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72  rn the rowid for
17b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
17c0: 2e 20 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65  .  In this imple
17d0: 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 0a 2a  mentation, the.*
17e0: 2a 20 72 6f 77 69 64 20 69 73 20 74 68 65 20 73  * rowid is the s
17f0: 61 6d 65 20 61 73 20 74 68 65 20 6f 75 74 70 75  ame as the outpu
1800: 74 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  t value..*/.stat
1810: 69 63 20 69 6e 74 20 63 61 72 72 61 79 52 6f 77  ic int carrayRow
1820: 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  id(sqlite3_vtab_
1830: 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c  cursor *cur, sql
1840: 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
1850: 64 29 7b 0a 20 20 63 61 72 72 61 79 5f 63 75 72  d){.  carray_cur
1860: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 63 61 72  sor *pCur = (car
1870: 72 61 79 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b  ray_cursor*)cur;
1880: 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 75  .  *pRowid = pCu
1890: 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74  r->iRowid;.  ret
18a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
18c0: 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
18d0: 72 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  r has been moved
18e0: 20 6f 66 66 20 6f 66 20 74 68 65 20 6c 61 73 74   off of the last
18f0: 0a 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  .** row of outpu
1900: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1910: 20 63 61 72 72 61 79 45 6f 66 28 73 71 6c 69 74   carrayEof(sqlit
1920: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
1930: 63 75 72 29 7b 0a 20 20 63 61 72 72 61 79 5f 63  cur){.  carray_c
1940: 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 63  ursor *pCur = (c
1950: 61 72 72 61 79 5f 63 75 72 73 6f 72 2a 29 63 75  array_cursor*)cu
1960: 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  r;.  return pCur
1970: 2d 3e 69 52 6f 77 69 64 3e 70 43 75 72 2d 3e 69  ->iRowid>pCur->i
1980: 43 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Cnt;.}../*.** Th
1990: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  is method is cal
19a0: 6c 65 64 20 74 6f 20 22 72 65 77 69 6e 64 22 20  led to "rewind" 
19b0: 74 68 65 20 63 61 72 72 61 79 5f 63 75 72 73 6f  the carray_curso
19c0: 72 20 6f 62 6a 65 63 74 20 62 61 63 6b 0a 2a 2a  r object back.**
19d0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
19e0: 77 20 6f 66 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a  w of output..*/.
19f0: 73 74 61 74 69 63 20 69 6e 74 20 63 61 72 72 61  static int carra
1a00: 79 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74  yFilter(.  sqlit
1a10: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
1a20: 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20  pVtabCursor, .  
1a30: 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73  int idxNum, cons
1a40: 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a  t char *idxStr,.
1a50: 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69    int argc, sqli
1a60: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
1a70: 0a 29 7b 0a 20 20 63 61 72 72 61 79 5f 63 75 72  .){.  carray_cur
1a80: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 63 61 72  sor *pCur = (car
1a90: 72 61 79 5f 63 75 72 73 6f 72 20 2a 29 70 56 74  ray_cursor *)pVt
1aa0: 61 62 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  abCursor;.  if( 
1ab0: 69 64 78 4e 75 6d 20 29 7b 0a 20 20 20 20 70 43  idxNum ){.    pC
1ac0: 75 72 2d 3e 70 50 74 72 20 3d 20 73 71 6c 69 74  ur->pPtr = sqlit
1ad0: 65 33 5f 76 61 6c 75 65 5f 70 6f 69 6e 74 65 72  e3_value_pointer
1ae0: 28 61 72 67 76 5b 30 5d 2c 20 22 63 61 72 72 61  (argv[0], "carra
1af0: 79 22 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  y");.    pCur->i
1b00: 43 6e 74 20 3d 20 70 43 75 72 2d 3e 70 50 74 72  Cnt = pCur->pPtr
1b10: 20 3f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   ? sqlite3_value
1b20: 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 20  _int64(argv[1]) 
1b30: 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 69 64 78  : 0;.    if( idx
1b40: 4e 75 6d 3c 33 20 29 7b 0a 20 20 20 20 20 20 70  Num<3 ){.      p
1b50: 43 75 72 2d 3e 65 54 79 70 65 20 3d 20 43 41 52  Cur->eType = CAR
1b60: 52 41 59 5f 49 4e 54 33 32 3b 0a 20 20 20 20 7d  RAY_INT32;.    }
1b70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 73 69  else{.      unsi
1b80: 67 6e 65 64 20 63 68 61 72 20 69 3b 0a 20 20 20  gned char i;.   
1b90: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1ba0: 54 79 70 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Type = (const ch
1bb0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
1bc0: 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b  e_text(argv[2]);
1bd0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1be0: 69 3c 73 69 7a 65 6f 66 28 61 7a 54 79 70 65 29  i<sizeof(azType)
1bf0: 2f 73 69 7a 65 6f 66 28 61 7a 54 79 70 65 5b 30  /sizeof(azType[0
1c00: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
1c10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1c20: 72 69 63 6d 70 28 7a 54 79 70 65 2c 20 61 7a 54  ricmp(zType, azT
1c30: 79 70 65 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65  ype[i])==0 ) bre
1c40: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c50: 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28    if( i>=sizeof(
1c60: 61 7a 54 79 70 65 29 2f 73 69 7a 65 6f 66 28 61  azType)/sizeof(a
1c70: 7a 54 79 70 65 5b 30 5d 29 20 29 7b 0a 20 20 20  zType[0]) ){.   
1c80: 20 20 20 20 20 70 56 74 61 62 43 75 72 73 6f 72       pVtabCursor
1c90: 2d 3e 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  ->pVtab->zErrMsg
1ca0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1cb0: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 75  tf(.          "u
1cc0: 6e 6b 6e 6f 77 6e 20 64 61 74 61 74 79 70 65 3a  nknown datatype:
1cd0: 20 25 51 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20   %Q", zType);.  
1ce0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1cf0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
1d00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d10: 70 43 75 72 2d 3e 65 54 79 70 65 20 3d 20 69 3b  pCur->eType = i;
1d20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
1d40: 2d 3e 70 50 74 72 20 3d 20 30 3b 0a 20 20 20 20  ->pPtr = 0;.    
1d50: 70 43 75 72 2d 3e 69 43 6e 74 20 3d 20 30 3b 0a  pCur->iCnt = 0;.
1d60: 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 52 6f 77    }.  pCur->iRow
1d70: 69 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  id = 1;.  return
1d80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d90: 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 77 69 6c 6c  *.** SQLite will
1da0: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6d 65 74   invoke this met
1db0: 68 6f 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hod one or more 
1dc0: 74 69 6d 65 73 20 77 68 69 6c 65 20 70 6c 61 6e  times while plan
1dd0: 6e 69 6e 67 20 61 20 71 75 65 72 79 0a 2a 2a 20  ning a query.** 
1de0: 74 68 61 74 20 75 73 65 73 20 74 68 65 20 63 61  that uses the ca
1df0: 72 72 61 79 20 76 69 72 74 75 61 6c 20 74 61 62  rray virtual tab
1e00: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
1e10: 65 20 6e 65 65 64 73 20 74 6f 20 63 72 65 61 74  e needs to creat
1e20: 65 0a 2a 2a 20 61 20 71 75 65 72 79 20 70 6c 61  e.** a query pla
1e30: 6e 20 66 6f 72 20 65 61 63 68 20 69 6e 76 6f 63  n for each invoc
1e40: 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6d 70 75 74  ation and comput
1e50: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 64 20 63  e an estimated c
1e60: 6f 73 74 20 66 6f 72 20 74 68 61 74 0a 2a 2a 20  ost for that.** 
1e70: 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  plan..**.** In t
1e80: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
1e90: 6f 6e 20 69 64 78 4e 75 6d 20 69 73 20 75 73 65  on idxNum is use
1ea0: 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  d to represent t
1eb0: 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 6c 61 6e  he.** query plan
1ec0: 2e 20 20 69 64 78 53 74 72 20 69 73 20 75 6e 75  .  idxStr is unu
1ed0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 64 78 4e 75  sed..**.** idxNu
1ee0: 6d 20 69 73 20 32 20 69 66 20 74 68 65 20 70 6f  m is 2 if the po
1ef0: 69 6e 74 65 72 3d 20 61 6e 64 20 63 6f 75 6e 74  inter= and count
1f00: 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 65 78  = constraints ex
1f10: 69 73 74 2c 0a 2a 2a 20 33 20 69 66 20 74 68 65  ist,.** 3 if the
1f20: 20 63 74 79 70 65 3d 20 63 6f 6e 73 74 72 61 69   ctype= constrai
1f30: 6e 74 20 61 6c 73 6f 20 65 78 69 73 74 73 2c 20  nt also exists, 
1f40: 61 6e 64 20 69 73 20 30 20 6f 74 68 65 72 77 69  and is 0 otherwi
1f50: 73 65 2e 0a 2a 2a 20 49 66 20 69 64 78 4e 75 6d  se..** If idxNum
1f60: 20 69 73 20 30 2c 20 74 68 65 6e 20 63 61 72 72   is 0, then carr
1f70: 61 79 20 62 65 63 6f 6d 65 73 20 61 6e 20 65 6d  ay becomes an em
1f80: 70 74 79 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  pty table..*/.st
1f90: 61 74 69 63 20 69 6e 74 20 63 61 72 72 61 79 42  atic int carrayB
1fa0: 65 73 74 49 6e 64 65 78 28 0a 20 20 73 71 6c 69  estIndex(.  sqli
1fb0: 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 0a 20  te3_vtab *tab,. 
1fc0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1fd0: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 0a 29 7b  nfo *pIdxInfo.){
1fe0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2000: 70 20 6f 76 65 72 20 63 6f 6e 73 74 72 61 69 6e  p over constrain
2010: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 70 74 72 49  ts */.  int ptrI
2020: 64 78 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 2f  dx = -1;       /
2030: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 70  * Index of the p
2040: 6f 69 6e 74 65 72 3d 20 63 6f 6e 73 74 72 61 69  ointer= constrai
2050: 6e 74 2c 20 6f 72 20 2d 31 20 69 66 20 6e 6f 6e  nt, or -1 if non
2060: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 49 64  e */.  int cntId
2070: 78 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 2f 2a  x = -1;       /*
2080: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   Index of the co
2090: 75 6e 74 3d 20 63 6f 6e 73 74 72 61 69 6e 74 2c  unt= constraint,
20a0: 20 6f 72 20 2d 31 20 69 66 20 6e 6f 6e 65 20 2a   or -1 if none *
20b0: 2f 0a 20 20 69 6e 74 20 63 74 79 70 65 49 64 78  /.  int ctypeIdx
20c0: 20 3d 20 2d 31 3b 20 20 20 20 20 2f 2a 20 49 6e   = -1;     /* In
20d0: 64 65 78 20 6f 66 20 74 68 65 20 63 74 79 70 65  dex of the ctype
20e0: 3d 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6f 72  = constraint, or
20f0: 20 2d 31 20 69 66 20 6e 6f 6e 65 20 2a 2f 0a 0a   -1 if none */..
2100: 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
2110: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
2120: 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72  straint *pConstr
2130: 61 69 6e 74 3b 0a 20 20 70 43 6f 6e 73 74 72 61  aint;.  pConstra
2140: 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
2150: 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66  aConstraint;.  f
2160: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
2170: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
2180: 20 69 2b 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e   i++, pConstrain
2190: 74 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43  t++){.    if( pC
21a0: 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c  onstraint->usabl
21b0: 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e==0 ) continue;
21c0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72  .    if( pConstr
21d0: 61 69 6e 74 2d 3e 6f 70 21 3d 53 51 4c 49 54 45  aint->op!=SQLITE
21e0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
21f0: 54 5f 45 51 20 29 20 63 6f 6e 74 69 6e 75 65 3b  T_EQ ) continue;
2200: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 43 6f  .    switch( pCo
2210: 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d  nstraint->iColum
2220: 6e 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  n ){.      case 
2230: 43 41 52 52 41 59 5f 43 4f 4c 55 4d 4e 5f 50 4f  CARRAY_COLUMN_PO
2240: 49 4e 54 45 52 3a 0a 20 20 20 20 20 20 20 20 70  INTER:.        p
2250: 74 72 49 64 78 20 3d 20 69 3b 0a 20 20 20 20 20  trIdx = i;.     
2260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2270: 63 61 73 65 20 43 41 52 52 41 59 5f 43 4f 4c 55  case CARRAY_COLU
2280: 4d 4e 5f 43 4f 55 4e 54 3a 0a 20 20 20 20 20 20  MN_COUNT:.      
2290: 20 20 63 6e 74 49 64 78 20 3d 20 69 3b 0a 20 20    cntIdx = i;.  
22a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22b0: 20 20 20 63 61 73 65 20 43 41 52 52 41 59 5f 43     case CARRAY_C
22c0: 4f 4c 55 4d 4e 5f 43 54 59 50 45 3a 0a 20 20 20  OLUMN_CTYPE:.   
22d0: 20 20 20 20 20 63 74 79 70 65 49 64 78 20 3d 20       ctypeIdx = 
22e0: 69 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  i;.        break
22f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2300: 28 20 70 74 72 49 64 78 3e 3d 30 20 26 26 20 63  ( ptrIdx>=0 && c
2310: 6e 74 49 64 78 3e 3d 30 20 29 7b 0a 20 20 20 20  ntIdx>=0 ){.    
2320: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
2330: 72 61 69 6e 74 55 73 61 67 65 5b 70 74 72 49 64  raintUsage[ptrId
2340: 78 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31  x].argvIndex = 1
2350: 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2360: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
2370: 5b 70 74 72 49 64 78 5d 2e 6f 6d 69 74 20 3d 20  [ptrIdx].omit = 
2380: 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  1;.    pIdxInfo-
2390: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
23a0: 65 5b 63 6e 74 49 64 78 5d 2e 61 72 67 76 49 6e  e[cntIdx].argvIn
23b0: 64 65 78 20 3d 20 32 3b 0a 20 20 20 20 70 49 64  dex = 2;.    pId
23c0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
23d0: 6e 74 55 73 61 67 65 5b 63 6e 74 49 64 78 5d 2e  ntUsage[cntIdx].
23e0: 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 70 49  omit = 1;.    pI
23f0: 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
2400: 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29  dCost = (double)
2410: 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  1;.    pIdxInfo-
2420: 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
2430: 20 31 30 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   100;.    pIdxIn
2440: 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 32 3b 0a  fo->idxNum = 2;.
2450: 20 20 20 20 69 66 28 20 63 74 79 70 65 49 64 78      if( ctypeIdx
2460: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 64  >=0 ){.      pId
2470: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2480: 6e 74 55 73 61 67 65 5b 63 74 79 70 65 49 64 78  ntUsage[ctypeIdx
2490: 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 33 3b  ].argvIndex = 3;
24a0: 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
24b0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
24c0: 65 5b 63 74 79 70 65 49 64 78 5d 2e 6f 6d 69 74  e[ctypeIdx].omit
24d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64 78   = 1;.      pIdx
24e0: 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 33  Info->idxNum = 3
24f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2500: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
2510: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28  stimatedCost = (
2520: 64 6f 75 62 6c 65 29 32 31 34 37 34 38 33 36 34  double)214748364
2530: 37 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  7;.    pIdxInfo-
2540: 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
2550: 20 32 31 34 37 34 38 33 36 34 37 3b 0a 20 20 20   2147483647;.   
2560: 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
2570: 6d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  m = 0;.  }.  ret
2580: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2590: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 6f 6c  ../*.** This fol
25a0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
25b0: 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
25c0: 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 74 68 65   methods for the
25d0: 20 0a 2a 2a 20 63 61 72 72 61 79 20 76 69 72 74   .** carray virt
25e0: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
25f0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64  atic sqlite3_mod
2600: 75 6c 65 20 63 61 72 72 61 79 4d 6f 64 75 6c 65  ule carrayModule
2610: 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20   = {.  0,       
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
2640: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2660: 20 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 63 61   xCreate */.  ca
2670: 72 72 61 79 43 6f 6e 6e 65 63 74 2c 20 20 20 20  rrayConnect,    
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e           /* xCon
2690: 6e 65 63 74 20 2a 2f 0a 20 20 63 61 72 72 61 79  nect */.  carray
26a0: 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20  BestIndex,      
26b0: 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64       /* xBestInd
26c0: 65 78 20 2a 2f 0a 20 20 63 61 72 72 61 79 44 69  ex */.  carrayDi
26d0: 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  sconnect,       
26e0: 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63     /* xDisconnec
26f0: 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f    /* xDestroy */
2720: 0a 20 20 63 61 72 72 61 79 4f 70 65 6e 2c 20 20  .  carrayOpen,  
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2740: 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20   xOpen - open a 
2750: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 61 72 72  cursor */.  carr
2760: 61 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ayClose,        
2770: 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2780: 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f   - close a curso
2790: 72 20 2a 2f 0a 20 20 63 61 72 72 61 79 46 69 6c  r */.  carrayFil
27a0: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
27b0: 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63    /* xFilter - c
27c0: 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f  onfigure scan co
27d0: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 63  nstraints */.  c
27e0: 61 72 72 61 79 4e 65 78 74 2c 20 20 20 20 20 20  arrayNext,      
27f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65            /* xNe
2800: 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63  xt - advance a c
2810: 75 72 73 6f 72 20 2a 2f 0a 20 20 63 61 72 72 61  ursor */.  carra
2820: 79 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  yEof,           
2830: 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20        /* xEof - 
2840: 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66  check for end of
2850: 20 73 63 61 6e 20 2a 2f 0a 20 20 63 61 72 72 61   scan */.  carra
2860: 79 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  yColumn,        
2870: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e        /* xColumn
2880: 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
2890: 20 20 63 61 72 72 61 79 52 6f 77 69 64 2c 20 20    carrayRowid,  
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b0: 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61  xRowid - read da
28c0: 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ta */.  0,      
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f     /* xUpdate */
28f0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2910: 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20   xBegin */.  0, 
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
2940: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20   /* xCommit */. 
2970: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2990: 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c  Rollback */.  0,
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e           /* xFin
29c0: 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20  dMethod */.  0, 
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
29f0: 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  me */.};../*.** 
2a00: 46 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  For testing purp
2a10: 6f 73 65 20 69 6e 20 74 68 65 20 54 43 4c 20 74  ose in the TCL t
2a20: 65 73 74 20 68 61 72 6e 65 73 73 2c 20 77 65 20  est harness, we 
2a30: 6e 65 65 64 20 61 20 6d 65 74 68 6f 64 20 66 6f  need a method fo
2a40: 72 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65  r.** setting the
2a50: 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 2e 20   pointer value. 
2a60: 20 54 68 65 20 69 6e 74 74 6f 70 74 72 28 58 29   The inttoptr(X)
2a70: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 63   SQL function ac
2a80: 63 6f 6d 70 6c 69 73 68 65 73 0a 2a 2a 20 74 68  complishes.** th
2a90: 69 73 2e 20 20 54 63 6c 20 73 63 72 69 70 74 20  is.  Tcl script 
2aa0: 77 69 6c 6c 20 62 69 6e 64 20 61 6e 20 69 6e 74  will bind an int
2ab0: 65 67 65 72 20 74 6f 20 58 20 61 6e 64 20 74 68  eger to X and th
2ac0: 65 20 69 6e 74 74 6f 70 74 72 28 29 20 53 51 4c  e inttoptr() SQL
2ad0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  .** function wil
2ae0: 6c 20 75 73 65 20 73 71 6c 69 74 65 33 5f 72 65  l use sqlite3_re
2af0: 73 75 6c 74 5f 70 6f 69 6e 74 65 72 28 29 20 74  sult_pointer() t
2b00: 6f 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 69  o convert that i
2b10: 6e 74 65 67 65 72 20 69 6e 74 6f 0a 2a 2a 20 61  nteger into.** a
2b20: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
2b30: 54 68 69 73 20 69 73 20 66 6f 72 20 74 65 73 74  This is for test
2b40: 69 6e 67 20 6f 6e 20 54 43 4c 20 6f 6e 6c 79 2e  ing on TCL only.
2b50: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
2b60: 45 5f 54 45 53 54 0a 73 74 61 74 69 63 20 76 6f  E_TEST.static vo
2b70: 69 64 20 69 6e 74 74 6f 70 74 72 46 75 6e 63 28  id inttoptrFunc(
2b80: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2b90: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
2ba0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
2bb0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
2bc0: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20  ){.  void *p;.  
2bd0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36  sqlite3_int64 i6
2be0: 34 3b 0a 20 20 69 36 34 20 3d 20 73 71 6c 69 74  4;.  i64 = sqlit
2bf0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2c00: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 73  rgv[0]);.  if( s
2c10: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 73 69 7a 65  izeof(i64)==size
2c20: 6f 66 28 70 29 20 29 7b 0a 20 20 20 20 6d 65 6d  of(p) ){.    mem
2c30: 63 70 79 28 26 70 2c 20 26 69 36 34 2c 20 73 69  cpy(&p, &i64, si
2c40: 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65 6c 73  zeof(p));.  }els
2c50: 65 7b 0a 20 20 20 20 69 6e 74 20 69 33 32 20 3d  e{.    int i32 =
2c60: 20 69 36 34 20 26 20 30 78 66 66 66 66 66 66 66   i64 & 0xfffffff
2c70: 66 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  f;.    memcpy(&p
2c80: 2c 20 26 69 33 32 2c 20 73 69 7a 65 6f 66 28 70  , &i32, sizeof(p
2c90: 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
2ca0: 33 5f 72 65 73 75 6c 74 5f 70 6f 69 6e 74 65 72  3_result_pointer
2cb0: 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20 22 63 61  (context, p, "ca
2cc0: 72 72 61 79 22 2c 20 30 29 3b 0a 7d 0a 23 65 6e  rray", 0);.}.#en
2cd0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45  dif /* SQLITE_TE
2ce0: 53 54 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  ST */..#endif /*
2cf0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2d00: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
2d10: 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65  fdef _WIN32.__de
2d20: 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74  clspec(dllexport
2d30: 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c  ).#endif.int sql
2d40: 69 74 65 33 5f 63 61 72 72 61 79 5f 69 6e 69 74  ite3_carray_init
2d50: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
2d60: 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72   .  char **pzErr
2d70: 4d 73 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71  Msg, .  const sq
2d80: 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2d90: 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 69 6e  es *pApi.){.  in
2da0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2db0: 3b 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e  ;.  SQLITE_EXTEN
2dc0: 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29  SION_INIT2(pApi)
2dd0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2de0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2df0: 4c 45 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  LE.  rc = sqlite
2e00: 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28  3_create_module(
2e10: 64 62 2c 20 22 63 61 72 72 61 79 22 2c 20 26 63  db, "carray", &c
2e20: 61 72 72 61 79 4d 6f 64 75 6c 65 2c 20 30 29 3b  arrayModule, 0);
2e30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2e40: 45 53 54 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  EST.  if( rc==SQ
2e50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
2e60: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
2e70: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
2e80: 22 69 6e 74 74 6f 70 74 72 22 2c 20 31 2c 20 53  "inttoptr", 1, S
2e90: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 69 6e 74 74 6f 70 74 72 46 75 6e 63 2c 20 30 2c  inttoptrFunc, 0,
2ed0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20   0);.  }.#endif 
2ee0: 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
2ef0: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  /.#endif /* SQLI
2f00: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2f10: 41 42 4c 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ABLE */.  return
2f20: 20 72 63 3b 0a 7d 0a                              rc;.}.