/ Hex Artifact Content
Login

Artifact 5a330eea8f2f5382f9bd794eb37eadf234c4db190074ea6104cc66d2a724c1d3:


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 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ace..**.** There
0310: 20 69 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20   is an optional 
0320: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 20  third parameter 
0330: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
0340: 20 64 61 74 61 74 79 70 65 20 6f 66 0a 2a 2a 20   datatype of.** 
0350: 74 68 65 20 43 2d 6c 61 6e 67 75 61 67 65 20 61  the C-language a
0360: 72 72 61 79 2e 20 20 41 6c 6c 6f 77 65 64 20 76  rray.  Allowed v
0370: 61 6c 75 65 73 20 6f 66 20 74 68 65 20 74 68 69  alues of the thi
0380: 72 64 20 70 61 72 61 6d 65 74 65 72 20 61 72 65  rd parameter are
0390: 0a 2a 2a 20 27 69 6e 74 33 32 27 2c 20 27 69 6e  .** 'int32', 'in
03a0: 74 36 34 27 2c 20 27 64 6f 75 62 6c 65 27 2c 20  t64', 'double', 
03b0: 27 63 68 61 72 2a 27 2e 20 20 45 78 61 6d 70 6c  'char*'.  Exampl
03c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45  e:.**.**      SE
03d0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 61 72 72  LECT * FROM carr
03e0: 61 79 28 24 70 74 72 2c 31 30 2c 27 63 68 61 72  ay($ptr,10,'char
03f0: 2a 27 29 3b 0a 2a 2a 0a 2a 2a 20 48 4f 57 20 49  *');.**.** HOW I
0400: 54 20 57 4f 52 4b 53 0a 2a 2a 0a 2a 2a 20 54 68  T WORKS.**.** Th
0410: 65 20 63 61 72 72 61 79 20 22 66 75 6e 63 74 69  e carray "functi
0420: 6f 6e 22 20 69 73 20 72 65 61 6c 6c 79 20 61 20  on" is really a 
0430: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
0440: 74 68 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  th the.** follow
0450: 69 6e 67 20 73 63 68 65 6d 61 3a 0a 2a 2a 0a 2a  ing schema:.**.*
0460: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0470: 4c 45 20 63 61 72 72 61 79 28 0a 2a 2a 20 20 20  LE carray(.**   
0480: 20 20 20 20 76 61 6c 75 65 2c 0a 2a 2a 20 20 20      value,.**   
0490: 20 20 20 20 70 6f 69 6e 74 65 72 20 48 49 44 44      pointer HIDD
04a0: 45 4e 2c 0a 2a 2a 20 20 20 20 20 20 20 63 6f 75  EN,.**       cou
04b0: 6e 74 20 48 49 44 44 45 4e 2c 0a 2a 2a 20 20 20  nt HIDDEN,.**   
04c0: 20 20 20 20 63 74 79 70 65 20 54 45 58 54 20 48      ctype TEXT H
04d0: 49 44 44 45 4e 0a 2a 2a 20 20 20 20 20 29 3b 0a  IDDEN.**     );.
04e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 69 64  **.** If the hid
04f0: 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 22 70 6f 69  den columns "poi
0500: 6e 74 65 72 22 20 61 6e 64 20 22 63 6f 75 6e 74  nter" and "count
0510: 22 20 61 72 65 20 75 6e 63 6f 6e 73 74 72 61 69  " are unconstrai
0520: 6e 65 64 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ned, then .** th
0530: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
0540: 68 61 73 20 6e 6f 20 72 6f 77 73 2e 20 20 4f 74  has no rows.  Ot
0550: 68 65 72 77 69 73 65 2c 20 74 68 65 20 76 69 72  herwise, the vir
0560: 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 74 65 72  tual table inter
0570: 70 72 65 74 73 0a 2a 2a 20 74 68 65 20 69 6e 74  prets.** the int
0580: 65 67 65 72 20 76 61 6c 75 65 20 6f 66 20 22 70  eger value of "p
0590: 6f 69 6e 74 65 72 22 20 61 73 20 61 20 70 6f 69  ointer" as a poi
05a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
05b0: 79 20 61 6e 64 20 22 63 6f 75 6e 74 22 0a 2a 2a  y and "count".**
05c0: 20 61 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   as the number o
05d0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
05e0: 65 20 61 72 72 61 79 2e 20 20 54 68 65 20 76 69  e array.  The vi
05f0: 72 74 75 61 6c 20 74 61 62 6c 65 20 73 74 65 70  rtual table step
0600: 73 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65  s through.** the
0610: 20 61 72 72 61 79 2c 20 65 6c 65 6d 65 6e 74 20   array, element 
0620: 62 79 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 23  by element..*/.#
0630: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0640: 65 78 74 2e 68 22 0a 53 51 4c 49 54 45 5f 45 58  ext.h".SQLITE_EX
0650: 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69  TENSION_INIT1.#i
0660: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0670: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
0680: 6e 67 2e 68 3e 0a 0a 23 69 66 6e 64 65 66 20 53  ng.h>..#ifndef S
0690: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
06a0: 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41  ALTABLE../*.** A
06b0: 6c 6c 6f 77 65 64 20 64 61 74 61 74 79 70 65 73  llowed datatypes
06c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 52 52  .*/.#define CARR
06d0: 41 59 5f 49 4e 54 33 32 20 20 20 20 30 0a 23 64  AY_INT32    0.#d
06e0: 65 66 69 6e 65 20 43 41 52 52 41 59 5f 49 4e 54  efine CARRAY_INT
06f0: 36 34 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20  64    1.#define 
0700: 43 41 52 52 41 59 5f 44 4f 55 42 4c 45 20 20 20  CARRAY_DOUBLE   
0710: 32 0a 23 64 65 66 69 6e 65 20 43 41 52 52 41 59  2.#define CARRAY
0720: 5f 54 45 58 54 20 20 20 20 20 33 0a 0a 2f 2a 0a  _TEXT     3../*.
0730: 2a 2a 20 4e 61 6d 65 73 20 6f 66 20 74 79 70 65  ** Names of type
0740: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  s.*/.static cons
0750: 74 20 63 68 61 72 20 2a 61 7a 54 79 70 65 5b 5d  t char *azType[]
0760: 20 3d 20 7b 20 22 69 6e 74 33 32 22 2c 20 22 69   = { "int32", "i
0770: 6e 74 36 34 22 2c 20 22 64 6f 75 62 6c 65 22 2c  nt64", "double",
0780: 20 22 63 68 61 72 2a 22 20 7d 3b 0a 0a 0a 2f 2a   "char*" };.../*
0790: 20 63 61 72 72 61 79 5f 63 75 72 73 6f 72 20 69   carray_cursor i
07a0: 73 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20  s a subclass of 
07b0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
07c0: 73 6f 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a  sor which will.*
07d0: 2a 20 73 65 72 76 65 20 61 73 20 74 68 65 20 75  * serve as the u
07e0: 6e 64 65 72 6c 79 69 6e 67 20 72 65 70 72 65 73  nderlying repres
07f0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 63 75  entation of a cu
0800: 72 73 6f 72 20 74 68 61 74 20 73 63 61 6e 73 0a  rsor that scans.
0810: 2a 2a 20 6f 76 65 72 20 72 6f 77 73 20 6f 66 20  ** over rows of 
0820: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2f 0a 74 79  the result.*/.ty
0830: 70 65 64 65 66 20 73 74 72 75 63 74 20 63 61 72  pedef struct car
0840: 72 61 79 5f 63 75 72 73 6f 72 20 63 61 72 72 61  ray_cursor carra
0850: 79 5f 63 75 72 73 6f 72 3b 0a 73 74 72 75 63 74  y_cursor;.struct
0860: 20 63 61 72 72 61 79 5f 63 75 72 73 6f 72 20 7b   carray_cursor {
0870: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
0880: 63 75 72 73 6f 72 20 62 61 73 65 3b 20 20 2f 2a  cursor base;  /*
0890: 20 42 61 73 65 20 63 6c 61 73 73 20 2d 20 6d 75   Base class - mu
08a0: 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20  st be first */. 
08b0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
08c0: 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 54  Rowid;      /* T
08d0: 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 76 6f  he rowid */.  vo
08e0: 69 64 20 2a 70 50 74 72 3b 20 20 20 20 20 20 20  id *pPtr;       
08f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
0900: 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
0910: 20 6f 66 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20   of values */.  
0920: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43  sqlite3_int64 iC
0930: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  nt;        /* Nu
0940: 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72 73  mber of integers
0950: 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f   in the array */
0960: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
0970: 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 2f 2a   eType;       /*
0980: 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 41 52 52   One of the CARR
0990: 41 59 5f 74 79 70 65 20 76 61 6c 75 65 73 20 2a  AY_type values *
09a0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
09b0: 63 61 72 72 61 79 43 6f 6e 6e 65 63 74 28 29 20  carrayConnect() 
09c0: 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65  method is invoke
09d0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
09e0: 77 0a 2a 2a 20 63 61 72 72 61 79 5f 76 74 61 62  w.** carray_vtab
09f0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
0a00: 74 68 65 20 63 61 72 72 61 79 20 76 69 72 74 75  the carray virtu
0a10: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
0a20: 54 68 69 6e 6b 20 6f 66 20 74 68 69 73 20 72 6f  Think of this ro
0a30: 75 74 69 6e 65 20 61 73 20 74 68 65 20 63 6f 6e  utine as the con
0a40: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 63 61 72  structor for car
0a50: 72 61 79 5f 76 74 61 62 20 6f 62 6a 65 63 74 73  ray_vtab objects
0a60: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 69 73  ..**.** All this
0a70: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
0a80: 6f 20 64 6f 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  o do is:.**.**  
0a90: 20 20 28 31 29 20 41 6c 6c 6f 63 61 74 65 20 74    (1) Allocate t
0aa0: 68 65 20 63 61 72 72 61 79 5f 76 74 61 62 20 6f  he carray_vtab o
0ab0: 62 6a 65 63 74 20 61 6e 64 20 69 6e 69 74 69 61  bject and initia
0ac0: 6c 69 7a 65 20 61 6c 6c 20 66 69 65 6c 64 73 2e  lize all fields.
0ad0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 54 65  .**.**    (2) Te
0ae0: 6c 6c 20 53 51 4c 69 74 65 20 28 76 69 61 20 74  ll SQLite (via t
0af0: 68 65 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  he sqlite3_decla
0b00: 72 65 5f 76 74 61 62 28 29 20 69 6e 74 65 72 66  re_vtab() interf
0b10: 61 63 65 29 20 77 68 61 74 20 74 68 65 0a 2a 2a  ace) what the.**
0b20: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 73          result s
0b30: 65 74 20 6f 66 20 71 75 65 72 69 65 73 20 61 67  et of queries ag
0b40: 61 69 6e 73 74 20 63 61 72 72 61 79 20 77 69 6c  ainst carray wil
0b50: 6c 20 6c 6f 6f 6b 20 6c 69 6b 65 2e 0a 2a 2f 0a  l look like..*/.
0b60: 73 74 61 74 69 63 20 69 6e 74 20 63 61 72 72 61  static int carra
0b70: 79 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69  yConnect(.  sqli
0b80: 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
0b90: 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67  *pAux,.  int arg
0ba0: 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  c, const char *c
0bb0: 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c  onst*argv,.  sql
0bc0: 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74  ite3_vtab **ppVt
0bd0: 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  ab,.  char **pzE
0be0: 72 72 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rr.){.  sqlite3_
0bf0: 76 74 61 62 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  vtab *pNew;.  in
0c00: 74 20 72 63 3b 0a 0a 2f 2a 20 43 6f 6c 75 6d 6e  t rc;../* Column
0c10: 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 23 64 65 66   numbers */.#def
0c20: 69 6e 65 20 43 41 52 52 41 59 5f 43 4f 4c 55 4d  ine CARRAY_COLUM
0c30: 4e 5f 56 41 4c 55 45 20 20 20 30 0a 23 64 65 66  N_VALUE   0.#def
0c40: 69 6e 65 20 43 41 52 52 41 59 5f 43 4f 4c 55 4d  ine CARRAY_COLUM
0c50: 4e 5f 50 4f 49 4e 54 45 52 20 31 0a 23 64 65 66  N_POINTER 1.#def
0c60: 69 6e 65 20 43 41 52 52 41 59 5f 43 4f 4c 55 4d  ine CARRAY_COLUM
0c70: 4e 5f 43 4f 55 4e 54 20 20 20 32 0a 23 64 65 66  N_COUNT   2.#def
0c80: 69 6e 65 20 43 41 52 52 41 59 5f 43 4f 4c 55 4d  ine CARRAY_COLUM
0c90: 4e 5f 43 54 59 50 45 20 20 20 33 0a 0a 20 20 72  N_CTYPE   3..  r
0ca0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  c = sqlite3_decl
0cb0: 61 72 65 5f 76 74 61 62 28 64 62 2c 0a 20 20 20  are_vtab(db,.   
0cc0: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
0cd0: 78 28 76 61 6c 75 65 2c 70 6f 69 6e 74 65 72 20  x(value,pointer 
0ce0: 68 69 64 64 65 6e 2c 63 6f 75 6e 74 20 68 69 64  hidden,count hid
0cf0: 64 65 6e 2c 63 74 79 70 65 20 68 69 64 64 65 6e  den,ctype hidden
0d00: 29 22 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  )");.  if( rc==S
0d10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0d20: 70 4e 65 77 20 3d 20 2a 70 70 56 74 61 62 20 3d  pNew = *ppVtab =
0d30: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
0d40: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0d50: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
0d60: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
0d70: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
0d80: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
0d90: 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d  eof(*pNew));.  }
0da0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
0db0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 74 68  ./*.** This meth
0dc0: 6f 64 20 69 73 20 74 68 65 20 64 65 73 74 72 75  od is the destru
0dd0: 63 74 6f 72 20 66 6f 72 20 63 61 72 72 61 79 5f  ctor for carray_
0de0: 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 73 2e 0a  cursor objects..
0df0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
0e00: 72 72 61 79 44 69 73 63 6f 6e 6e 65 63 74 28 73  rrayDisconnect(s
0e10: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
0e20: 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ab){.  sqlite3_f
0e30: 72 65 65 28 70 56 74 61 62 29 3b 0a 20 20 72 65  ree(pVtab);.  re
0e40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
0e60: 63 74 6f 72 20 66 6f 72 20 61 20 6e 65 77 20 63  ctor for a new c
0e70: 61 72 72 61 79 5f 63 75 72 73 6f 72 20 6f 62 6a  array_cursor obj
0e80: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
0e90: 6e 74 20 63 61 72 72 61 79 4f 70 65 6e 28 73 71  nt carrayOpen(sq
0ea0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 2c 20 73  lite3_vtab *p, s
0eb0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
0ec0: 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a  or **ppCursor){.
0ed0: 20 20 63 61 72 72 61 79 5f 63 75 72 73 6f 72 20    carray_cursor 
0ee0: 2a 70 43 75 72 3b 0a 20 20 70 43 75 72 20 3d 20  *pCur;.  pCur = 
0ef0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
0f00: 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b  sizeof(*pCur) );
0f10: 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29  .  if( pCur==0 )
0f20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
0f30: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
0f40: 43 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  Cur, 0, sizeof(*
0f50: 70 43 75 72 29 29 3b 0a 20 20 2a 70 70 43 75 72  pCur));.  *ppCur
0f60: 73 6f 72 20 3d 20 26 70 43 75 72 2d 3e 62 61 73  sor = &pCur->bas
0f70: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
0f80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
0f90: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61  Destructor for a
0fa0: 20 63 61 72 72 61 79 5f 63 75 72 73 6f 72 2e 0a   carray_cursor..
0fb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
0fc0: 72 72 61 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  rrayClose(sqlite
0fd0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
0fe0: 75 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ur){.  sqlite3_f
0ff0: 72 65 65 28 63 75 72 29 3b 0a 20 20 72 65 74 75  ree(cur);.  retu
1000: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1010: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
1020: 61 20 63 61 72 72 61 79 5f 63 75 72 73 6f 72 20  a carray_cursor 
1030: 74 6f 20 69 74 73 20 6e 65 78 74 20 72 6f 77 20  to its next row 
1040: 6f 66 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74  of output..*/.st
1050: 61 74 69 63 20 69 6e 74 20 63 61 72 72 61 79 4e  atic int carrayN
1060: 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ext(sqlite3_vtab
1070: 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20  _cursor *cur){. 
1080: 20 63 61 72 72 61 79 5f 63 75 72 73 6f 72 20 2a   carray_cursor *
1090: 70 43 75 72 20 3d 20 28 63 61 72 72 61 79 5f 63  pCur = (carray_c
10a0: 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 43  ursor*)cur;.  pC
10b0: 75 72 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20  ur->iRowid++;.  
10c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
10e0: 6e 20 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c 75  n values of colu
10f0: 6d 6e 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20  mns for the row 
1100: 61 74 20 77 68 69 63 68 20 74 68 65 20 63 61 72  at which the car
1110: 72 61 79 5f 63 75 72 73 6f 72 0a 2a 2a 20 69 73  ray_cursor.** is
1120: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1130: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
1140: 6e 74 20 63 61 72 72 61 79 43 6f 6c 75 6d 6e 28  nt carrayColumn(
1150: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
1160: 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 20 20 2f  cursor *cur,   /
1170: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a  * The cursor */.
1180: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1190: 74 20 2a 63 74 78 2c 20 20 20 20 20 20 20 2f 2a  t *ctx,       /*
11a0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
11b0: 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  to sqlite3_resul
11c0: 74 5f 2e 2e 2e 28 29 20 2a 2f 0a 20 20 69 6e 74  t_...() */.  int
11d0: 20 69 20 20 20 20 20 20 20 20 20 20 20 20 20 20   i              
11e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
11f0: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 75  h column to retu
1200: 72 6e 20 2a 2f 0a 29 7b 0a 20 20 63 61 72 72 61  rn */.){.  carra
1210: 79 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  y_cursor *pCur =
1220: 20 28 63 61 72 72 61 79 5f 63 75 72 73 6f 72 2a   (carray_cursor*
1230: 29 63 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  )cur;.  sqlite3_
1240: 69 6e 74 36 34 20 78 20 3d 20 30 3b 0a 20 20 73  int64 x = 0;.  s
1250: 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20  witch( i ){.    
1260: 63 61 73 65 20 43 41 52 52 41 59 5f 43 4f 4c 55  case CARRAY_COLU
1270: 4d 4e 5f 50 4f 49 4e 54 45 52 3a 20 20 20 72 65  MN_POINTER:   re
1280: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1290: 20 20 20 20 63 61 73 65 20 43 41 52 52 41 59 5f      case CARRAY_
12a0: 43 4f 4c 55 4d 4e 5f 43 4f 55 4e 54 3a 20 20 20  COLUMN_COUNT:   
12b0: 20 20 78 20 3d 20 70 43 75 72 2d 3e 69 43 6e 74    x = pCur->iCnt
12c0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
12d0: 61 73 65 20 43 41 52 52 41 59 5f 43 4f 4c 55 4d  ase CARRAY_COLUM
12e0: 4e 5f 43 54 59 50 45 3a 20 7b 0a 20 20 20 20 20  N_CTYPE: {.     
12f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1300: 74 65 78 74 28 63 74 78 2c 20 61 7a 54 79 70 65  text(ctx, azType
1310: 5b 70 43 75 72 2d 3e 65 54 79 70 65 5d 2c 20 2d  [pCur->eType], -
1320: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
1330: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1340: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1350: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1360: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 43        switch( pC
1370: 75 72 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20  ur->eType ){.   
1380: 20 20 20 20 20 63 61 73 65 20 43 41 52 52 41 59       case CARRAY
1390: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
13a0: 20 20 20 20 69 6e 74 20 2a 70 20 3d 20 28 69 6e      int *p = (in
13b0: 74 2a 29 70 43 75 72 2d 3e 70 50 74 72 3b 0a 20  t*)pCur->pPtr;. 
13c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13d0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c  _result_int(ctx,
13e0: 20 70 5b 70 43 75 72 2d 3e 69 52 6f 77 69 64 2d   p[pCur->iRowid-
13f0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1]);.          r
1400: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1410: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1420: 20 20 20 63 61 73 65 20 43 41 52 52 41 59 5f 49     case CARRAY_I
1430: 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 20 20  NT64: {.        
1440: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1450: 2a 70 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e  *p = (sqlite3_in
1460: 74 36 34 2a 29 70 43 75 72 2d 3e 70 50 74 72 3b  t64*)pCur->pPtr;
1470: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1480: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
1490: 63 74 78 2c 20 70 5b 70 43 75 72 2d 3e 69 52 6f  ctx, p[pCur->iRo
14a0: 77 69 64 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20  wid-1]);.       
14b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14c0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
14d0: 20 20 20 20 20 20 20 63 61 73 65 20 43 41 52 52         case CARR
14e0: 41 59 5f 44 4f 55 42 4c 45 3a 20 7b 0a 20 20 20  AY_DOUBLE: {.   
14f0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 2a 70         double *p
1500: 20 3d 20 28 64 6f 75 62 6c 65 2a 29 70 43 75 72   = (double*)pCur
1510: 2d 3e 70 50 74 72 3b 0a 20 20 20 20 20 20 20 20  ->pPtr;.        
1520: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1530: 5f 64 6f 75 62 6c 65 28 63 74 78 2c 20 70 5b 70  _double(ctx, p[p
1540: 43 75 72 2d 3e 69 52 6f 77 69 64 2d 31 5d 29 3b  Cur->iRowid-1]);
1550: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1560: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1570: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
1580: 61 73 65 20 43 41 52 52 41 59 5f 54 45 58 54 3a  ase CARRAY_TEXT:
1590: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   {.          con
15a0: 73 74 20 63 68 61 72 20 2a 2a 70 20 3d 20 28 63  st char **p = (c
15b0: 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 43 75 72  onst char**)pCur
15c0: 2d 3e 70 50 74 72 3b 0a 20 20 20 20 20 20 20 20  ->pPtr;.        
15d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
15e0: 5f 74 65 78 74 28 63 74 78 2c 20 70 5b 70 43 75  _text(ctx, p[pCu
15f0: 72 2d 3e 69 52 6f 77 69 64 2d 31 5d 2c 20 2d 31  r->iRowid-1], -1
1600: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
1610: 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  NT);.          r
1620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1630: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1640: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
1650: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
1660: 74 36 34 28 63 74 78 2c 20 78 29 3b 0a 20 20 72  t64(ctx, x);.  r
1670: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1690: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
16a0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
16b0: 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d 65   In this impleme
16c0: 6e 74 61 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  ntation, the.** 
16d0: 72 6f 77 69 64 20 69 73 20 74 68 65 20 73 61 6d  rowid is the sam
16e0: 65 20 61 73 20 74 68 65 20 6f 75 74 70 75 74 20  e as the output 
16f0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
1700: 20 69 6e 74 20 63 61 72 72 61 79 52 6f 77 69 64   int carrayRowid
1710: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
1720: 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69 74  rsor *cur, sqlit
1730: 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29  e_int64 *pRowid)
1740: 7b 0a 20 20 63 61 72 72 61 79 5f 63 75 72 73 6f  {.  carray_curso
1750: 72 20 2a 70 43 75 72 20 3d 20 28 63 61 72 72 61  r *pCur = (carra
1760: 79 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20  y_cursor*)cur;. 
1770: 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 75 72 2d   *pRowid = pCur-
1780: 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72  >iRowid;.  retur
1790: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
17b0: 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
17c0: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 6f  has been moved o
17d0: 66 66 20 6f 66 20 74 68 65 20 6c 61 73 74 0a 2a  ff of the last.*
17e0: 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e  * row of output.
17f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1800: 61 72 72 61 79 45 6f 66 28 73 71 6c 69 74 65 33  arrayEof(sqlite3
1810: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
1820: 72 29 7b 0a 20 20 63 61 72 72 61 79 5f 63 75 72  r){.  carray_cur
1830: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 63 61 72  sor *pCur = (car
1840: 72 61 79 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b  ray_cursor*)cur;
1850: 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
1860: 69 52 6f 77 69 64 3e 70 43 75 72 2d 3e 69 43 6e  iRowid>pCur->iCn
1870: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
1880: 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c 65   method is calle
1890: 64 20 74 6f 20 22 72 65 77 69 6e 64 22 20 74 68  d to "rewind" th
18a0: 65 20 63 61 72 72 61 79 5f 63 75 72 73 6f 72 20  e carray_cursor 
18b0: 6f 62 6a 65 63 74 20 62 61 63 6b 0a 2a 2a 20 74  object back.** t
18c0: 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  o the first row 
18d0: 6f 66 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74  of output..*/.st
18e0: 61 74 69 63 20 69 6e 74 20 63 61 72 72 61 79 46  atic int carrayF
18f0: 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ilter(.  sqlite3
1900: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
1910: 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e  tabCursor, .  in
1920: 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20  t idxNum, const 
1930: 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20  char *idxStr,.  
1940: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
1960: 7b 0a 20 20 63 61 72 72 61 79 5f 63 75 72 73 6f  {.  carray_curso
1970: 72 20 2a 70 43 75 72 20 3d 20 28 63 61 72 72 61  r *pCur = (carra
1980: 79 5f 63 75 72 73 6f 72 20 2a 29 70 56 74 61 62  y_cursor *)pVtab
1990: 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 69 64  Cursor;.  if( id
19a0: 78 4e 75 6d 20 29 7b 0a 20 20 20 20 70 43 75 72  xNum ){.    pCur
19b0: 2d 3e 70 50 74 72 20 3d 20 73 71 6c 69 74 65 33  ->pPtr = sqlite3
19c0: 5f 76 61 6c 75 65 5f 70 6f 69 6e 74 65 72 28 61  _value_pointer(a
19d0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 70 43 75  rgv[0]);.    pCu
19e0: 72 2d 3e 69 43 6e 74 20 3d 20 70 43 75 72 2d 3e  r->iCnt = pCur->
19f0: 70 50 74 72 20 3f 20 73 71 6c 69 74 65 33 5f 76  pPtr ? sqlite3_v
1a00: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
1a10: 31 5d 29 20 3a 20 30 3b 0a 20 20 20 20 69 66 28  1]) : 0;.    if(
1a20: 20 69 64 78 4e 75 6d 3c 33 20 29 7b 0a 20 20 20   idxNum<3 ){.   
1a30: 20 20 20 70 43 75 72 2d 3e 65 54 79 70 65 20 3d     pCur->eType =
1a40: 20 43 41 52 52 41 59 5f 49 4e 54 33 32 3b 0a 20   CARRAY_INT32;. 
1a50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 3b  unsigned char i;
1a70: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1a80: 72 20 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e 73  r *zType = (cons
1a90: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1aa0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
1ab0: 32 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  2]);.      for(i
1ac0: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 54  =0; i<sizeof(azT
1ad0: 79 70 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54 79  ype)/sizeof(azTy
1ae0: 70 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  pe[0]); i++){.  
1af0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1b00: 33 5f 73 74 72 69 63 6d 70 28 7a 54 79 70 65 2c  3_stricmp(zType,
1b10: 20 61 7a 54 79 70 65 5b 69 5d 29 3d 3d 30 20 29   azType[i])==0 )
1b20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1b30: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 73 69 7a        if( i>=siz
1b40: 65 6f 66 28 61 7a 54 79 70 65 29 2f 73 69 7a 65  eof(azType)/size
1b50: 6f 66 28 61 7a 54 79 70 65 5b 30 5d 29 20 29 7b  of(azType[0]) ){
1b60: 0a 20 20 20 20 20 20 20 20 70 56 74 61 62 43 75  .        pVtabCu
1b70: 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 7a 45 72  rsor->pVtab->zEr
1b80: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
1b90: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
1ba0: 20 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 74    "unknown datat
1bb0: 79 70 65 3a 20 25 51 22 2c 20 7a 54 79 70 65 29  ype: %Q", zType)
1bc0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1bd0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1be0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bf0: 20 20 20 20 70 43 75 72 2d 3e 65 54 79 70 65 20      pCur->eType 
1c00: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
1c10: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1c20: 70 43 75 72 2d 3e 70 50 74 72 20 3d 20 30 3b 0a  pCur->pPtr = 0;.
1c30: 20 20 20 20 70 43 75 72 2d 3e 69 43 6e 74 20 3d      pCur->iCnt =
1c40: 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e   0;.  }.  pCur->
1c50: 69 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 72 65  iRowid = 1;.  re
1c60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  }../*.** SQLite 
1c80: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73  will invoke this
1c90: 20 6d 65 74 68 6f 64 20 6f 6e 65 20 6f 72 20 6d   method one or m
1ca0: 6f 72 65 20 74 69 6d 65 73 20 77 68 69 6c 65 20  ore times while 
1cb0: 70 6c 61 6e 6e 69 6e 67 20 61 20 71 75 65 72 79  planning a query
1cc0: 0a 2a 2a 20 74 68 61 74 20 75 73 65 73 20 74 68  .** that uses th
1cd0: 65 20 63 61 72 72 61 79 20 76 69 72 74 75 61 6c  e carray virtual
1ce0: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f   table.  This ro
1cf0: 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 63  utine needs to c
1d00: 72 65 61 74 65 0a 2a 2a 20 61 20 71 75 65 72 79  reate.** a query
1d10: 20 70 6c 61 6e 20 66 6f 72 20 65 61 63 68 20 69   plan for each i
1d20: 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 63 6f  nvocation and co
1d30: 6d 70 75 74 65 20 61 6e 20 65 73 74 69 6d 61 74  mpute an estimat
1d40: 65 64 20 63 6f 73 74 20 66 6f 72 20 74 68 61 74  ed cost for that
1d50: 0a 2a 2a 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20  .** plan..**.** 
1d60: 49 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  In this implemen
1d70: 74 61 74 69 6f 6e 20 69 64 78 4e 75 6d 20 69 73  tation idxNum is
1d80: 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
1d90: 6e 74 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  nt the.** query 
1da0: 70 6c 61 6e 2e 20 20 69 64 78 53 74 72 20 69 73  plan.  idxStr is
1db0: 20 75 6e 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 69   unused..**.** i
1dc0: 64 78 4e 75 6d 20 69 73 20 32 20 69 66 20 74 68  dxNum is 2 if th
1dd0: 65 20 70 6f 69 6e 74 65 72 3d 20 61 6e 64 20 63  e pointer= and c
1de0: 6f 75 6e 74 3d 20 63 6f 6e 73 74 72 61 69 6e 74  ount= constraint
1df0: 73 20 65 78 69 73 74 2c 0a 2a 2a 20 33 20 69 66  s exist,.** 3 if
1e00: 20 74 68 65 20 63 74 79 70 65 3d 20 63 6f 6e 73   the ctype= cons
1e10: 74 72 61 69 6e 74 20 61 6c 73 6f 20 65 78 69 73  traint also exis
1e20: 74 73 2c 20 61 6e 64 20 69 73 20 30 20 6f 74 68  ts, and is 0 oth
1e30: 65 72 77 69 73 65 2e 0a 2a 2a 20 49 66 20 69 64  erwise..** If id
1e40: 78 4e 75 6d 20 69 73 20 30 2c 20 74 68 65 6e 20  xNum is 0, then 
1e50: 63 61 72 72 61 79 20 62 65 63 6f 6d 65 73 20 61  carray becomes a
1e60: 6e 20 65 6d 70 74 79 20 74 61 62 6c 65 2e 0a 2a  n empty table..*
1e70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 72  /.static int car
1e80: 72 61 79 42 65 73 74 49 6e 64 65 78 28 0a 20 20  rayBestIndex(.  
1e90: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61  sqlite3_vtab *ta
1ea0: 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b,.  sqlite3_ind
1eb0: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
1ec0: 6f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  o.){.  int i;   
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ee0: 20 4c 6f 6f 70 20 6f 76 65 72 20 63 6f 6e 73 74   Loop over const
1ef0: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  raints */.  int 
1f00: 70 74 72 49 64 78 20 3d 20 2d 31 3b 20 20 20 20  ptrIdx = -1;    
1f10: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1f20: 68 65 20 70 6f 69 6e 74 65 72 3d 20 63 6f 6e 73  he pointer= cons
1f30: 74 72 61 69 6e 74 2c 20 6f 72 20 2d 31 20 69 66  traint, or -1 if
1f40: 20 6e 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 63   none */.  int c
1f50: 6e 74 49 64 78 20 3d 20 2d 31 3b 20 20 20 20 20  ntIdx = -1;     
1f60: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1f70: 65 20 63 6f 75 6e 74 3d 20 63 6f 6e 73 74 72 61  e count= constra
1f80: 69 6e 74 2c 20 6f 72 20 2d 31 20 69 66 20 6e 6f  int, or -1 if no
1f90: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 79 70  ne */.  int ctyp
1fa0: 65 49 64 78 20 3d 20 2d 31 3b 20 20 20 20 20 2f  eIdx = -1;     /
1fb0: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
1fc0: 74 79 70 65 3d 20 63 6f 6e 73 74 72 61 69 6e 74  type= constraint
1fd0: 2c 20 6f 72 20 2d 31 20 69 66 20 6e 6f 6e 65 20  , or -1 if none 
1fe0: 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  */..  const stru
1ff0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
2000: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f  _constraint *pCo
2010: 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70 43 6f 6e  nstraint;.  pCon
2020: 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
2030: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
2040: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
2050: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
2060: 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74  int; i++, pConst
2070: 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66  raint++){.    if
2080: 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75  ( pConstraint->u
2090: 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69  sable==0 ) conti
20a0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  nue;.    if( pCo
20b0: 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53 51  nstraint->op!=SQ
20c0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
20d0: 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69  RAINT_EQ ) conti
20e0: 6e 75 65 3b 0a 20 20 20 20 73 77 69 74 63 68 28  nue;.    switch(
20f0: 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43   pConstraint->iC
2100: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 63  olumn ){.      c
2110: 61 73 65 20 43 41 52 52 41 59 5f 43 4f 4c 55 4d  ase CARRAY_COLUM
2120: 4e 5f 50 4f 49 4e 54 45 52 3a 0a 20 20 20 20 20  N_POINTER:.     
2130: 20 20 20 70 74 72 49 64 78 20 3d 20 69 3b 0a 20     ptrIdx = i;. 
2140: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2150: 20 20 20 20 63 61 73 65 20 43 41 52 52 41 59 5f      case CARRAY_
2160: 43 4f 4c 55 4d 4e 5f 43 4f 55 4e 54 3a 0a 20 20  COLUMN_COUNT:.  
2170: 20 20 20 20 20 20 63 6e 74 49 64 78 20 3d 20 69        cntIdx = i
2180: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2190: 0a 20 20 20 20 20 20 63 61 73 65 20 43 41 52 52  .      case CARR
21a0: 41 59 5f 43 4f 4c 55 4d 4e 5f 43 54 59 50 45 3a  AY_COLUMN_CTYPE:
21b0: 0a 20 20 20 20 20 20 20 20 63 74 79 70 65 49 64  .        ctypeId
21c0: 78 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 62  x = i;.        b
21d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
21e0: 20 20 69 66 28 20 70 74 72 49 64 78 3e 3d 30 20    if( ptrIdx>=0 
21f0: 26 26 20 63 6e 74 49 64 78 3e 3d 30 20 29 7b 0a  && cntIdx>=0 ){.
2200: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
2210: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 70  onstraintUsage[p
2220: 74 72 49 64 78 5d 2e 61 72 67 76 49 6e 64 65 78  trIdx].argvIndex
2230: 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 1;.    pIdxIn
2240: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
2250: 73 61 67 65 5b 70 74 72 49 64 78 5d 2e 6f 6d 69  sage[ptrIdx].omi
2260: 74 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49  t = 1;.    pIdxI
2270: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
2280: 55 73 61 67 65 5b 63 6e 74 49 64 78 5d 2e 61 72  Usage[cntIdx].ar
2290: 67 76 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 20  gvIndex = 2;.   
22a0: 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
22b0: 74 72 61 69 6e 74 55 73 61 67 65 5b 63 6e 74 49  traintUsage[cntI
22c0: 64 78 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  dx].omit = 1;.  
22d0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
22e0: 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
22f0: 62 6c 65 29 31 3b 0a 20 20 20 20 70 49 64 78 49  ble)1;.    pIdxI
2300: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
2310: 77 73 20 3d 20 31 30 30 3b 0a 20 20 20 20 70 49  ws = 100;.    pI
2320: 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
2330: 20 32 3b 0a 20 20 20 20 69 66 28 20 63 74 79 70   2;.    if( ctyp
2340: 65 49 64 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20  eIdx>=0 ){.     
2350: 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
2360: 74 72 61 69 6e 74 55 73 61 67 65 5b 63 74 79 70  traintUsage[ctyp
2370: 65 49 64 78 5d 2e 61 72 67 76 49 6e 64 65 78 20  eIdx].argvIndex 
2380: 3d 20 33 3b 0a 20 20 20 20 20 20 70 49 64 78 49  = 3;.      pIdxI
2390: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
23a0: 55 73 61 67 65 5b 63 74 79 70 65 49 64 78 5d 2e  Usage[ctypeIdx].
23b0: 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  omit = 1;.      
23c0: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
23d0: 20 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 3;.    }.  }e
23e0: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 49 6e 66  lse{.    pIdxInf
23f0: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
2400: 20 3d 20 28 64 6f 75 62 6c 65 29 32 31 34 37 34   = (double)21474
2410: 38 33 36 34 37 3b 0a 20 20 20 20 70 49 64 78 49  83647;.    pIdxI
2420: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
2430: 77 73 20 3d 20 32 31 34 37 34 38 33 36 34 37 3b  ws = 2147483647;
2440: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
2450: 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxNum = 0;.  }. 
2460: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2470: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
2480: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2490: 74 75 72 65 20 64 65 66 69 6e 65 73 20 61 6c 6c  ture defines all
24a0: 20 74 68 65 20 6d 65 74 68 6f 64 73 20 66 6f 72   the methods for
24b0: 20 74 68 65 20 0a 2a 2a 20 63 61 72 72 61 79 20   the .** carray 
24c0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
24d0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
24e0: 5f 6d 6f 64 75 6c 65 20 63 61 72 72 61 79 4d 6f  _module carrayMo
24f0: 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20  dule = {.  0,   
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
2520: 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a    /* xCreate */.
2550: 20 20 63 61 72 72 61 79 43 6f 6e 6e 65 63 74 2c    carrayConnect,
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2570: 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 63 61  xConnect */.  ca
2580: 72 72 61 79 42 65 73 74 49 6e 64 65 78 2c 20 20  rrayBestIndex,  
2590: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73           /* xBes
25a0: 74 49 6e 64 65 78 20 2a 2f 0a 20 20 63 61 72 72  tIndex */.  carr
25b0: 61 79 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20  ayDisconnect,   
25c0: 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f         /* xDisco
25d0: 6e 6e 65 63 74 20 2a 2f 0a 20 20 30 2c 20 20 20  nnect */.  0,   
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f        /* xDestro
2600: 79 20 2a 2f 0a 20 20 63 61 72 72 61 79 4f 70 65  y */.  carrayOpe
2610: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
2620: 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65    /* xOpen - ope
2630: 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  n a cursor */.  
2640: 63 61 72 72 61 79 43 6c 6f 73 65 2c 20 20 20 20  carrayClose,    
2650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2660: 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63  lose - close a c
2670: 75 72 73 6f 72 20 2a 2f 0a 20 20 63 61 72 72 61  ursor */.  carra
2680: 79 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20  yFilter,        
2690: 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72        /* xFilter
26a0: 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61   - configure sca
26b0: 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  n constraints */
26c0: 0a 20 20 63 61 72 72 61 79 4e 65 78 74 2c 20 20  .  carrayNext,  
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26e0: 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65   xNext - advance
26f0: 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63   a cursor */.  c
2700: 61 72 72 61 79 45 6f 66 2c 20 20 20 20 20 20 20  arrayEof,       
2710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f            /* xEo
2720: 66 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 65 6e  f - check for en
2730: 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20 63  d of scan */.  c
2740: 61 72 72 61 79 43 6f 6c 75 6d 6e 2c 20 20 20 20  arrayColumn,    
2750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
2760: 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61  lumn - read data
2770: 20 2a 2f 0a 20 20 63 61 72 72 61 79 52 6f 77 69   */.  carrayRowi
2780: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
2790: 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61   /* xRowid - rea
27a0: 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20  d data */.  0,  
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74         /* xUpdat
27d0: 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f0: 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20    /* xBegin */. 
2800: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2820: 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Sync */.  0,    
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20       /* xCommit 
2850: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2870: 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  /* xRollback */.
2880: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a0: 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20  xFindMethod */. 
28b0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28d0: 52 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  Rename */.};../*
28e0: 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20  .** For testing 
28f0: 70 75 72 70 6f 73 65 20 69 6e 20 74 68 65 20 54  purpose in the T
2900: 43 4c 20 74 65 73 74 20 68 61 72 6e 65 73 73 2c  CL test harness,
2910: 20 77 65 20 6e 65 65 64 20 61 20 6d 65 74 68 6f   we need a metho
2920: 64 20 66 6f 72 0a 2a 2a 20 73 65 74 74 69 6e 67  d for.** setting
2930: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 76 61 6c   the pointer val
2940: 75 65 2e 20 20 54 68 65 20 69 6e 74 74 6f 70 74  ue.  The inttopt
2950: 72 28 58 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  r(X) SQL functio
2960: 6e 20 61 63 63 6f 6d 70 6c 69 73 68 65 73 0a 2a  n accomplishes.*
2970: 2a 20 74 68 69 73 2e 20 20 54 63 6c 20 73 63 72  * this.  Tcl scr
2980: 69 70 74 20 77 69 6c 6c 20 62 69 6e 64 20 61 6e  ipt will bind an
2990: 20 69 6e 74 65 67 65 72 20 74 6f 20 58 20 61 6e   integer to X an
29a0: 64 20 74 68 65 20 69 6e 74 74 6f 70 74 72 28 29  d the inttoptr()
29b0: 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   SQL.** function
29c0: 20 77 69 6c 6c 20 75 73 65 20 73 71 6c 69 74 65   will use sqlite
29d0: 33 5f 72 65 73 75 6c 74 5f 70 6f 69 6e 74 65 72  3_result_pointer
29e0: 28 29 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68  () to convert th
29f0: 61 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 0a  at integer into.
2a00: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  ** a pointer..**
2a10: 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
2a20: 74 65 73 74 69 6e 67 20 6f 6e 20 54 43 4c 20 6f  testing on TCL o
2a30: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
2a40: 51 4c 49 54 45 5f 54 45 53 54 0a 73 74 61 74 69  QLITE_TEST.stati
2a50: 63 20 76 6f 69 64 20 69 6e 74 74 6f 70 74 72 46  c void inttoptrF
2a60: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
2a70: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
2a80: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
2a90: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2aa0: 72 67 76 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70  rgv.){.  void *p
2ab0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
2ac0: 34 20 69 36 34 3b 0a 20 20 69 36 34 20 3d 20 73  4 i64;.  i64 = s
2ad0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
2ae0: 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  64(argv[0]);.  i
2af0: 66 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  f( sizeof(i64)==
2b00: 73 69 7a 65 6f 66 28 70 29 20 29 7b 0a 20 20 20  sizeof(p) ){.   
2b10: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 69 36 34   memcpy(&p, &i64
2b20: 2c 20 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20  , sizeof(p));.  
2b30: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
2b40: 33 32 20 3d 20 69 36 34 20 26 20 30 78 66 66 66  32 = i64 & 0xfff
2b50: 66 66 66 66 66 3b 0a 20 20 20 20 6d 65 6d 63 70  fffff;.    memcp
2b60: 79 28 26 70 2c 20 26 69 33 32 2c 20 73 69 7a 65  y(&p, &i32, size
2b70: 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71  of(p));.  }.  sq
2b80: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 70 6f 69  lite3_result_poi
2b90: 6e 74 65 72 28 63 6f 6e 74 65 78 74 2c 20 70 29  nter(context, p)
2ba0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2bb0: 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 65  LITE_TEST */..#e
2bc0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2bd0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2be0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e   */..#ifdef _WIN
2bf0: 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  32.__declspec(dl
2c00: 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a  lexport).#endif.
2c10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 61 72 72  int sqlite3_carr
2c20: 61 79 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74  ay_init(.  sqlit
2c30: 65 33 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20  e3 *db, .  char 
2c40: 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63  **pzErrMsg, .  c
2c50: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2c60: 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a  _routines *pApi.
2c70: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2c80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 51 4c 49 54  LITE_OK;.  SQLIT
2c90: 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
2ca0: 32 28 70 41 70 69 29 3b 0a 23 69 66 6e 64 65 66  2(pApi);.#ifndef
2cb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2cc0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 72 63 20 3d  TUALTABLE.  rc =
2cd0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
2ce0: 6d 6f 64 75 6c 65 28 64 62 2c 20 22 63 61 72 72  module(db, "carr
2cf0: 61 79 22 2c 20 26 63 61 72 72 61 79 4d 6f 64 75  ay", &carrayModu
2d00: 6c 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  le, 0);.#ifdef S
2d10: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
2d20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d30: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2d40: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
2d50: 6f 6e 28 64 62 2c 20 22 69 6e 74 74 6f 70 74 72  on(db, "inttoptr
2d60: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
2d70: 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 69 6e 74 74 6f 70 74 72 46         inttoptrF
2da0: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
2db0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2dc0: 5f 54 45 53 54 20 2a 2f 0a 23 65 6e 64 69 66 20  _TEST */.#endif 
2dd0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
2de0: 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20  IRTUALTABLE */. 
2df0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.