/ Hex Artifact Content
Login

Artifact c905030e44e192559dba1a5c1e5e3fcbbbe20def:


0000: 2f 2a 0a 2a 2a 20 32 30 30 39 20 4e 6f 76 65 6d  /*.** 2009 Novem
0010: 62 65 72 20 31 30 0a 2a 2a 0a 2a 2a 20 54 68 65  ber 10.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0190: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 56 49 52   a read-only VIR
01a0: 54 55 41 4c 20 54 41 42 4c 45 20 74 68 61 74 20  TUAL TABLE that 
01b0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20  contains the.** 
01c0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 43 2d 6c  content of a C-l
01d0: 61 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f 66  anguage array of
01e0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 2e   integer values.
01f0: 20 20 53 65 65 20 74 68 65 20 63 6f 72 72 65 73    See the corres
0200: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 68 65 61 64 65  ponding.** heade
0210: 72 20 66 69 6c 65 20 66 6f 72 20 66 75 6c 6c 20  r file for full 
0220: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 6e 63  details..*/.#inc
0230: 6c 75 64 65 20 22 74 65 73 74 5f 69 6e 74 61 72  lude "test_intar
0240: 72 61 79 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  ray.h".#include 
0250: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0260: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a  ude <assert.h>..
0270: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f  ./*.** Definitio
0280: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  n of the sqlite3
0290: 5f 69 6e 74 61 72 72 61 79 20 6f 62 6a 65 63 74  _intarray object
02a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
02b0: 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74  rnal representat
02c0: 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 74 61 72 72  ion of an intarr
02d0: 61 79 20 6f 62 6a 65 63 74 20 69 73 20 73 75 62  ay object is sub
02e0: 6a 65 63 74 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  ject.** to chang
02f0: 65 2c 20 69 73 20 6e 6f 74 20 65 78 74 65 72 6e  e, is not extern
0300: 61 6c 6c 79 20 76 69 73 69 62 6c 65 2c 20 61 6e  ally visible, an
0310: 64 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  d should be used
0320: 20 62 79 0a 2a 2a 20 74 68 65 20 69 6d 70 6c 65   by.** the imple
0330: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 6e 74  mentation of int
0340: 61 72 72 61 79 20 6f 6e 6c 79 2e 20 20 54 68 69  array only.  Thi
0350: 73 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71  s object is opaq
0360: 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 2e 0a  ue.** to users..
0370: 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c 69 74 65  */.struct sqlite
0380: 33 5f 69 6e 74 61 72 72 61 79 20 7b 0a 20 20 69  3_intarray {.  i
0390: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
03a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
03b0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
03c0: 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20  n the array */. 
03d0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
03e0: 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  a;         /* Co
03f0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72  ntents of the ar
0400: 72 61 79 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ray */.  void (*
0410: 78 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  xFree)(void*);  
0420: 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 75     /* Function u
0430: 73 65 64 20 74 6f 20 66 72 65 65 20 61 5b 5d 20  sed to free a[] 
0440: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 4f 62 6a 65 63 74  */.};../* Object
0450: 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
0460: 79 20 62 79 20 74 68 65 20 76 69 72 74 75 61 6c  y by the virtual
0470: 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74   table implement
0480: 61 74 69 6f 6e 20 2a 2f 0a 74 79 70 65 64 65 66  ation */.typedef
0490: 20 73 74 72 75 63 74 20 69 6e 74 61 72 72 61 79   struct intarray
04a0: 5f 76 74 61 62 20 69 6e 74 61 72 72 61 79 5f 76  _vtab intarray_v
04b0: 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72  tab;.typedef str
04c0: 75 63 74 20 69 6e 74 61 72 72 61 79 5f 63 75 72  uct intarray_cur
04d0: 73 6f 72 20 69 6e 74 61 72 72 61 79 5f 63 75 72  sor intarray_cur
04e0: 73 6f 72 3b 0a 0a 2f 2a 20 41 20 69 6e 74 61 72  sor;../* A intar
04f0: 72 61 79 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  ray table object
0500: 20 2a 2f 0a 73 74 72 75 63 74 20 69 6e 74 61 72   */.struct intar
0510: 72 61 79 5f 76 74 61 62 20 7b 0a 20 20 73 71 6c  ray_vtab {.  sql
0520: 69 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20  ite3_vtab base; 
0530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
0540: 73 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 73 71  se class */.  sq
0550: 6c 69 74 65 33 5f 69 6e 74 61 72 72 61 79 20 2a  lite3_intarray *
0560: 70 43 6f 6e 74 65 6e 74 3b 20 20 20 2f 2a 20 43  pContent;   /* C
0570: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e  ontent of the in
0580: 74 65 67 65 72 20 61 72 72 61 79 20 2a 2f 0a 7d  teger array */.}
0590: 3b 0a 0a 2f 2a 20 41 20 69 6e 74 61 72 72 61 79  ;../* A intarray
05a0: 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a   cursor object *
05b0: 2f 0a 73 74 72 75 63 74 20 69 6e 74 61 72 72 61  /.struct intarra
05c0: 79 5f 63 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c  y_cursor {.  sql
05d0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
05e0: 20 62 61 73 65 3b 20 20 20 20 2f 2a 20 42 61 73   base;    /* Bas
05f0: 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 69 6e 74  e class */.  int
0600: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
0610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
0620: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
0630: 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  tion */.};../*.*
0640: 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 77  * None of this w
0650: 6f 72 6b 73 20 75 6e 6c 65 73 73 20 77 65 20 68  orks unless we h
0660: 61 76 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ave virtual tabl
0670: 65 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  es..*/.#ifndef S
0680: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
0690: 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 46  ALTABLE../*.** F
06a0: 72 65 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69  ree an sqlite3_i
06b0: 6e 74 61 72 72 61 79 20 6f 62 6a 65 63 74 2e 0a  ntarray object..
06c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
06d0: 6e 74 61 72 72 61 79 46 72 65 65 28 73 71 6c 69  ntarrayFree(sqli
06e0: 74 65 33 5f 69 6e 74 61 72 72 61 79 20 2a 70 29  te3_intarray *p)
06f0: 7b 0a 20 20 69 66 28 20 70 2d 3e 78 46 72 65 65  {.  if( p->xFree
0700: 20 29 7b 0a 20 20 20 20 70 2d 3e 78 46 72 65 65   ){.    p->xFree
0710: 28 70 2d 3e 61 29 3b 0a 20 20 7d 0a 20 20 73 71  (p->a);.  }.  sq
0720: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d  lite3_free(p);.}
0730: 0a 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 64 65  ../*.** Table de
0740: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
0750: 20 69 6e 74 61 72 72 61 79 20 6d 6f 64 75 6c 65   intarray module
0760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0770: 69 6e 74 61 72 72 61 79 44 65 73 74 72 6f 79 28  intarrayDestroy(
0780: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 29  sqlite3_vtab *p)
0790: 7b 0a 20 20 69 6e 74 61 72 72 61 79 5f 76 74 61  {.  intarray_vta
07a0: 62 20 2a 70 56 74 61 62 20 3d 20 28 69 6e 74 61  b *pVtab = (inta
07b0: 72 72 61 79 5f 76 74 61 62 2a 29 70 3b 0a 20 20  rray_vtab*)p;.  
07c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
07d0: 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ab);.  return 0;
07e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20  .}../*.** Table 
07f0: 63 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20  constructor for 
0800: 74 68 65 20 69 6e 74 61 72 72 61 79 20 6d 6f 64  the intarray mod
0810: 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ule..*/.static i
0820: 6e 74 20 69 6e 74 61 72 72 61 79 43 72 65 61 74  nt intarrayCreat
0830: 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
0840: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
0850: 2a 20 44 61 74 61 62 61 73 65 20 77 68 65 72 65  * Database where
0860: 20 6d 6f 64 75 6c 65 20 69 73 20 63 72 65 61 74   module is creat
0870: 65 64 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  ed */.  void *pA
0880: 75 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ux,             
0890: 20 20 2f 2a 20 63 6c 69 65 6e 74 64 61 74 61 20    /* clientdata 
08a0: 66 6f 72 20 74 68 65 20 6d 6f 64 75 6c 65 20 2a  for the module *
08b0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
08d0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
08e0: 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
08f0: 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76  char *const*argv
0900: 2c 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72  ,   /* Value for
0910: 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a   all arguments *
0920: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  /.  sqlite3_vtab
0930: 20 2a 2a 70 70 56 74 61 62 2c 20 20 20 20 2f 2a   **ppVtab,    /*
0940: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 76   Write the new v
0950: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a  irtual table obj
0960: 65 63 74 20 68 65 72 65 20 2a 2f 0a 20 20 63 68  ect here */.  ch
0970: 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 20  ar **pzErr      
0980: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 65          /* Put e
0990: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
09a0: 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
09b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
09c0: 4f 4d 45 4d 3b 0a 20 20 69 6e 74 61 72 72 61 79  OMEM;.  intarray
09d0: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73  _vtab *pVtab = s
09e0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
09f0: 7a 65 6f 66 28 69 6e 74 61 72 72 61 79 5f 76 74  zeof(intarray_vt
0a00: 61 62 29 29 3b 0a 0a 20 20 69 66 28 20 70 56 74  ab));..  if( pVt
0a10: 61 62 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  ab ){.    memset
0a20: 28 70 56 74 61 62 2c 20 30 2c 20 73 69 7a 65 6f  (pVtab, 0, sizeo
0a30: 66 28 69 6e 74 61 72 72 61 79 5f 76 74 61 62 29  f(intarray_vtab)
0a40: 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 70 43  );.    pVtab->pC
0a50: 6f 6e 74 65 6e 74 20 3d 20 28 73 71 6c 69 74 65  ontent = (sqlite
0a60: 33 5f 69 6e 74 61 72 72 61 79 2a 29 70 41 75 78  3_intarray*)pAux
0a70: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
0a80: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
0a90: 64 62 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  db, "CREATE TABL
0aa0: 45 20 78 28 76 61 6c 75 65 20 49 4e 54 45 47 45  E x(value INTEGE
0ab0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 29 22 29  R PRIMARY KEY)")
0ac0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 56 74 61 62 20  ;.  }.  *ppVtab 
0ad0: 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  = (sqlite3_vtab 
0ae0: 2a 29 70 56 74 61 62 3b 0a 20 20 72 65 74 75 72  *)pVtab;.  retur
0af0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
0b00: 70 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72  pen a new cursor
0b10: 20 6f 6e 20 74 68 65 20 69 6e 74 61 72 72 61 79   on the intarray
0b20: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
0b30: 63 20 69 6e 74 20 69 6e 74 61 72 72 61 79 4f 70  c int intarrayOp
0b40: 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  en(sqlite3_vtab 
0b50: 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f  *pVTab, sqlite3_
0b60: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70  vtab_cursor **pp
0b70: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 72  Cursor){.  int r
0b80: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
0b90: 3b 0a 20 20 69 6e 74 61 72 72 61 79 5f 63 75 72  ;.  intarray_cur
0ba0: 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 70 43 75  sor *pCur;.  pCu
0bb0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
0bc0: 6f 63 28 73 69 7a 65 6f 66 28 69 6e 74 61 72 72  oc(sizeof(intarr
0bd0: 61 79 5f 63 75 72 73 6f 72 29 29 3b 0a 20 20 69  ay_cursor));.  i
0be0: 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 6d  f( pCur ){.    m
0bf0: 65 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20 73  emset(pCur, 0, s
0c00: 69 7a 65 6f 66 28 69 6e 74 61 72 72 61 79 5f 63  izeof(intarray_c
0c10: 75 72 73 6f 72 29 29 3b 0a 20 20 20 20 2a 70 70  ursor));.    *pp
0c20: 43 75 72 73 6f 72 20 3d 20 28 73 71 6c 69 74 65  Cursor = (sqlite
0c30: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 29  3_vtab_cursor *)
0c40: 70 43 75 72 3b 0a 20 20 20 20 72 63 20 3d 20 53  pCur;.    rc = S
0c50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
0c60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
0c70: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 69 6e 74 61  .** Close a inta
0c80: 72 72 61 79 20 74 61 62 6c 65 20 63 75 72 73 6f  rray table curso
0c90: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
0ca0: 20 69 6e 74 61 72 72 61 79 43 6c 6f 73 65 28 73   intarrayClose(s
0cb0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
0cc0: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 69 6e 74 61  or *cur){.  inta
0cd0: 72 72 61 79 5f 63 75 72 73 6f 72 20 2a 70 43 75  rray_cursor *pCu
0ce0: 72 20 3d 20 28 69 6e 74 61 72 72 61 79 5f 63 75  r = (intarray_cu
0cf0: 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 73 71  rsor *)cur;.  sq
0d00: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
0d10: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
0d20: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
0d30: 65 74 72 69 65 76 65 20 61 20 63 6f 6c 75 6d 6e  etrieve a column
0d40: 20 6f 66 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61   of data..*/.sta
0d50: 74 69 63 20 69 6e 74 20 69 6e 74 61 72 72 61 79  tic int intarray
0d60: 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 5f 76  Column(sqlite3_v
0d70: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c  tab_cursor *cur,
0d80: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
0d90: 20 2a 63 74 78 2c 20 69 6e 74 20 69 29 7b 0a 20   *ctx, int i){. 
0da0: 20 69 6e 74 61 72 72 61 79 5f 63 75 72 73 6f 72   intarray_cursor
0db0: 20 2a 70 43 75 72 20 3d 20 28 69 6e 74 61 72 72   *pCur = (intarr
0dc0: 61 79 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a  ay_cursor*)cur;.
0dd0: 20 20 69 6e 74 61 72 72 61 79 5f 76 74 61 62 20    intarray_vtab 
0de0: 2a 70 56 74 61 62 20 3d 20 28 69 6e 74 61 72 72  *pVtab = (intarr
0df0: 61 79 5f 76 74 61 62 2a 29 63 75 72 2d 3e 70 56  ay_vtab*)cur->pV
0e00: 74 61 62 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  tab;.  if( pCur-
0e10: 3e 69 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  >i>=0 && pCur->i
0e20: 3c 70 56 74 61 62 2d 3e 70 43 6f 6e 74 65 6e 74  <pVtab->pContent
0e30: 2d 3e 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ->n ){.    sqlit
0e40: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
0e50: 63 74 78 2c 20 70 56 74 61 62 2d 3e 70 43 6f 6e  ctx, pVtab->pCon
0e60: 74 65 6e 74 2d 3e 61 5b 70 43 75 72 2d 3e 69 5d  tent->a[pCur->i]
0e70: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
0e80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
0e90: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 74 68 65  .** Retrieve the
0ea0: 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 0a   current rowid..
0eb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
0ec0: 74 61 72 72 61 79 52 6f 77 69 64 28 73 71 6c 69  tarrayRowid(sqli
0ed0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
0ee0: 2a 63 75 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74  *cur, sqlite_int
0ef0: 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20 69  64 *pRowid){.  i
0f00: 6e 74 61 72 72 61 79 5f 63 75 72 73 6f 72 20 2a  ntarray_cursor *
0f10: 70 43 75 72 20 3d 20 28 69 6e 74 61 72 72 61 79  pCur = (intarray
0f20: 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20  _cursor *)cur;. 
0f30: 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 75 72 2d   *pRowid = pCur-
0f40: 3e 69 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  >i;.  return SQL
0f50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
0f60: 63 20 69 6e 74 20 69 6e 74 61 72 72 61 79 45 6f  c int intarrayEo
0f70: 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  f(sqlite3_vtab_c
0f80: 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 69  ursor *cur){.  i
0f90: 6e 74 61 72 72 61 79 5f 63 75 72 73 6f 72 20 2a  ntarray_cursor *
0fa0: 70 43 75 72 20 3d 20 28 69 6e 74 61 72 72 61 79  pCur = (intarray
0fb0: 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20  _cursor *)cur;. 
0fc0: 20 69 6e 74 61 72 72 61 79 5f 76 74 61 62 20 2a   intarray_vtab *
0fd0: 70 56 74 61 62 20 3d 20 28 69 6e 74 61 72 72 61  pVtab = (intarra
0fe0: 79 5f 76 74 61 62 20 2a 29 63 75 72 2d 3e 70 56  y_vtab *)cur->pV
0ff0: 74 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  tab;.  return pC
1000: 75 72 2d 3e 69 3e 3d 70 56 74 61 62 2d 3e 70 43  ur->i>=pVtab->pC
1010: 6f 6e 74 65 6e 74 2d 3e 6e 3b 0a 7d 0a 0a 2f 2a  ontent->n;.}../*
1020: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
1030: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
1040: 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  xt row..*/.stati
1050: 63 20 69 6e 74 20 69 6e 74 61 72 72 61 79 4e 65  c int intarrayNe
1060: 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  xt(sqlite3_vtab_
1070: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
1080: 69 6e 74 61 72 72 61 79 5f 63 75 72 73 6f 72 20  intarray_cursor 
1090: 2a 70 43 75 72 20 3d 20 28 69 6e 74 61 72 72 61  *pCur = (intarra
10a0: 79 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a  y_cursor *)cur;.
10b0: 20 20 70 43 75 72 2d 3e 69 2b 2b 3b 0a 20 20 72    pCur->i++;.  r
10c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
10e0: 61 20 69 6e 74 61 72 72 61 79 20 74 61 62 6c 65  a intarray table
10f0: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
1100: 69 63 20 69 6e 74 20 69 6e 74 61 72 72 61 79 46  ic int intarrayF
1110: 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ilter(.  sqlite3
1120: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
1130: 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e  tabCursor, .  in
1140: 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20  t idxNum, const 
1150: 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20  char *idxStr,.  
1160: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
1170: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
1180: 7b 0a 20 20 69 6e 74 61 72 72 61 79 5f 63 75 72  {.  intarray_cur
1190: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 69 6e 74  sor *pCur = (int
11a0: 61 72 72 61 79 5f 63 75 72 73 6f 72 20 2a 29 70  array_cursor *)p
11b0: 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 70 43  VtabCursor;.  pC
11c0: 75 72 2d 3e 69 20 3d 20 30 3b 0a 20 20 72 65 74  ur->i = 0;.  ret
11d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 73 65 20  ../*.** Analyse 
11f0: 74 68 65 20 57 48 45 52 45 20 63 6f 6e 64 69 74  the WHERE condit
1200: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1210: 6e 74 20 69 6e 74 61 72 72 61 79 42 65 73 74 49  nt intarrayBestI
1220: 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61  ndex(sqlite3_vta
1230: 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f  b *tab, sqlite3_
1240: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
1250: 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20  Info){.  return 
1260: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1270: 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61  .** A virtual ta
1280: 62 6c 65 20 6d 6f 64 75 6c 65 20 74 68 61 74 20  ble module that 
1290: 6d 65 72 65 6c 79 20 65 63 68 6f 73 20 6d 65 74  merely echos met
12a0: 68 6f 64 20 63 61 6c 6c 73 20 69 6e 74 6f 20 54  hod calls into T
12b0: 43 4c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e  CL.** variables.
12c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
12d0: 65 33 5f 6d 6f 64 75 6c 65 20 69 6e 74 61 72 72  e3_module intarr
12e0: 61 79 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30  ayModule = {.  0
12f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1310: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  Version */.  int
1320: 61 72 72 61 79 43 72 65 61 74 65 2c 20 20 20 20  arrayCreate,    
1330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72            /* xCr
1340: 65 61 74 65 20 2d 20 63 72 65 61 74 65 20 61 20  eate - create a 
1350: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c  new virtual tabl
1360: 65 20 2a 2f 0a 20 20 69 6e 74 61 72 72 61 79 43  e */.  intarrayC
1370: 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  reate,          
1380: 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20      /* xConnect 
1390: 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e 20  - connect to an 
13a0: 65 78 69 73 74 69 6e 67 20 76 74 61 62 20 2a 2f  existing vtab */
13b0: 0a 20 20 69 6e 74 61 72 72 61 79 42 65 73 74 49  .  intarrayBestI
13c0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
13d0: 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d 20  /* xBestIndex - 
13e0: 66 69 6e 64 20 74 68 65 20 62 65 73 74 20 71 75  find the best qu
13f0: 65 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ery index */.  i
1400: 6e 74 61 72 72 61 79 44 65 73 74 72 6f 79 2c 20  ntarrayDestroy, 
1410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1420: 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20 64 69 73  Disconnect - dis
1430: 63 6f 6e 6e 65 63 74 20 61 20 76 74 61 62 20 2a  connect a vtab *
1440: 2f 0a 20 20 69 6e 74 61 72 72 61 79 44 65 73 74  /.  intarrayDest
1450: 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  roy,            
1460: 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20 64   /* xDestroy - d
1470: 65 73 74 72 6f 79 20 61 20 76 74 61 62 20 2a 2f  estroy a vtab */
1480: 0a 20 20 69 6e 74 61 72 72 61 79 4f 70 65 6e 2c  .  intarrayOpen,
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20  /* xOpen - open 
14b0: 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e  a cursor */.  in
14c0: 74 61 72 72 61 79 43 6c 6f 73 65 2c 20 20 20 20  tarrayClose,    
14d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
14e0: 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63  lose - close a c
14f0: 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 61 72  ursor */.  intar
1500: 72 61 79 46 69 6c 74 65 72 2c 20 20 20 20 20 20  rayFilter,      
1510: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74          /* xFilt
1520: 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73  er - configure s
1530: 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  can constraints 
1540: 2a 2f 0a 20 20 69 6e 74 61 72 72 61 79 4e 65 78  */.  intarrayNex
1550: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1560: 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76    /* xNext - adv
1570: 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  ance a cursor */
1580: 0a 20 20 69 6e 74 61 72 72 61 79 45 6f 66 2c 20  .  intarrayEof, 
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 69 6e 74  /* xEof */.  int
15b0: 61 72 72 61 79 43 6f 6c 75 6d 6e 2c 20 20 20 20  arrayColumn,    
15c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
15d0: 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61  lumn - read data
15e0: 20 2a 2f 0a 20 20 69 6e 74 61 72 72 61 79 52 6f   */.  intarrayRo
15f0: 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
1600: 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72     /* xRowid - r
1610: 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c  ead data */.  0,
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1640: 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20 20 20  pdate */.  0,   
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69          /* xBegi
1670: 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
16a0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16c0: 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 30  * xCommit */.  0
16d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
16f0: 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c  Rollback */.  0,
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
1720: 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  indMethod */.  0
1730: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1750: 52 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 65  Rename */.};..#e
1760: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1770: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
1780: 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 2f  TUALTABLE) */../
1790: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 69 73  *.** Invoke this
17a0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 63 72 65 61   routine to crea
17b0: 74 65 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  te a specific in
17c0: 73 74 61 6e 63 65 20 6f 66 20 61 6e 20 69 6e 74  stance of an int
17d0: 61 72 72 61 79 20 6f 62 6a 65 63 74 2e 0a 2a 2a  array object..**
17e0: 20 54 68 65 20 6e 65 77 20 69 6e 74 61 72 72 61   The new intarra
17f0: 79 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75  y object is retu
1800: 72 6e 65 64 20 62 79 20 74 68 65 20 33 72 64 20  rned by the 3rd 
1810: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
1820: 20 45 61 63 68 20 69 6e 74 61 72 72 61 79 20 6f   Each intarray o
1830: 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
1840: 73 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74  s to a virtual t
1850: 61 62 6c 65 20 69 6e 20 74 68 65 20 54 45 4d 50  able in the TEMP
1860: 20 74 61 62 6c 65 0a 2a 2a 20 77 69 74 68 20 61   table.** with a
1870: 20 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 2e 0a   name of zName..
1880: 2a 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68  **.** Destroy th
1890: 65 20 69 6e 74 61 72 72 61 79 20 6f 62 6a 65 63  e intarray objec
18a0: 74 20 62 79 20 64 72 6f 70 70 69 6e 67 20 74 68  t by dropping th
18b0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
18c0: 20 20 49 66 20 6e 6f 74 20 64 6f 6e 65 0a 2a 2a    If not done.**
18d0: 20 65 78 70 6c 69 63 69 74 6c 79 20 62 79 20 74   explicitly by t
18e0: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2c 20  he application, 
18f0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1900: 65 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  e will be droppe
1910: 64 20 69 6d 70 6c 69 63 69 74 6c 79 0a 2a 2a 20  d implicitly.** 
1920: 62 79 20 74 68 65 20 73 79 73 74 65 6d 20 77 68  by the system wh
1930: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
1940: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c  connection is cl
1950: 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
1960: 69 74 65 33 5f 69 6e 74 61 72 72 61 79 5f 63 72  ite3_intarray_cr
1970: 65 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  eate(.  sqlite3 
1980: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
1990: 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69  r *zName,.  sqli
19a0: 74 65 33 5f 69 6e 74 61 72 72 61 79 20 2a 2a 70  te3_intarray **p
19b0: 70 52 65 74 75 72 6e 0a 29 7b 0a 20 20 69 6e 74  pReturn.){.  int
19c0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69   rc;.  sqlite3_i
19d0: 6e 74 61 72 72 61 79 20 2a 70 3b 0a 0a 20 20 2a  ntarray *p;..  *
19e0: 70 70 52 65 74 75 72 6e 20 3d 20 70 20 3d 20 73  ppReturn = p = s
19f0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
1a00: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
1a10: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( p==0 ){.    r
1a20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1a30: 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
1a40: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
1a50: 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
1a60: 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65  e3_create_module
1a70: 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 26  _v2(db, zName, &
1a80: 69 6e 74 61 72 72 61 79 4d 6f 64 75 6c 65 2c 20  intarrayModule, 
1a90: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64     (void(*)(void
1ac0: 2a 29 29 69 6e 74 61 72 72 61 79 46 72 65 65 29  *))intarrayFree)
1ad0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1ae0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 61  TE_OK ){.    cha
1af0: 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 7a 53 71  r *zSql;.    zSq
1b00: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
1b10: 6e 74 66 28 22 43 52 45 41 54 45 20 56 49 52 54  ntf("CREATE VIRT
1b20: 55 41 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e 25  UAL TABLE temp.%
1b30: 51 20 55 53 49 4e 47 20 25 51 22 2c 0a 20 20 20  Q USING %Q",.   
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a          zName, z
1b60: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
1b70: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
1b80: 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b   zSql, 0, 0, 0);
1b90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1ba0: 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 72  e(zSql);.  }.  r
1bb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1bc0: 2a 2a 20 42 69 6e 64 20 61 20 6e 65 77 20 61 72  ** Bind a new ar
1bd0: 72 61 79 20 61 72 72 61 79 20 6f 66 20 69 6e 74  ray array of int
1be0: 65 67 65 72 73 20 74 6f 20 61 20 73 70 65 63 69  egers to a speci
1bf0: 66 69 63 20 69 6e 74 61 72 72 61 79 20 6f 62 6a  fic intarray obj
1c00: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ect..**.** The a
1c10: 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73  rray of integers
1c20: 20 62 6f 75 6e 64 20 6d 75 73 74 20 62 65 20 75   bound must be u
1c30: 6e 63 68 61 6e 67 65 64 20 66 6f 72 20 74 68 65  nchanged for the
1c40: 20 64 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20   duration of.** 
1c50: 61 6e 79 20 71 75 65 72 79 20 61 67 61 69 6e 73  any query agains
1c60: 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
1c70: 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ing virtual tabl
1c80: 65 2e 20 20 49 66 20 74 68 65 20 69 6e 74 65 67  e.  If the integ
1c90: 65 72 0a 2a 2a 20 61 72 72 61 79 20 64 6f 65 73  er.** array does
1ca0: 20 63 68 61 6e 67 65 20 6f 72 20 69 73 20 64 65   change or is de
1cb0: 61 6c 6c 6f 63 61 74 65 64 20 75 6e 64 65 66 69  allocated undefi
1cc0: 6e 65 64 20 62 65 68 61 76 69 6f 72 20 77 69 6c  ned behavior wil
1cd0: 6c 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74  l result..*/.int
1ce0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 61 72 72 61   sqlite3_intarra
1cf0: 79 5f 62 69 6e 64 28 0a 20 20 73 71 6c 69 74 65  y_bind(.  sqlite
1d00: 33 5f 69 6e 74 61 72 72 61 79 20 2a 70 49 6e 74  3_intarray *pInt
1d10: 41 72 72 61 79 2c 20 20 20 2f 2a 20 54 68 65 20  Array,   /* The 
1d20: 69 6e 74 61 72 72 61 79 20 6f 62 6a 65 63 74 20  intarray object 
1d30: 74 6f 20 62 69 6e 64 20 74 6f 20 2a 2f 0a 20 20  to bind to */.  
1d40: 69 6e 74 20 6e 45 6c 65 6d 65 6e 74 73 2c 20 20  int nElements,  
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
1d70: 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 74 61  ents in the inta
1d80: 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rray */.  sqlite
1d90: 33 5f 69 6e 74 36 34 20 2a 61 45 6c 65 6d 65 6e  3_int64 *aElemen
1da0: 74 73 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ts,      /* Cont
1db0: 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 74 61 72  ent of the intar
1dc0: 72 61 79 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ray */.  void (*
1dd0: 78 46 72 65 65 29 28 76 6f 69 64 2a 29 20 20 20  xFree)(void*)   
1de0: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
1df0: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
1e00: 20 69 6e 74 61 72 72 61 79 20 77 68 65 6e 20 64   intarray when d
1e10: 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  one */.){.  if( 
1e20: 70 49 6e 74 41 72 72 61 79 2d 3e 78 46 72 65 65  pIntArray->xFree
1e30: 20 29 7b 0a 20 20 20 20 70 49 6e 74 41 72 72 61   ){.    pIntArra
1e40: 79 2d 3e 78 46 72 65 65 28 70 49 6e 74 41 72 72  y->xFree(pIntArr
1e50: 61 79 2d 3e 61 29 3b 0a 20 20 7d 0a 20 20 70 49  ay->a);.  }.  pI
1e60: 6e 74 41 72 72 61 79 2d 3e 6e 20 3d 20 6e 45 6c  ntArray->n = nEl
1e70: 65 6d 65 6e 74 73 3b 0a 20 20 70 49 6e 74 41 72  ements;.  pIntAr
1e80: 72 61 79 2d 3e 61 20 3d 20 61 45 6c 65 6d 65 6e  ray->a = aElemen
1e90: 74 73 3b 0a 20 20 70 49 6e 74 41 72 72 61 79 2d  ts;.  pIntArray-
1ea0: 3e 78 46 72 65 65 20 3d 20 78 46 72 65 65 3b 0a  >xFree = xFree;.
1eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ec0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  OK;.}.../*******
1ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f10: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79 74  ******.** Everyt
1f20: 68 69 6e 67 20 62 65 6c 6f 77 20 69 73 20 69 6e  hing below is in
1f30: 74 65 72 66 61 63 65 20 66 6f 72 20 74 65 73 74  terface for test
1f40: 69 6e 67 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ing this module.
1f50: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1f60: 45 5f 54 45 53 54 0a 23 69 6e 63 6c 75 64 65 20  E_TEST.#include 
1f70: 3c 74 63 6c 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 52  <tcl.h>../*.** R
1f80: 6f 75 74 69 6e 65 73 20 74 6f 20 65 6e 63 6f 64  outines to encod
1f90: 65 20 61 6e 64 20 64 65 63 6f 64 65 20 70 6f 69  e and decode poi
1fa0: 6e 74 65 72 73 0a 2a 2f 0a 65 78 74 65 72 6e 20  nters.*/.extern 
1fb0: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
1fc0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1fd0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
1fe0: 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70  *zA, sqlite3 **p
1ff0: 70 44 62 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74  pDb);.extern int
2000: 20 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74   sqlite3TestText
2010: 54 6f 50 74 72 28 63 6f 6e 73 74 20 63 68 61 72  ToPtr(const char
2020: 2a 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  *);.extern int s
2030: 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
2040: 69 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74  interStr(Tcl_Int
2050: 65 72 70 2a 2c 20 63 68 61 72 20 2a 7a 50 74 72  erp*, char *zPtr
2060: 2c 20 76 6f 69 64 2a 29 3b 0a 65 78 74 65 72 6e  , void*);.extern
2070: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
2080: 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d  ite3TestErrorNam
2090: 65 28 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 20  e(int);../*.**  
20a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 61 72 72    sqlite3_intarr
20b0: 61 79 5f 63 72 65 61 74 65 20 20 44 42 20 20 4e  ay_create  DB  N
20c0: 41 4d 45 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  AME.**.** Invoke
20d0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 74   the sqlite3_int
20e0: 61 72 72 61 79 5f 63 72 65 61 74 65 20 69 6e 74  array_create int
20f0: 65 72 66 61 63 65 2e 20 20 41 20 73 74 72 69 6e  erface.  A strin
2100: 67 20 74 68 61 74 20 62 65 63 6f 6d 65 73 0a 2a  g that becomes.*
2110: 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 72 61  * the first para
2120: 6d 65 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  meter to sqlite3
2130: 5f 69 6e 74 61 72 72 61 79 5f 62 69 6e 64 2e 0a  _intarray_bind..
2140: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
2150: 73 74 5f 69 6e 74 61 72 72 61 79 5f 63 72 65 61  st_intarray_crea
2160: 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
2170: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2180: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63  Not used */.  Tc
2190: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
21a0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
21b0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
21c0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
21d0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
21e0: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
21f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2200: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2210: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2220: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2230: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2240: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2250: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2260: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  me;.  sqlite3_in
2270: 74 61 72 72 61 79 20 2a 70 41 72 72 61 79 3b 0a  tarray *pArray;.
2280: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
2290: 20 7a 50 74 72 5b 31 30 30 5d 3b 0a 0a 20 20 69   zPtr[100];..  i
22a0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
22b0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
22c0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
22d0: 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
22e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22f0: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2300: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2310: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2320: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
2330: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2340: 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  .  zName = Tcl_G
2350: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
2360: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2370: 33 5f 69 6e 74 61 72 72 61 79 5f 63 72 65 61 74  3_intarray_creat
2380: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 41  e(db, zName, &pA
2390: 72 72 61 79 29 3b 0a 20 20 69 66 28 20 72 63 21  rray);.  if( rc!
23a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23b0: 20 20 61 73 73 65 72 74 28 20 70 41 72 72 61 79    assert( pArray
23c0: 3d 3d 30 20 29 3b 0a 20 20 20 20 54 63 6c 5f 41  ==0 );.    Tcl_A
23d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
23e0: 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45  rp, sqlite3TestE
23f0: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 28 63  rrorName(rc), (c
2400: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
2410: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2420: 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 65 73 74   }.  sqlite3Test
2430: 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
2440: 6e 74 65 72 70 2c 20 7a 50 74 72 2c 20 70 41 72  nterp, zPtr, pAr
2450: 72 61 79 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ray);.  Tcl_Appe
2460: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2470: 20 7a 50 74 72 2c 20 28 63 68 61 72 2a 29 30 29   zPtr, (char*)0)
2480: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2490: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73  K;.}../*.**    s
24a0: 71 6c 69 74 65 33 5f 69 6e 74 61 72 72 61 79 5f  qlite3_intarray_
24b0: 62 69 6e 64 20 20 49 4e 54 41 52 52 41 59 20 20  bind  INTARRAY  
24c0: 3f 56 41 4c 55 45 20 2e 2e 2e 3f 0a 2a 2a 0a 2a  ?VALUE ...?.**.*
24d0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
24e0: 69 74 65 33 5f 69 6e 74 61 72 72 61 79 5f 62 69  ite3_intarray_bi
24f0: 6e 64 20 69 6e 74 65 72 66 61 63 65 20 6f 6e 20  nd interface on 
2500: 74 68 65 20 67 69 76 65 6e 20 61 72 72 61 79 20  the given array 
2510: 6f 66 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2f 0a  of integers..*/.
2520: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
2530: 69 6e 74 61 72 72 61 79 5f 62 69 6e 64 28 0a 20  intarray_bind(. 
2540: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
2550: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
2560: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
2570: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2580: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2590: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
25a0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
25b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
25e0: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
25f0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2600: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2610: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
2620: 69 74 65 33 5f 69 6e 74 61 72 72 61 79 20 2a 70  ite3_intarray *p
2630: 41 72 72 61 79 3b 0a 20 20 69 6e 74 20 72 63 3b  Array;.  int rc;
2640: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 73  .  int i, n;.  s
2650: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 61 3b  qlite3_int64 *a;
2660: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
2670: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2680: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2690: 2c 20 6f 62 6a 76 2c 20 22 49 4e 54 41 52 52 41  , objv, "INTARRA
26a0: 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Y");.    return 
26b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
26c0: 20 70 41 72 72 61 79 20 3d 20 28 73 71 6c 69 74   pArray = (sqlit
26d0: 65 33 5f 69 6e 74 61 72 72 61 79 2a 29 73 71 6c  e3_intarray*)sql
26e0: 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74  ite3TestTextToPt
26f0: 72 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  r(Tcl_GetString(
2700: 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 6e 20 3d  objv[1]));.  n =
2710: 20 6f 62 6a 63 20 2d 20 32 3b 0a 20 20 61 20 3d   objc - 2;.  a =
2720: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2730: 20 73 69 7a 65 6f 66 28 61 5b 30 5d 29 2a 6e 20   sizeof(a[0])*n 
2740: 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  );.  if( a==0 ){
2750: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2760: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
2770: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 2c 20 28 63  QLITE_NOMEM", (c
2780: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
2790: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27a0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
27b0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69  n; i++){.    a[i
27c0: 5d 20 3d 20 30 3b 0a 20 20 20 20 54 63 6c 5f 47  ] = 0;.    Tcl_G
27d0: 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
27e0: 28 30 2c 20 6f 62 6a 76 5b 69 2b 32 5d 2c 20 26  (0, objv[i+2], &
27f0: 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 63 20  a[i]);.  }.  rc 
2800: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 74 61 72 72  = sqlite3_intarr
2810: 61 79 5f 62 69 6e 64 28 70 41 72 72 61 79 2c 20  ay_bind(pArray, 
2820: 6e 2c 20 61 2c 20 73 71 6c 69 74 65 33 5f 66 72  n, a, sqlite3_fr
2830: 65 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ee);.  if( rc!=S
2840: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2850: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2860: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
2870: 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63  TestErrorName(rc
2880: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
2890: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28a0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
28b0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
28c0: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61  * Register comma
28d0: 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c  nds with the TCL
28e0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f   interpreter..*/
28f0: 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 69  .int Sqlitetesti
2900: 6e 74 61 72 72 61 79 5f 49 6e 69 74 28 54 63 6c  ntarray_Init(Tcl
2910: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
2920: 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  {.  static struc
2930: 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
2940: 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f  Name;.     Tcl_O
2950: 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  bjCmdProc *xProc
2960: 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69  ;.     void *cli
2970: 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62  entData;.  } aOb
2980: 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  jCmd[] = {.     
2990: 7b 20 22 73 71 6c 69 74 65 33 5f 69 6e 74 61 72  { "sqlite3_intar
29a0: 72 61 79 5f 63 72 65 61 74 65 22 2c 20 74 65 73  ray_create", tes
29b0: 74 5f 69 6e 74 61 72 72 61 79 5f 63 72 65 61 74  t_intarray_creat
29c0: 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  e, 0 },.     { "
29d0: 73 71 6c 69 74 65 33 5f 69 6e 74 61 72 72 61 79  sqlite3_intarray
29e0: 5f 62 69 6e 64 22 2c 20 74 65 73 74 5f 69 6e 74  _bind", test_int
29f0: 61 72 72 61 79 5f 62 69 6e 64 2c 20 30 20 7d 2c  array_bind, 0 },
2a00: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
2a10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2a20: 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65  of(aObjCmd)/size
2a30: 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20  of(aObjCmd[0]); 
2a40: 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  i++){.    Tcl_Cr
2a50: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
2a60: 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69  nterp, aObjCmd[i
2a70: 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
2a80: 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72    aObjCmd[i].xPr
2a90: 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63  oc, aObjCmd[i].c
2aa0: 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20  lientData, 0);. 
2ab0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
2ac0: 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
2ad0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.