/ Hex Artifact Content
Login

Artifact d57ae92f420cda25e22790dac474d60961bd0c500cbaa3338a05152d4a669ef7:


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 69 73 20 74 68 65 20 43 2d 6c 61 6e 67 75 61   is the C-langua
0190: 67 65 20 69 6e 74 65 72 66 61 63 65 20 64 65 66  ge interface def
01a0: 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  inition for the 
01b0: 22 69 6e 74 61 72 72 61 79 22 20 6f 72 0a 2a 2a  "intarray" or.**
01c0: 20 69 6e 74 65 67 65 72 20 61 72 72 61 79 20 76   integer array v
01d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66 6f 72  irtual table for
01e0: 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 54   SQLite..**.** T
01f0: 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
0200: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 69 6e  e is used for in
0210: 74 65 72 6e 61 6c 20 74 65 73 74 69 6e 67 20 6f  ternal testing o
0220: 66 20 53 51 4c 69 74 65 20 6f 6e 6c 79 2e 20 20  f SQLite only.  
0230: 49 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 72 65 63  It is.** not rec
0240: 6f 6d 6d 65 6e 64 65 64 20 66 6f 72 20 75 73 65  ommended for use
0250: 20 69 6e 20 70 72 6f 64 75 63 74 69 6f 6e 2e 20   in production. 
0260: 20 46 6f 72 20 61 20 73 69 6d 69 6c 61 72 20 76   For a similar v
0270: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61  irtual table tha
0280: 74 0a 2a 2a 20 69 73 20 70 72 6f 64 75 63 74 69  t.** is producti
0290: 6f 6e 2d 72 65 61 64 79 2c 20 73 65 65 20 74 68  on-ready, see th
02a0: 65 20 22 63 61 72 72 61 79 22 20 76 69 72 74 75  e "carray" virtu
02b0: 61 6c 20 74 61 62 6c 65 20 6f 76 65 72 20 69 6e  al table over in
02c0: 20 65 78 74 2f 6d 69 73 63 2e 0a 2a 2a 0a 2a 2a   ext/misc..**.**
02d0: 20 54 68 65 20 69 6e 74 61 72 72 61 79 20 76 69   The intarray vi
02e0: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 64  rtual table is d
02f0: 65 73 69 67 6e 65 64 20 74 6f 20 66 61 63 69 6c  esigned to facil
0300: 69 74 61 74 65 20 75 73 69 6e 67 20 61 6e 0a 2a  itate using an.*
0310: 2a 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67  * array of integ
0320: 65 72 73 20 61 73 20 74 68 65 20 72 69 67 68 74  ers as the right
0330: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
0340: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 53   IN operator.  S
0350: 6f 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20  o.** instead of 
0360: 64 6f 69 6e 67 20 61 20 70 72 65 70 61 72 65 64  doing a prepared
0370: 20 73 74 61 74 65 6d 65 6e 74 20 6c 69 6b 65 20   statement like 
0380: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
0390: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
03a0: 62 6c 65 20 57 48 45 52 45 20 78 20 49 4e 20 28  ble WHERE x IN (
03b0: 3f 2c 3f 2c 3f 2c 2e 2e 2e 2c 3f 29 3b 0a 2a 2a  ?,?,?,...,?);.**
03c0: 0a 2a 2a 20 41 6e 64 20 74 68 65 6e 20 62 69 6e  .** And then bin
03d0: 64 69 6e 67 20 69 6e 64 69 76 64 75 61 6c 20 69  ding indivdual i
03e0: 6e 74 65 67 65 72 73 20 74 6f 20 65 61 63 68 20  ntegers to each 
03f0: 6f 66 20 3f 20 73 6c 6f 74 73 2c 20 61 20 43 2d  of ? slots, a C-
0400: 6c 61 6e 67 75 61 67 65 0a 2a 2a 20 61 70 70 6c  language.** appl
0410: 69 63 61 74 69 6f 6e 20 63 61 6e 20 63 72 65 61  ication can crea
0420: 74 65 20 61 6e 20 69 6e 74 61 72 72 61 79 20 6f  te an intarray o
0430: 62 6a 65 63 74 20 28 6e 61 6d 65 64 20 22 65 78  bject (named "ex
0440: 31 22 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  1" in the follow
0450: 69 6e 67 0a 2a 2a 20 65 78 61 6d 70 6c 65 29 2c  ing.** example),
0460: 20 70 72 65 70 61 72 65 20 61 20 73 74 61 74 65   prepare a state
0470: 6d 65 6e 74 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ment like this:.
0480: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
0490: 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48   * FROM table WH
04a0: 45 52 45 20 78 20 49 4e 20 65 78 31 3b 0a 2a 2a  ERE x IN ex1;.**
04b0: 0a 2a 2a 20 54 68 65 6e 20 62 69 6e 64 20 61 6e  .** Then bind an
04c0: 20 6f 72 64 69 6e 61 72 79 20 43 2f 43 2b 2b 20   ordinary C/C++ 
04d0: 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72  array of integer
04e0: 20 76 61 6c 75 65 73 20 74 6f 20 74 68 65 20 65   values to the e
04f0: 78 31 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  x1 object.** to 
0500: 72 75 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  run the statemen
0510: 74 2e 0a 2a 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a  t..**.** USAGE:.
0520: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72  **.** One or mor
0530: 65 20 69 6e 74 61 72 72 61 79 20 6f 62 6a 65 63  e intarray objec
0540: 74 73 20 63 61 6e 20 62 65 20 63 72 65 61 74 65  ts can be create
0550: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
0560: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
0570: 5f 69 6e 74 61 72 72 61 79 20 2a 70 31 2c 20 2a  _intarray *p1, *
0580: 70 32 2c 20 2a 70 33 3b 0a 2a 2a 20 20 20 20 20  p2, *p3;.**     
0590: 20 73 71 6c 69 74 65 33 5f 69 6e 74 61 72 72 61   sqlite3_intarra
05a0: 79 5f 63 72 65 61 74 65 28 64 62 2c 20 22 65 78  y_create(db, "ex
05b0: 31 22 2c 20 26 70 31 29 3b 0a 2a 2a 20 20 20 20  1", &p1);.**    
05c0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 61 72 72    sqlite3_intarr
05d0: 61 79 5f 63 72 65 61 74 65 28 64 62 2c 20 22 65  ay_create(db, "e
05e0: 78 32 22 2c 20 26 70 32 29 3b 0a 2a 2a 20 20 20  x2", &p2);.**   
05f0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 61 72     sqlite3_intar
0600: 72 61 79 5f 63 72 65 61 74 65 28 64 62 2c 20 22  ray_create(db, "
0610: 65 78 33 22 2c 20 26 70 33 29 3b 0a 2a 2a 0a 2a  ex3", &p3);.**.*
0620: 2a 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 73  * Each call to s
0630: 71 6c 69 74 65 33 5f 69 6e 74 61 72 72 61 79 5f  qlite3_intarray_
0640: 63 72 65 61 74 65 28 29 20 67 65 6e 65 72 61 74  create() generat
0650: 65 73 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  es a new virtual
0660: 20 74 61 62 6c 65 0a 2a 2a 20 6d 6f 64 75 6c 65   table.** module
0670: 20 61 6e 64 20 61 20 73 69 6e 67 6c 65 74 6f 6e   and a singleton
0680: 20 6f 66 20 74 68 61 74 20 76 69 72 74 75 61 6c   of that virtual
0690: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 69 6e   table module in
06a0: 20 74 68 65 20 54 45 4d 50 0a 2a 2a 20 64 61 74   the TEMP.** dat
06b0: 61 62 61 73 65 2e 20 20 42 6f 74 68 20 74 68 65  abase.  Both the
06c0: 20 6d 6f 64 75 6c 65 20 61 6e 64 20 74 68 65 20   module and the 
06d0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
06e0: 73 74 61 6e 63 65 20 75 73 65 20 74 68 65 0a 2a  stance use the.*
06f0: 2a 20 6e 61 6d 65 20 67 69 76 65 6e 20 62 79 20  * name given by 
0700: 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
0710: 65 74 65 72 2e 20 20 54 68 65 20 76 69 72 74 75  eter.  The virtu
0720: 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20 74 68  al tables can th
0730: 65 6e 20 62 65 0a 2a 2a 20 75 73 65 64 20 69 6e  en be.** used in
0740: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
0750: 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ents:.**.**     
0760: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0770: 31 2c 20 74 32 2c 20 74 33 0a 2a 2a 20 20 20 20  1, t2, t3.**    
0780: 20 20 20 57 48 45 52 45 20 74 31 2e 78 20 49 4e     WHERE t1.x IN
0790: 20 65 78 31 0a 2a 2a 20 20 20 20 20 20 20 20 20   ex1.**         
07a0: 41 4e 44 20 74 32 2e 79 20 49 4e 20 65 78 32 0a  AND t2.y IN ex2.
07b0: 2a 2a 20 20 20 20 20 20 20 20 20 41 4e 44 20 74  **         AND t
07c0: 33 2e 7a 20 49 4e 20 65 78 33 3b 0a 2a 2a 0a 2a  3.z IN ex3;.**.*
07d0: 2a 20 45 61 63 68 20 69 6e 74 65 67 65 72 20 61  * Each integer a
07e0: 72 72 61 79 20 69 73 20 69 6e 69 74 69 61 6c 6c  rray is initiall
07f0: 79 20 65 6d 70 74 79 2e 20 20 4e 65 77 20 61 72  y empty.  New ar
0800: 72 61 79 73 20 63 61 6e 20 62 65 20 62 6f 75 6e  rays can be boun
0810: 64 20 74 6f 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  d to.** an integ
0820: 65 72 20 61 72 72 61 79 20 61 73 20 66 6f 6c 6c  er array as foll
0830: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ows:.**.**     s
0840: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 31 5b  qlite3_int64 a1[
0850: 5d 20 3d 20 7b 20 31 2c 20 32 2c 20 33 2c 20 34  ] = { 1, 2, 3, 4
0860: 20 7d 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74   };.**     sqlit
0870: 65 33 5f 69 6e 74 36 34 20 61 32 5b 5d 20 3d 20  e3_int64 a2[] = 
0880: 7b 20 35 2c 20 36 2c 20 37 2c 20 38 2c 20 39 2c  { 5, 6, 7, 8, 9,
0890: 20 31 30 2c 20 31 31 20 7d 3b 0a 2a 2a 20 20 20   10, 11 };.**   
08a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
08b0: 2a 61 33 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  *a3 = sqlite3_ma
08c0: 6c 6c 6f 63 28 20 31 30 30 2a 73 69 7a 65 6f 66  lloc( 100*sizeof
08d0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20  (sqlite3_int64) 
08e0: 29 3b 0a 2a 2a 20 20 20 20 20 2f 2f 20 46 69 6c  );.**     // Fil
08f0: 6c 20 69 6e 20 63 6f 6e 74 65 6e 74 20 6f 66 20  l in content of 
0900: 61 33 5b 5d 0a 2a 2a 20 20 20 20 20 73 71 6c 69  a3[].**     sqli
0910: 74 65 33 5f 69 6e 74 61 72 72 61 79 5f 62 69 6e  te3_intarray_bin
0920: 64 28 70 31 2c 20 34 2c 20 61 31 2c 20 30 29 3b  d(p1, 4, a1, 0);
0930: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .**     sqlite3_
0940: 69 6e 74 61 72 72 61 79 5f 62 69 6e 64 28 70 32  intarray_bind(p2
0950: 2c 20 37 2c 20 61 32 2c 20 30 29 3b 0a 2a 2a 20  , 7, a2, 0);.** 
0960: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 61      sqlite3_inta
0970: 72 72 61 79 5f 62 69 6e 64 28 70 33 2c 20 31 30  rray_bind(p3, 10
0980: 30 2c 20 61 33 2c 20 73 71 6c 69 74 65 33 5f 66  0, a3, sqlite3_f
0990: 72 65 65 29 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69  ree);.**.** A si
09a0: 6e 67 6c 65 20 69 6e 74 61 72 72 61 79 20 6f 62  ngle intarray ob
09b0: 6a 65 63 74 20 63 61 6e 20 62 65 20 72 65 62 6f  ject can be rebo
09c0: 75 6e 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  und multiple tim
09d0: 65 73 2e 20 20 42 75 74 20 64 6f 20 6e 6f 74 0a  es.  But do not.
09e0: 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 63 68  ** attempt to ch
09f0: 61 6e 67 65 20 74 68 65 20 62 69 6e 64 69 6e 67  ange the binding
0a00: 73 20 6f 66 20 61 6e 20 69 6e 74 61 72 72 61 79  s of an intarray
0a10: 20 77 68 69 6c 65 20 69 74 20 69 73 20 69 6e 20   while it is in 
0a20: 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
0a30: 20 61 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20   a query..**.** 
0a40: 54 68 65 20 61 72 72 61 79 20 74 68 61 74 20 68  The array that h
0a50: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
0a60: 73 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  s is automatical
0a70: 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20  ly freed by the 
0a80: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
0a90: 68 65 20 66 6f 75 72 74 68 20 70 61 72 61 6d 65  he fourth parame
0aa0: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 69  ter to sqlite3_i
0ab0: 6e 74 61 72 72 61 79 5f 62 69 6e 64 28 29 20 77  ntarray_bind() w
0ac0: 68 65 6e 20 74 68 65 20 61 72 72 61 79 20 69 73  hen the array is
0ad0: 20 6e 6f 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6e 65   no.** longer ne
0ae0: 65 64 65 64 2e 20 20 54 68 65 20 61 70 70 6c 69  eded.  The appli
0af0: 63 61 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20  cation must not 
0b00: 63 68 61 6e 67 65 20 74 68 65 20 69 6e 74 61 72  change the intar
0b10: 72 61 79 20 76 61 6c 75 65 73 0a 2a 2a 20 77 68  ray values.** wh
0b20: 69 6c 65 20 61 6e 20 69 6e 74 61 72 72 61 79 20  ile an intarray 
0b30: 69 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  is in the middle
0b40: 20 6f 66 20 61 20 71 75 65 72 79 2e 0a 2a 2a 0a   of a query..**.
0b50: 2a 2a 20 54 68 65 20 69 6e 74 61 72 72 61 79 20  ** The intarray 
0b60: 6f 62 6a 65 63 74 20 69 73 20 61 75 74 6f 6d 61  object is automa
0b70: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
0b80: 64 20 77 68 65 6e 20 69 74 73 20 63 6f 72 72 65  d when its corre
0b90: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 76 69 72 74  sponding.** virt
0ba0: 75 61 6c 20 74 61 62 6c 65 20 69 73 20 64 72 6f  ual table is dro
0bb0: 70 70 65 64 2e 20 20 53 69 6e 63 65 20 74 68 65  pped.  Since the
0bc0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
0bd0: 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
0be0: 68 65 0a 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  he.** TEMP datab
0bf0: 61 73 65 2c 20 74 68 65 79 20 61 72 65 20 61 75  ase, they are au
0c00: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 72 6f 70  tomatically drop
0c10: 70 65 64 20 77 68 65 6e 20 74 68 65 20 64 61 74  ped when the dat
0c20: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
0c30: 0a 2a 2a 20 63 6c 6f 73 65 73 20 73 6f 20 74 68  .** closes so th
0c40: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f  e application do
0c50: 65 73 20 6e 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20  es not normally 
0c60: 6e 65 65 64 20 74 6f 20 74 61 6b 65 20 61 6e 79  need to take any
0c70: 20 73 70 65 63 69 61 6c 0a 2a 2a 20 61 63 74 69   special.** acti
0c80: 6f 6e 20 74 6f 20 66 72 65 65 20 74 68 65 20 69  on to free the i
0c90: 6e 74 61 72 72 61 79 20 6f 62 6a 65 63 74 73 2e  ntarray objects.
0ca0: 20 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65    Because of the
0cb0: 20 77 61 79 20 76 69 72 74 75 61 6c 20 74 61 62   way virtual tab
0cc0: 6c 65 73 0a 2a 2a 20 77 6f 72 6b 20 61 6e 64 20  les.** work and 
0cd0: 74 68 65 20 28 73 6f 6d 65 77 68 61 74 20 67 6f  the (somewhat go
0ce0: 6f 66 79 29 20 77 61 79 20 74 68 61 74 20 74 68  ofy) way that th
0cf0: 65 20 69 6e 74 61 72 72 61 79 20 76 69 72 74 75  e intarray virtu
0d00: 61 6c 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 69  al table is.** i
0d10: 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 69 74 20 69  mplemented, it i
0d20: 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
0d30: 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f   invoke sqlite3_
0d40: 69 6e 74 61 72 72 61 79 5f 63 72 65 61 74 65 28  intarray_create(
0d50: 44 2c 4e 2c 50 29 0a 2a 2a 20 6d 6f 72 65 20 74  D,N,P).** more t
0d60: 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 20 74 68  han once with th
0d70: 65 20 73 61 6d 65 20 44 20 61 6e 64 20 4e 20 76  e same D and N v
0d80: 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  alues..*/.#inclu
0d90: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23  de "sqlite3.h".#
0da0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49 4e  ifndef SQLITE_IN
0db0: 54 41 52 52 41 59 5f 48 0a 23 64 65 66 69 6e 65  TARRAY_H.#define
0dc0: 20 53 51 4c 49 54 45 5f 49 4e 54 41 52 52 41 59   SQLITE_INTARRAY
0dd0: 5f 48 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  _H../*.** Make s
0de0: 75 72 65 20 77 65 20 63 61 6e 20 63 61 6c 6c 20  ure we can call 
0df0: 74 68 69 73 20 73 74 75 66 66 20 66 72 6f 6d 20  this stuff from 
0e00: 43 2b 2b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  C++..*/.#ifdef _
0e10: 5f 63 70 6c 75 73 70 6c 75 73 0a 65 78 74 65 72  _cplusplus.exter
0e20: 6e 20 22 43 22 20 7b 0a 23 65 6e 64 69 66 0a 0a  n "C" {.#endif..
0e30: 2f 2a 0a 2a 2a 20 41 6e 20 73 71 6c 69 74 65 33  /*.** An sqlite3
0e40: 5f 69 6e 74 61 72 72 61 79 20 69 73 20 61 6e 20  _intarray is an 
0e50: 61 62 73 74 72 61 63 74 20 74 79 70 65 20 74 6f  abstract type to
0e60: 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 73 74 61   stores an insta
0e70: 6e 63 65 20 6f 66 0a 2a 2a 20 61 6e 20 69 6e 74  nce of.** an int
0e80: 65 67 65 72 20 61 72 72 61 79 2e 0a 2a 2f 0a 74  eger array..*/.t
0e90: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 71  ypedef struct sq
0ea0: 6c 69 74 65 33 5f 69 6e 74 61 72 72 61 79 20 73  lite3_intarray s
0eb0: 71 6c 69 74 65 33 5f 69 6e 74 61 72 72 61 79 3b  qlite3_intarray;
0ec0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0ed0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 63  his routine to c
0ee0: 72 65 61 74 65 20 61 20 73 70 65 63 69 66 69 63  reate a specific
0ef0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 61 6e 20   instance of an 
0f00: 69 6e 74 61 72 72 61 79 20 6f 62 6a 65 63 74 2e  intarray object.
0f10: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 69 6e 74 61  .** The new inta
0f20: 72 72 61 79 20 6f 62 6a 65 63 74 20 69 73 20 72  rray object is r
0f30: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 33  eturned by the 3
0f40: 72 64 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  rd parameter..**
0f50: 0a 2a 2a 20 45 61 63 68 20 69 6e 74 61 72 72 61  .** Each intarra
0f60: 79 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  y object corresp
0f70: 6f 6e 64 73 20 74 6f 20 61 20 76 69 72 74 75 61  onds to a virtua
0f80: 6c 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 54  l table in the T
0f90: 45 4d 50 20 74 61 62 6c 65 0a 2a 2a 20 77 69 74  EMP table.** wit
0fa0: 68 20 61 20 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d  h a name of zNam
0fb0: 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 73 74 72 6f 79  e..**.** Destroy
0fc0: 20 74 68 65 20 69 6e 74 61 72 72 61 79 20 6f 62   the intarray ob
0fd0: 6a 65 63 74 20 62 79 20 64 72 6f 70 70 69 6e 67  ject by dropping
0fe0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
0ff0: 6c 65 2e 20 20 49 66 20 6e 6f 74 20 64 6f 6e 65  le.  If not done
1000: 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 62  .** explicitly b
1010: 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
1020: 6e 2c 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  n, the virtual t
1030: 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 64 72 6f  able will be dro
1040: 70 70 65 64 20 69 6d 70 6c 69 63 69 74 6c 79 0a  pped implicitly.
1050: 2a 2a 20 62 79 20 74 68 65 20 73 79 73 74 65 6d  ** by the system
1060: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
1070: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
1080: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 53 51 4c 49   closed..*/.SQLI
1090: 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74  TE_API int sqlit
10a0: 65 33 5f 69 6e 74 61 72 72 61 79 5f 63 72 65 61  e3_intarray_crea
10b0: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
10c0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
10d0: 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65  *zName,.  sqlite
10e0: 33 5f 69 6e 74 61 72 72 61 79 20 2a 2a 70 70 52  3_intarray **ppR
10f0: 65 74 75 72 6e 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  eturn.);../*.** 
1100: 42 69 6e 64 20 61 20 6e 65 77 20 61 72 72 61 79  Bind a new array
1110: 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65   array of intege
1120: 72 73 20 74 6f 20 61 20 73 70 65 63 69 66 69 63  rs to a specific
1130: 20 69 6e 74 61 72 72 61 79 20 6f 62 6a 65 63 74   intarray object
1140: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 61  ..**.** The arra
1150: 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 62 6f  y of integers bo
1160: 75 6e 64 20 6d 75 73 74 20 62 65 20 75 6e 63 68  und must be unch
1170: 61 6e 67 65 64 20 66 6f 72 20 74 68 65 20 64 75  anged for the du
1180: 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 61 6e 79  ration of.** any
1190: 20 71 75 65 72 79 20 61 67 61 69 6e 73 74 20 74   query against t
11a0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11b0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
11c0: 20 49 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a   If the integer.
11d0: 2a 2a 20 61 72 72 61 79 20 64 6f 65 73 20 63 68  ** array does ch
11e0: 61 6e 67 65 20 6f 72 20 69 73 20 64 65 61 6c 6c  ange or is deall
11f0: 6f 63 61 74 65 64 20 75 6e 64 65 66 69 6e 65 64  ocated undefined
1200: 20 62 65 68 61 76 69 6f 72 20 77 69 6c 6c 20 72   behavior will r
1210: 65 73 75 6c 74 2e 0a 2a 2f 0a 53 51 4c 49 54 45  esult..*/.SQLITE
1220: 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33  _API int sqlite3
1230: 5f 69 6e 74 61 72 72 61 79 5f 62 69 6e 64 28 0a  _intarray_bind(.
1240: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 61 72 72    sqlite3_intarr
1250: 61 79 20 2a 70 49 6e 74 41 72 72 61 79 2c 20 20  ay *pIntArray,  
1260: 20 2f 2a 20 54 68 65 20 69 6e 74 61 72 72 61 79   /* The intarray
1270: 20 6f 62 6a 65 63 74 20 74 6f 20 62 69 6e 64 20   object to bind 
1280: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6c 65  to */.  int nEle
1290: 6d 65 6e 74 73 2c 20 20 20 20 20 20 20 20 20 20  ments,          
12a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12b0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
12c0: 74 68 65 20 69 6e 74 61 72 72 61 79 20 2a 2f 0a  the intarray */.
12d0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
12e0: 2a 61 45 6c 65 6d 65 6e 74 73 2c 20 20 20 20 20  *aElements,     
12f0: 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
1300: 68 65 20 69 6e 74 61 72 72 61 79 20 2a 2f 0a 20  he intarray */. 
1310: 20 76 6f 69 64 20 28 2a 78 46 72 65 65 29 28 76   void (*xFree)(v
1320: 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20  oid*)           
1330: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
1340: 65 20 6f 66 20 74 68 65 20 69 6e 74 61 72 72 61  e of the intarra
1350: 79 20 77 68 65 6e 20 64 6f 6e 65 20 2a 2f 0a 29  y when done */.)
1360: 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c 75  ;..#ifdef __cplu
1370: 73 70 6c 75 73 0a 7d 20 20 2f 2a 20 45 6e 64 20  splus.}  /* End 
1380: 6f 66 20 74 68 65 20 27 65 78 74 65 72 6e 20 22  of the 'extern "
1390: 43 22 27 20 62 6c 6f 63 6b 20 2a 2f 0a 23 65 6e  C"' block */.#en
13a0: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
13b0: 4c 49 54 45 5f 49 4e 54 41 52 52 41 59 5f 48 20  LITE_INTARRAY_H 
13c0: 2a 2f 0a                                         */.