System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 68ce31fba0682ab2801e6649bb745006e4122576:


0000: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 20 2a 20 41 44  *********.. * AD
0040: 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74 61 20 50  O.NET 2.0 Data P
0050: 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51 4c 69  rovider for SQLi
0060: 74 65 20 56 65 72 73 69 6f 6e 20 33 2e 58 0d 0a  te Version 3.X..
0070: 20 2a 20 57 72 69 74 74 65 6e 20 62 79 20 4a 6f   * Written by Jo
0080: 65 20 4d 69 73 74 61 63 68 6b 69 6e 20 28 6a 6f  e Mistachkin (jo
0090: 65 40 6d 69 73 74 61 63 68 6b 69 6e 2e 63 6f 6d  e@mistachkin.com
00a0: 29 0d 0a 20 2a 0d 0a 20 2a 20 52 65 6c 65 61 73  ).. *.. * Releas
00b0: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00c0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00d0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00e0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 6e 61  *********/....na
0120: 6d 65 73 70 61 63 65 20 53 79 73 74 65 6d 2e 44  mespace System.D
0130: 61 74 61 2e 53 51 4c 69 74 65 0d 0a 7b 0d 0a 20  ata.SQLite..{.. 
0140: 20 20 20 23 72 65 67 69 6f 6e 20 49 53 51 4c 69     #region ISQLi
0150: 74 65 4e 61 74 69 76 65 4d 6f 64 75 6c 65 20 49  teNativeModule I
0160: 6e 74 65 72 66 61 63 65 0d 0a 20 20 20 20 2f 2f  nterface..    //
0170: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
0180: 20 2f 2f 2f 20 54 68 69 73 20 69 6e 74 65 72 66   /// This interf
0190: 61 63 65 20 72 65 70 72 65 73 65 6e 74 73 20 61  ace represents a
01a0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
01b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 72  mplementation wr
01c0: 69 74 74 65 6e 20 69 6e 0d 0a 20 20 20 20 2f 2f  itten in..    //
01d0: 2f 20 6e 61 74 69 76 65 20 63 6f 64 65 2e 0d 0a  / native code...
01e0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
01f0: 79 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 69  y>..    public i
0200: 6e 74 65 72 66 61 63 65 20 49 53 51 4c 69 74 65  nterface ISQLite
0210: 4e 61 74 69 76 65 4d 6f 64 75 6c 65 0d 0a 20 20  NativeModule..  
0220: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f    {..        ///
0230: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
0240: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63      /// <para><c
0250: 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ode>..        //
0260: 2f 20 69 6e 74 20 28 2a 78 43 72 65 61 74 65 29  / int (*xCreate)
0270: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
0280: 69 64 20 2a 70 41 75 78 2c 0d 0a 20 20 20 20 20  id *pAux,..     
0290: 20 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20 20     ///          
02a0: 20 20 20 20 69 6e 74 20 61 72 67 63 2c 20 63 68      int argc, ch
02b0: 61 72 20 2a 2a 61 72 67 76 2c 0d 0a 20 20 20 20  ar **argv,..    
02c0: 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20      ///         
02d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
02e0: 62 20 2a 2a 70 70 56 54 61 62 2c 0d 0a 20 20 20  b **ppVTab,..   
02f0: 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 20 20       ///        
0300: 20 20 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 45        char **pzE
0310: 72 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  rr);..        //
0320: 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e  / </code></para>
0330: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
0340: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
0350: 2f 20 54 68 65 20 78 43 72 65 61 74 65 20 6d 65  / The xCreate me
0360: 74 68 6f 64 20 69 73 20 63 61 6c 6c 65 64 20 74  thod is called t
0370: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 69  o create a new i
0380: 6e 73 74 61 6e 63 65 20 6f 66 20 61 20 76 69 72  nstance of a vir
0390: 74 75 61 6c 20 74 61 62 6c 65 20 0d 0a 20 20 20  tual table ..   
03a0: 20 20 20 20 20 2f 2f 2f 20 69 6e 20 72 65 73 70       /// in resp
03b0: 6f 6e 73 65 20 74 6f 20 61 20 43 52 45 41 54 45  onse to a CREATE
03c0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73   VIRTUAL TABLE s
03d0: 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20 20  tatement...     
03e0: 20 20 20 2f 2f 2f 20 49 66 20 74 68 65 20 78 43     /// If the xC
03f0: 72 65 61 74 65 20 6d 65 74 68 6f 64 20 69 73 20  reate method is 
0400: 74 68 65 20 73 61 6d 65 20 70 6f 69 6e 74 65 72  the same pointer
0410: 20 61 73 20 74 68 65 20 78 43 6f 6e 6e 65 63 74   as the xConnect
0420: 20 6d 65 74 68 6f 64 2c 20 74 68 65 6e 20 74 68   method, then th
0430: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 76  e..        /// v
0440: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
0450: 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  an eponymous vir
0460: 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a 20 20 20  tual table...   
0470: 20 20 20 20 20 2f 2f 2f 20 49 66 20 74 68 65 20       /// If the 
0480: 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64 20 69  xCreate method i
0490: 73 20 6f 6d 69 74 74 65 64 20 28 69 66 20 69 74  s omitted (if it
04a0: 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
04b0: 65 72 29 20 74 68 65 6e 20 74 68 65 20 76 69 72  er) then the vir
04c0: 74 75 61 6c 20 0d 0a 20 20 20 20 20 20 20 20 2f  tual ..        /
04d0: 2f 2f 20 74 61 62 6c 65 20 69 73 20 61 6e 20 65  // table is an e
04e0: 70 6f 6e 79 6d 6f 75 73 2d 6f 6e 6c 79 20 76 69  ponymous-only vi
04f0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a 20 20  rtual table...  
0500: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
0510: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
0520: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
0530: 2f 2f 20 54 68 65 20 64 62 20 70 61 72 61 6d 65  // The db parame
0540: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
0550: 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64   to the SQLite d
0560: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0570: 6f 6e 20 74 68 61 74 20 0d 0a 20 20 20 20 20 20  on that ..      
0580: 20 20 2f 2f 2f 20 69 73 20 65 78 65 63 75 74 69    /// is executi
0590: 6e 67 20 74 68 65 20 43 52 45 41 54 45 20 56 49  ng the CREATE VI
05a0: 52 54 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74  RTUAL TABLE stat
05b0: 65 6d 65 6e 74 2e 20 0d 0a 20 20 20 20 20 20 20  ement. ..       
05c0: 20 2f 2f 2f 20 54 68 65 20 70 41 75 78 20 61 72   /// The pAux ar
05d0: 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 63 6f  gument is the co
05e0: 70 79 20 6f 66 20 74 68 65 20 63 6c 69 65 6e 74  py of the client
05f0: 20 64 61 74 61 20 70 6f 69 6e 74 65 72 20 74 68   data pointer th
0600: 61 74 20 77 61 73 20 74 68 65 20 0d 0a 20 20 20  at was the ..   
0610: 20 20 20 20 20 2f 2f 2f 20 66 6f 75 72 74 68 20       /// fourth 
0620: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
0630: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d  sqlite3_create_m
0640: 6f 64 75 6c 65 28 29 20 6f 72 0d 0a 20 20 20 20  odule() or..    
0650: 20 20 20 20 2f 2f 2f 20 73 71 6c 69 74 65 33 5f      /// sqlite3_
0660: 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32  create_module_v2
0670: 28 29 20 63 61 6c 6c 20 74 68 61 74 20 72 65 67  () call that reg
0680: 69 73 74 65 72 65 64 20 74 68 65 20 0d 0a 20 20  istered the ..  
0690: 20 20 20 20 20 20 2f 2f 2f 20 76 69 72 74 75 61        /// virtua
06a0: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20  l table module. 
06b0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
06c0: 65 20 61 72 67 76 20 70 61 72 61 6d 65 74 65 72  e argv parameter
06d0: 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
06e0: 61 72 67 63 20 70 6f 69 6e 74 65 72 73 20 74 6f  argc pointers to
06f0: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 64   null terminated
0700: 20 73 74 72 69 6e 67 73 2e 20 0d 0a 20 20 20 20   strings. ..    
0710: 20 20 20 20 2f 2f 2f 20 54 68 65 20 66 69 72 73      /// The firs
0720: 74 20 73 74 72 69 6e 67 2c 20 61 72 67 76 5b 30  t string, argv[0
0730: 5d 2c 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  ], is the name o
0740: 66 20 74 68 65 20 6d 6f 64 75 6c 65 20 62 65 69  f the module bei
0750: 6e 67 20 69 6e 76 6f 6b 65 64 2e 20 20 20 54 68  ng invoked.   Th
0760: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d  e..        /// m
0770: 6f 64 75 6c 65 20 6e 61 6d 65 20 69 73 20 74 68  odule name is th
0780: 65 20 6e 61 6d 65 20 70 72 6f 76 69 64 65 64 20  e name provided 
0790: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
07a0: 67 75 6d 65 6e 74 20 74 6f 20 0d 0a 20 20 20 20  gument to ..    
07b0: 20 20 20 20 2f 2f 2f 20 73 71 6c 69 74 65 33 5f      /// sqlite3_
07c0: 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 29 20  create_module() 
07d0: 61 6e 64 20 61 73 20 74 68 65 20 61 72 67 75 6d  and as the argum
07e0: 65 6e 74 20 74 6f 20 74 68 65 20 55 53 49 4e 47  ent to the USING
07f0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 0d 0a   clause of the..
0800: 20 20 20 20 20 20 20 20 2f 2f 2f 20 43 52 45 41          /// CREA
0810: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
0820: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
0830: 69 73 20 72 75 6e 6e 69 6e 67 2e 0d 0a 20 20 20  is running...   
0840: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 73 65 63       /// The sec
0850: 6f 6e 64 2c 20 61 72 67 76 5b 31 5d 2c 20 69 73  ond, argv[1], is
0860: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
0870: 20 64 61 74 61 62 61 73 65 20 69 6e 20 77 68 69   database in whi
0880: 63 68 20 74 68 65 20 6e 65 77 20 76 69 72 74 75  ch the new virtu
0890: 61 6c 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e  al table is bein
08a0: 67 20 63 72 65 61 74 65 64 2e 20 54 68 65 20 64  g created. The d
08b0: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
08c0: 22 6d 61 69 6e 22 20 66 6f 72 20 74 68 65 20 70  "main" for the p
08d0: 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65 2c  rimary database,
08e0: 20 6f 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   or..        ///
08f0: 20 22 74 65 6d 70 22 20 66 6f 72 20 54 45 4d 50   "temp" for TEMP
0900: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 74 68   database, or th
0910: 65 20 6e 61 6d 65 20 67 69 76 65 6e 20 61 74 20  e name given at 
0920: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 41  the end of the A
0930: 54 54 41 43 48 0d 0a 20 20 20 20 20 20 20 20 2f  TTACH..        /
0940: 2f 2f 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  // statement for
0950: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
0960: 73 65 73 2e 20 20 54 68 65 20 74 68 69 72 64 20  ses.  The third 
0970: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
0980: 72 72 61 79 2c 20 61 72 67 76 5b 32 5d 2c 20 0d  rray, argv[2], .
0990: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 73 20  .        /// is 
09a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
09b0: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c  new virtual tabl
09c0: 65 2c 20 61 73 20 73 70 65 63 69 66 69 65 64 20  e, as specified 
09d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 54 41  following the TA
09e0: 42 4c 45 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  BLE..        ///
09f0: 20 6b 65 79 77 6f 72 64 20 69 6e 20 74 68 65 20   keyword in the 
0a00: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
0a10: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0d  ABLE statement..
0a20: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 49 66 20  .        /// If 
0a30: 70 72 65 73 65 6e 74 2c 20 74 68 65 20 66 6f 75  present, the fou
0a40: 72 74 68 20 61 6e 64 20 73 75 62 73 65 71 75 65  rth and subseque
0a50: 6e 74 20 73 74 72 69 6e 67 73 20 69 6e 20 74 68  nt strings in th
0a60: 65 20 61 72 67 76 5b 5d 20 61 72 72 61 79 20 72  e argv[] array r
0a70: 65 70 6f 72 74 20 0d 0a 20 20 20 20 20 20 20 20  eport ..        
0a80: 2f 2f 2f 20 74 68 65 20 61 72 67 75 6d 65 6e 74  /// the argument
0a90: 73 20 74 6f 20 74 68 65 20 6d 6f 64 75 6c 65 20  s to the module 
0aa0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 43 52 45 41  name in the CREA
0ab0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
0ac0: 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20   statement...   
0ad0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
0ae0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
0af0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
0b00: 2f 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  / The job of thi
0b10: 73 20 6d 65 74 68 6f 64 20 69 73 20 74 6f 20 63  s method is to c
0b20: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e 65 77  onstruct the new
0b30: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f   virtual table o
0b40: 62 6a 65 63 74 0d 0a 20 20 20 20 20 20 20 20 2f  bject..        /
0b50: 2f 2f 20 28 61 6e 20 73 71 6c 69 74 65 33 5f 76  // (an sqlite3_v
0b60: 74 61 62 20 6f 62 6a 65 63 74 29 20 61 6e 64 20  tab object) and 
0b70: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0b80: 20 74 6f 20 69 74 20 69 6e 20 2a 70 70 56 54 61   to it in *ppVTa
0b90: 62 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  b...        /// 
0ba0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
0bb0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
0bc0: 20 20 20 20 20 2f 2f 2f 20 41 73 20 70 61 72 74       /// As part
0bd0: 20 6f 66 20 74 68 65 20 74 61 73 6b 20 6f 66 20   of the task of 
0be0: 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 73  creating a new s
0bf0: 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
0c00: 63 74 75 72 65 2c 20 74 68 69 73 20 0d 0a 20 20  cture, this ..  
0c10: 20 20 20 20 20 20 2f 2f 2f 20 6d 65 74 68 6f 64        /// method
0c20: 20 3c 75 3e 6d 75 73 74 3c 2f 75 3e 20 69 6e 76   <u>must</u> inv
0c30: 6f 6b 65 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  oke sqlite3_decl
0c40: 61 72 65 5f 76 74 61 62 28 29 20 74 6f 20 74 65  are_vtab() to te
0c50: 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 0d 0a  ll the SQLite ..
0c60: 20 20 20 20 20 20 20 20 2f 2f 2f 20 63 6f 72 65          /// core
0c70: 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d   about the colum
0c80: 6e 73 20 61 6e 64 20 64 61 74 61 74 79 70 65 73  ns and datatypes
0c90: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
0ca0: 74 61 62 6c 65 2e 20 0d 0a 20 20 20 20 20 20 20  table. ..       
0cb0: 20 2f 2f 2f 20 54 68 65 20 73 71 6c 69 74 65 33   /// The sqlite3
0cc0: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20  _declare_vtab() 
0cd0: 41 50 49 20 68 61 73 20 74 68 65 20 66 6f 6c 6c  API has the foll
0ce0: 6f 77 69 6e 67 20 70 72 6f 74 6f 74 79 70 65 3a  owing prototype:
0cf0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
0d00: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
0d10: 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d  // <para><code>.
0d20: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74  .        /// int
0d30: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
0d40: 5f 76 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64  _vtab(sqlite3 *d
0d50: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
0d60: 43 72 65 61 74 65 54 61 62 6c 65 29 0d 0a 20 20  CreateTable)..  
0d70: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65        /// </code
0d80: 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  ></para>..      
0d90: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
0da0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 66 69        /// The fi
0db0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
0dc0: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
0dd0: 76 74 61 62 28 29 20 6d 75 73 74 20 62 65 20 74  vtab() must be t
0de0: 68 65 20 73 61 6d 65 20 0d 0a 20 20 20 20 20 20  he same ..      
0df0: 20 20 2f 2f 2f 20 64 61 74 61 62 61 73 65 20 63    /// database c
0e00: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
0e10: 72 20 61 73 20 74 68 65 20 66 69 72 73 74 20 70  r as the first p
0e20: 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
0e30: 20 6d 65 74 68 6f 64 2e 0d 0a 20 20 20 20 20 20   method...      
0e40: 20 20 2f 2f 2f 20 54 68 65 20 73 65 63 6f 6e 64    /// The second
0e50: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c   argument to sql
0e60: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
0e70: 62 28 29 20 6d 75 73 74 20 61 20 7a 65 72 6f 2d  b() must a zero-
0e80: 74 65 72 6d 69 6e 61 74 65 64 20 0d 0a 20 20 20  terminated ..   
0e90: 20 20 20 20 20 2f 2f 2f 20 55 54 46 2d 38 20 73       /// UTF-8 s
0ea0: 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 74 61  tring that conta
0eb0: 69 6e 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ins a well-forme
0ec0: 64 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  d CREATE TABLE s
0ed0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 0d 0a  tatement that ..
0ee0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 64 65 66 69          /// defi
0ef0: 6e 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  nes the columns 
0f00: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  in the virtual t
0f10: 61 62 6c 65 20 61 6e 64 20 74 68 65 69 72 20 64  able and their d
0f20: 61 74 61 20 74 79 70 65 73 2e 20 0d 0a 20 20 20  ata types. ..   
0f30: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 6d       /// The nam
0f40: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  e of the table i
0f50: 6e 20 74 68 69 73 20 43 52 45 41 54 45 20 54 41  n this CREATE TA
0f60: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  BLE statement is
0f70: 20 69 67 6e 6f 72 65 64 2c 20 0d 0a 20 20 20 20   ignored, ..    
0f80: 20 20 20 20 2f 2f 2f 20 61 73 20 61 72 65 20 61      /// as are a
0f90: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ll constraints. 
0fa0: 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Only the column 
0fb0: 6e 61 6d 65 73 20 61 6e 64 20 64 61 74 61 74 79  names and dataty
0fc0: 70 65 73 20 6d 61 74 74 65 72 2e 0d 0a 20 20 20  pes matter...   
0fd0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 43 52 45       /// The CRE
0fe0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
0ff0: 65 6e 74 20 73 74 72 69 6e 67 20 6e 65 65 64 20  ent string need 
1000: 6e 6f 74 20 74 6f 20 62 65 20 0d 0a 20 20 20 20  not to be ..    
1010: 20 20 20 20 2f 2f 2f 20 68 65 6c 64 20 69 6e 20      /// held in 
1020: 70 65 72 73 69 73 74 65 6e 74 20 6d 65 6d 6f 72  persistent memor
1030: 79 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 63  y.  The string c
1040: 61 6e 20 62 65 0d 0a 20 20 20 20 20 20 20 20 2f  an be..        /
1050: 2f 2f 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61  // deallocated a
1060: 6e 64 2f 6f 72 20 72 65 75 73 65 64 20 61 73 20  nd/or reused as 
1070: 73 6f 6f 6e 20 61 73 20 74 68 65 20 73 71 6c 69  soon as the sqli
1080: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
1090: 28 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ()..        /// 
10a0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
10b0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
10c0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
10d0: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
10e0: 20 20 20 2f 2f 2f 20 54 68 65 20 78 43 72 65 61     /// The xCrea
10f0: 74 65 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e  te method need n
1100: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ot initialize th
1110: 65 20 70 4d 6f 64 75 6c 65 2c 20 6e 52 65 66 2c  e pModule, nRef,
1120: 20 61 6e 64 20 7a 45 72 72 4d 73 67 0d 0a 20 20   and zErrMsg..  
1130: 20 20 20 20 20 20 2f 2f 2f 20 66 69 65 6c 64 73        /// fields
1140: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
1150: 76 74 61 62 20 6f 62 6a 65 63 74 2e 20 20 54 68  vtab object.  Th
1160: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 69  e SQLite core wi
1170: 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20  ll take care of 
1180: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
1190: 61 74 20 63 68 6f 72 65 2e 0d 0a 20 20 20 20 20  at chore...     
11a0: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
11b0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
11c0: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
11d0: 54 68 65 20 78 43 72 65 61 74 65 20 73 68 6f 75  The xCreate shou
11e0: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ld return SQLITE
11f0: 5f 4f 4b 20 69 66 20 69 74 20 69 73 20 73 75 63  _OK if it is suc
1200: 63 65 73 73 66 75 6c 20 69 6e 20 0d 0a 20 20 20  cessful in ..   
1210: 20 20 20 20 20 2f 2f 2f 20 63 72 65 61 74 69 6e       /// creatin
1220: 67 20 74 68 65 20 6e 65 77 20 76 69 72 74 75 61  g the new virtua
1230: 6c 20 74 61 62 6c 65 2c 20 6f 72 20 53 51 4c 49  l table, or SQLI
1240: 54 45 5f 45 52 52 4f 52 20 69 66 20 69 74 20 69  TE_ERROR if it i
1250: 73 20 6e 6f 74 20 73 75 63 63 65 73 73 66 75 6c  s not successful
1260: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 49  ...        /// I
1270: 66 20 6e 6f 74 20 73 75 63 63 65 73 73 66 75 6c  f not successful
1280: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74  , the sqlite3_vt
1290: 61 62 20 73 74 72 75 63 74 75 72 65 20 6d 75 73  ab structure mus
12a0: 74 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  t not be allocat
12b0: 65 64 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ed. ..        //
12c0: 2f 20 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  / An error messa
12d0: 67 65 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c  ge may optionall
12e0: 79 20 62 65 20 72 65 74 75 72 6e 65 64 20 69 6e  y be returned in
12f0: 20 2a 70 7a 45 72 72 20 69 66 20 75 6e 73 75 63   *pzErr if unsuc
1300: 63 65 73 73 66 75 6c 2e 0d 0a 20 20 20 20 20 20  cessful...      
1310: 20 20 2f 2f 2f 20 53 70 61 63 65 20 74 6f 20 68    /// Space to h
1320: 6f 6c 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65  old the error me
1330: 73 73 61 67 65 20 73 74 72 69 6e 67 20 6d 75 73  ssage string mus
1340: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 75  t be allocated u
1350: 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 2f 2f  sing..        //
1360: 2f 20 61 6e 20 53 51 4c 69 74 65 20 6d 65 6d 6f  / an SQLite memo
1370: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75  ry allocation fu
1380: 6e 63 74 69 6f 6e 20 6c 69 6b 65 20 0d 0a 20 20  nction like ..  
1390: 20 20 20 20 20 20 2f 2f 2f 20 73 71 6c 69 74 65        /// sqlite
13a0: 33 5f 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 73 71  3_malloc() or sq
13b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 29 20  lite3_mprintf() 
13c0: 61 73 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  as the SQLite co
13d0: 72 65 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20 20  re will..       
13e0: 20 2f 2f 2f 20 61 74 74 65 6d 70 74 20 74 6f 20   /// attempt to 
13f0: 66 72 65 65 20 74 68 65 20 73 70 61 63 65 20 75  free the space u
1400: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
1410: 65 28 29 20 61 66 74 65 72 20 74 68 65 20 65 72  e() after the er
1420: 72 6f 72 20 68 61 73 0d 0a 20 20 20 20 20 20 20  ror has..       
1430: 20 2f 2f 2f 20 62 65 65 6e 20 72 65 70 6f 72 74   /// been report
1440: 65 64 20 75 70 20 74 6f 20 74 68 65 20 61 70 70  ed up to the app
1450: 6c 69 63 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20  lication...     
1460: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
1470: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
1480: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
1490: 49 66 20 74 68 65 20 78 43 72 65 61 74 65 20 6d  If the xCreate m
14a0: 65 74 68 6f 64 20 69 73 20 6f 6d 69 74 74 65 64  ethod is omitted
14b0: 20 28 6c 65 66 74 20 61 73 20 61 20 4e 55 4c 4c   (left as a NULL
14c0: 20 70 6f 69 6e 74 65 72 29 20 74 68 65 6e 20 74   pointer) then t
14d0: 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  he..        /// 
14e0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73  virtual table is
14f0: 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 2d 6f 6e   an eponymous-on
1500: 6c 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ly virtual table
1510: 2e 20 20 4e 65 77 20 69 6e 73 74 61 6e 63 65 73  .  New instances
1520: 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   of..        ///
1530: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
1540: 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 72 65  le cannot be cre
1550: 61 74 65 64 20 75 73 69 6e 67 20 43 52 45 41 54  ated using CREAT
1560: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
1570: 61 6e 64 20 74 68 65 0d 0a 20 20 20 20 20 20 20  and the..       
1580: 20 2f 2f 2f 20 76 69 72 74 75 61 6c 20 74 61 62   /// virtual tab
1590: 6c 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  le can only be u
15a0: 73 65 64 20 76 69 61 20 69 74 73 20 6d 6f 64 75  sed via its modu
15b0: 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20  le name...      
15c0: 20 20 2f 2f 2f 20 4e 6f 74 65 20 74 68 61 74 20    /// Note that 
15d0: 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 73 20  SQLite versions 
15e0: 70 72 69 6f 72 20 74 6f 20 33 2e 39 2e 30 20 64  prior to 3.9.0 d
15f0: 6f 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  o not understand
1600: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 65 70  ..        /// ep
1610: 6f 6e 79 6d 6f 75 73 2d 6f 6e 6c 79 20 76 69 72  onymous-only vir
1620: 74 75 61 6c 20 74 61 62 6c 65 73 20 61 6e 64 20  tual tables and 
1630: 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 20 69 66  will segfault if
1640: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
1650: 61 64 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ade..        ///
1660: 20 74 6f 20 43 52 45 41 54 45 20 56 49 52 54 55   to CREATE VIRTU
1670: 41 4c 20 54 41 42 4c 45 20 6f 6e 20 61 6e 20 65  AL TABLE on an e
1680: 70 6f 6e 79 6d 6f 75 73 2d 6f 6e 6c 79 20 76 69  ponymous-only vi
1690: 72 74 75 61 6c 20 74 61 62 6c 65 20 62 65 63 61  rtual table beca
16a0: 75 73 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  use..        ///
16b0: 20 74 68 65 20 78 43 72 65 61 74 65 20 6d 65 74   the xCreate met
16c0: 68 6f 64 20 77 61 73 20 6e 6f 74 20 63 68 65 63  hod was not chec
16d0: 6b 65 64 20 66 6f 72 20 6e 75 6c 6c 2e 0d 0a 20  ked for null... 
16e0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
16f0: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
1700: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
1710: 2f 2f 2f 20 49 66 20 74 68 65 20 78 43 72 65 61  /// If the xCrea
1720: 74 65 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65  te method is the
1730: 20 65 78 61 63 74 20 73 61 6d 65 20 70 6f 69 6e   exact same poin
1740: 74 65 72 20 61 73 20 74 68 65 20 78 43 6f 6e 6e  ter as the xConn
1750: 65 63 74 20 6d 65 74 68 6f 64 2c 0d 0a 20 20 20  ect method,..   
1760: 20 20 20 20 20 2f 2f 2f 20 74 68 61 74 20 69 6e       /// that in
1770: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1780: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64   virtual table d
1790: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
17a0: 69 6e 69 74 69 61 6c 69 7a 65 20 62 61 63 6b 69  initialize backi
17b0: 6e 67 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ng..        /// 
17c0: 73 74 6f 72 65 2e 20 20 53 75 63 68 20 61 20 76  store.  Such a v
17d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 61 6e  irtual table can
17e0: 20 62 65 20 75 73 65 64 20 61 73 20 61 6e 20 65   be used as an e
17f0: 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c  ponymous virtual
1800: 20 74 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20   table..        
1810: 2f 2f 2f 20 6f 72 20 61 73 20 61 20 6e 61 6d 65  /// or as a name
1820: 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  d virtual table 
1830: 75 73 69 6e 67 20 43 52 45 41 54 45 20 56 49 52  using CREATE VIR
1840: 54 55 41 4c 20 54 41 42 4c 45 20 6f 72 20 62 6f  TUAL TABLE or bo
1850: 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  th...        ///
1860: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
1870: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
1880: 20 20 20 20 20 20 2f 2f 2f 20 49 66 20 61 20 63        /// If a c
1890: 6f 6c 75 6d 6e 20 64 61 74 61 74 79 70 65 20 63  olumn datatype c
18a0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 70 65 63  ontains the spec
18b0: 69 61 6c 20 6b 65 79 77 6f 72 64 20 22 48 49 44  ial keyword "HID
18c0: 44 45 4e 22 0d 0a 20 20 20 20 20 20 20 20 2f 2f  DEN"..        //
18d0: 2f 20 28 69 6e 20 61 6e 79 20 63 6f 6d 62 69 6e  / (in any combin
18e0: 61 74 69 6f 6e 20 6f 66 20 75 70 70 65 72 20 61  ation of upper a
18f0: 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 6c 65  nd lower case le
1900: 74 74 65 72 73 29 20 74 68 65 6e 20 74 68 61 74  tters) then that
1910: 20 6b 65 79 77 6f 72 64 0d 0a 20 20 20 20 20 20   keyword..      
1920: 20 20 2f 2f 2f 20 69 74 20 69 73 20 6f 6d 69 74    /// it is omit
1930: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ted from the col
1940: 75 6d 6e 20 64 61 74 61 74 79 70 65 20 6e 61 6d  umn datatype nam
1950: 65 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e  e and the column
1960: 20 69 73 20 6d 61 72 6b 65 64 20 0d 0a 20 20 20   is marked ..   
1970: 20 20 20 20 20 2f 2f 2f 20 61 73 20 61 20 68 69       /// as a hi
1980: 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 69 6e 74 65  dden column inte
1990: 72 6e 61 6c 6c 79 2e 20 0d 0a 20 20 20 20 20 20  rnally. ..      
19a0: 20 20 2f 2f 2f 20 41 20 68 69 64 64 65 6e 20 63    /// A hidden c
19b0: 6f 6c 75 6d 6e 20 64 69 66 66 65 72 73 20 66 72  olumn differs fr
19c0: 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 63 6f 6c 75  om a normal colu
19d0: 6d 6e 20 69 6e 20 74 68 72 65 65 20 72 65 73 70  mn in three resp
19e0: 65 63 74 73 3a 0d 0a 20 20 20 20 20 20 20 20 2f  ects:..        /
19f0: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
1a00: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
1a10: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43          /// <![C
1a20: 44 41 54 41 5b 3c 75 6c 3e 5d 5d 3e 0d 0a 20 20  DATA[<ul>]]>..  
1a30: 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41        /// <![CDA
1a40: 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 48 69 64 64 65  TA[<li>]]> Hidde
1a50: 6e 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f  n columns are no
1a60: 74 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65 20  t listed in the 
1a70: 64 61 74 61 73 65 74 20 72 65 74 75 72 6e 65 64  dataset returned
1a80: 20 62 79 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f   by ..        //
1a90: 2f 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74  /      "PRAGMA t
1aa0: 61 62 6c 65 5f 69 6e 66 6f 22 2c 0d 0a 20 20 20  able_info",..   
1ab0: 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54       /// <![CDAT
1ac0: 41 5b 3c 2f 6c 69 3e 5d 5d 3e 3c 21 5b 43 44 41  A[</li>]]><![CDA
1ad0: 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 48 69 64 64 65  TA[<li>]]> Hidde
1ae0: 6e 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f  n columns are no
1af0: 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  t included in th
1b00: 65 20 65 78 70 61 6e 73 69 6f 6e 20 6f 66 20 61  e expansion of a
1b10: 20 22 2a 22 0d 0a 20 20 20 20 20 20 20 20 2f 2f   "*"..        //
1b20: 2f 20 20 20 20 20 20 65 78 70 72 65 73 73 69 6f  /      expressio
1b30: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
1b40: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 2c  set of a SELECT,
1b50: 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 2f 2f   and..        //
1b60: 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 6c 69 3e  / <![CDATA[</li>
1b70: 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 6c 69 3e  ]]><![CDATA[<li>
1b80: 5d 5d 3e 20 48 69 64 64 65 6e 20 63 6f 6c 75 6d  ]]> Hidden colum
1b90: 6e 73 20 61 72 65 20 6e 6f 74 20 69 6e 63 6c 75  ns are not inclu
1ba0: 64 65 64 20 69 6e 20 74 68 65 20 69 6d 70 6c 69  ded in the impli
1bb0: 63 69 74 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20  cit column-list 
1bc0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
1bd0: 20 20 20 75 73 65 64 20 62 79 20 61 6e 20 49 4e     used by an IN
1be0: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 74  SERT statement t
1bf0: 68 61 74 20 6c 61 63 6b 73 20 61 6e 20 65 78 70  hat lacks an exp
1c00: 6c 69 63 69 74 20 63 6f 6c 75 6d 6e 2d 6c 69 73  licit column-lis
1c10: 74 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  t. ..        ///
1c20: 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 6c 69 3e 5d   <![CDATA[</li>]
1c30: 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 2f 75 6c 3e  ]><![CDATA[</ul>
1c40: 5d 5d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ]]>..        ///
1c50: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
1c60: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
1c70: 20 20 20 20 20 20 2f 2f 2f 20 46 6f 72 20 65 78        /// For ex
1c80: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 66 6f  ample, if the fo
1c90: 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 69 73 20 70  llowing SQL is p
1ca0: 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
1cb0: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 3a  _declare_vtab():
1cc0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
1cd0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
1ce0: 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d  // <para><code>.
1cf0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 43 52 45  .        /// CRE
1d00: 41 54 45 20 54 41 42 4c 45 20 78 28 61 20 48 49  ATE TABLE x(a HI
1d10: 44 44 45 4e 20 56 41 52 43 48 41 52 28 31 32 29  DDEN VARCHAR(12)
1d20: 2c 20 62 20 49 4e 54 45 47 45 52 2c 20 63 20 49  , b INTEGER, c I
1d30: 4e 54 45 47 45 52 20 48 69 64 64 65 6e 29 3b 0d  NTEGER Hidden);.
1d40: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63  .        /// </c
1d50: 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  ode></para>..   
1d60: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
1d70: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
1d80: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  n the virtual ta
1d90: 62 6c 65 20 77 6f 75 6c 64 20 62 65 20 63 72 65  ble would be cre
1da0: 61 74 65 64 20 77 69 74 68 20 74 77 6f 20 68 69  ated with two hi
1db0: 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 2c 0d 0a 20  dden columns,.. 
1dc0: 20 20 20 20 20 20 20 2f 2f 2f 20 61 6e 64 20 77         /// and w
1dd0: 69 74 68 20 64 61 74 61 74 79 70 65 73 20 6f 66  ith datatypes of
1de0: 20 22 56 41 52 43 48 41 52 28 31 32 29 22 20 61   "VARCHAR(12)" a
1df0: 6e 64 20 22 49 4e 54 45 47 45 52 22 2e 0d 0a 20  nd "INTEGER"... 
1e00: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
1e10: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
1e20: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
1e30: 2f 2f 2f 20 41 6e 20 65 78 61 6d 70 6c 65 20 75  /// An example u
1e40: 73 65 20 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c  se of hidden col
1e50: 75 6d 6e 73 20 63 61 6e 20 62 65 20 73 65 65 6e  umns can be seen
1e60: 20 69 6e 20 74 68 65 20 46 54 53 33 20 76 69 72   in the FTS3 vir
1e70: 74 75 61 6c 20 0d 0a 20 20 20 20 20 20 20 20 2f  tual ..        /
1e80: 2f 2f 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65  // table impleme
1e90: 6e 74 61 74 69 6f 6e 2c 20 77 68 65 72 65 20 65  ntation, where e
1ea0: 76 65 72 79 20 46 54 53 20 76 69 72 74 75 61 6c  very FTS virtual
1eb0: 20 74 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20   table..        
1ec0: 2f 2f 2f 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  /// contains an 
1ed0: 46 54 53 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d  FTS hidden colum
1ee0: 6e 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  n that is used t
1ef0: 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69  o pass informati
1f00: 6f 6e 20 66 72 6f 6d 20 74 68 65 0d 0a 20 20 20  on from the..   
1f10: 20 20 20 20 20 2f 2f 2f 20 76 69 72 74 75 61 6c       /// virtual
1f20: 20 74 61 62 6c 65 20 69 6e 74 6f 20 46 54 53 20   table into FTS 
1f30: 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69  auxiliary functi
1f40: 6f 6e 73 20 61 6e 64 20 74 6f 20 74 68 65 20 46  ons and to the F
1f50: 54 53 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f  TS MATCH operato
1f60: 72 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  r...        /// 
1f70: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
1f80: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
1f90: 20 20 20 20 20 2f 2f 2f 20 41 20 76 69 72 74 75       /// A virtu
1fa0: 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f  al table that co
1fb0: 6e 74 61 69 6e 73 20 68 69 64 64 65 6e 20 63 6f  ntains hidden co
1fc0: 6c 75 6d 6e 73 20 63 61 6e 20 62 65 20 75 73 65  lumns can be use
1fd0: 64 20 6c 69 6b 65 0d 0a 20 20 20 20 20 20 20 20  d like..        
1fe0: 2f 2f 2f 20 61 20 74 61 62 6c 65 2d 76 61 6c 75  /// a table-valu
1ff0: 65 64 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  ed function in t
2000: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2010: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
2020: 6d 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 2f  ment...        /
2030: 2f 2f 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  // The arguments
2040: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2d 76 61   to the table-va
2050: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 62 65  lued function be
2060: 63 6f 6d 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  come constraints
2070: 20 6f 6e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f   on ..        //
2080: 2f 20 74 68 65 20 48 49 44 44 45 4e 20 63 6f 6c  / the HIDDEN col
2090: 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 72 74  umns of the virt
20a0: 75 61 6c 20 74 61 62 6c 65 2e 0d 0a 20 20 20 20  ual table...    
20b0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
20c0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
20d0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
20e0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
20f0: 65 20 22 67 65 6e 65 72 61 74 65 5f 73 65 72 69  e "generate_seri
2100: 65 73 22 20 65 78 74 65 6e 73 69 6f 6e 20 28 6c  es" extension (l
2110: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20  ocated in the.. 
2120: 20 20 20 20 20 20 20 2f 2f 2f 20 65 78 74 2f 6d         /// ext/m
2130: 69 73 63 2f 73 65 72 69 65 73 2e 63 0d 0a 20 20  isc/series.c..  
2140: 20 20 20 20 20 20 2f 2f 2f 20 66 69 6c 65 20 69        /// file i
2150: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 72 65  n the source tre
2160: 65 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e)..        /// 
2170: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 70  implements an ep
2180: 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20  onymous virtual 
2190: 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 66  table with the f
21a0: 6f 6c 6c 6f 77 69 6e 67 20 73 63 68 65 6d 61 3a  ollowing schema:
21b0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
21c0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
21d0: 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d  // <para><code>.
21e0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 43 52 45  .        /// CRE
21f0: 41 54 45 20 54 41 42 4c 45 20 67 65 6e 65 72 61  ATE TABLE genera
2200: 74 65 5f 73 65 72 69 65 73 28 0d 0a 20 20 20 20  te_series(..    
2210: 20 20 20 20 2f 2f 2f 20 20 20 76 61 6c 75 65 2c      ///   value,
2220: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
2230: 73 74 61 72 74 20 48 49 44 44 45 4e 2c 0d 0a 20  start HIDDEN,.. 
2240: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 73 74 6f         ///   sto
2250: 70 20 48 49 44 44 45 4e 2c 0d 0a 20 20 20 20 20  p HIDDEN,..     
2260: 20 20 20 2f 2f 2f 20 20 20 73 74 65 70 20 48 49     ///   step HI
2270: 44 44 45 4e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  DDEN..        //
2280: 2f 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  / );..        //
2290: 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e  / </code></para>
22a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
22b0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
22c0: 2f 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 6f  / The sqlite3_mo
22d0: 64 75 6c 65 2e 78 42 65 73 74 49 6e 64 65 78 20  dule.xBestIndex 
22e0: 6d 65 74 68 6f 64 20 69 6e 20 74 68 65 20 69 6d  method in the im
22f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2300: 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 2f 2f  this..        //
2310: 2f 20 74 61 62 6c 65 20 63 68 65 63 6b 73 20 66  / table checks f
2320: 6f 72 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  or equality cons
2330: 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20  traints against 
2340: 74 68 65 20 48 49 44 44 45 4e 20 63 6f 6c 75 6d  the HIDDEN colum
2350: 6e 73 2c 20 61 6e 64 20 75 73 65 73 0d 0a 20 20  ns, and uses..  
2360: 20 20 20 20 20 20 2f 2f 2f 20 74 68 6f 73 65 20        /// those 
2370: 61 73 20 69 6e 70 75 74 20 70 61 72 61 6d 65 74  as input paramet
2380: 65 72 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ers to determine
2390: 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 69 6e   the range of in
23a0: 74 65 67 65 72 20 22 76 61 6c 75 65 22 20 6f 75  teger "value" ou
23b0: 74 70 75 74 73 0d 0a 20 20 20 20 20 20 20 20 2f  tputs..        /
23c0: 2f 2f 20 74 6f 20 67 65 6e 65 72 61 74 65 2e 20  // to generate. 
23d0: 20 52 65 61 73 6f 6e 61 62 6c 65 20 64 65 66 61   Reasonable defa
23e0: 75 6c 74 73 20 61 72 65 20 75 73 65 64 20 66 6f  ults are used fo
23f0: 72 20 61 6e 79 20 75 6e 63 6f 6e 73 74 72 61 69  r any unconstrai
2400: 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 0d 0a 20 20  ned columns...  
2410: 20 20 20 20 20 20 2f 2f 2f 20 46 6f 72 20 65 78        /// For ex
2420: 61 6d 70 6c 65 2c 20 74 6f 20 6c 69 73 74 20 61  ample, to list a
2430: 6c 6c 20 69 6e 74 65 67 65 72 73 20 62 65 74 77  ll integers betw
2440: 65 65 6e 20 35 20 61 6e 64 20 35 30 3a 0d 0a 20  een 5 and 50:.. 
2450: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
2460: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
2470: 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20  <para><code>..  
2480: 20 20 20 20 20 20 2f 2f 2f 20 53 45 4c 45 43 54        /// SELECT
2490: 20 76 61 6c 75 65 20 46 52 4f 4d 20 67 65 6e 65   value FROM gene
24a0: 72 61 74 65 5f 73 65 72 69 65 73 28 35 2c 35 30  rate_series(5,50
24b0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  );..        /// 
24c0: 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a  </code></para>..
24d0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
24e0: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
24f0: 54 68 65 20 70 72 65 76 69 6f 75 73 20 71 75 65  The previous que
2500: 72 79 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  ry is equivalent
2510: 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2520: 67 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  g:..        /// 
2530: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
2540: 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65   /// <para><code
2550: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 53  >..        /// S
2560: 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d  ELECT value FROM
2570: 20 67 65 6e 65 72 61 74 65 5f 73 65 72 69 65 73   generate_series
2580: 20 57 48 45 52 45 20 73 74 61 72 74 3d 35 20 41   WHERE start=5 A
2590: 4e 44 20 73 74 6f 70 3d 35 30 3b 0d 0a 20 20 20  ND stop=50;..   
25a0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e       /// </code>
25b0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
25c0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
25d0: 20 20 20 20 20 2f 2f 2f 20 41 72 67 75 6d 65 6e       /// Argumen
25e0: 74 73 20 6f 6e 20 74 68 65 20 76 69 72 74 75 61  ts on the virtua
25f0: 6c 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 72 65  l table name are
2600: 20 6d 61 74 63 68 65 64 20 74 6f 20 68 69 64 64   matched to hidd
2610: 65 6e 20 63 6f 6c 75 6d 6e 73 0d 0a 20 20 20 20  en columns..    
2620: 20 20 20 20 2f 2f 2f 20 69 6e 20 6f 72 64 65 72      /// in order
2630: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
2640: 20 61 72 67 75 6d 65 6e 74 73 20 63 61 6e 20 62   arguments can b
2650: 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 0d  e less than the.
2660: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6e 75 6d  .        /// num
2670: 62 65 72 20 6f 66 20 68 69 64 64 65 6e 20 63 6f  ber of hidden co
2680: 6c 75 6d 6e 73 2c 20 69 6e 20 77 68 69 63 68 20  lumns, in which 
2690: 63 61 73 65 20 74 68 65 20 6c 61 74 74 65 72 20  case the latter 
26a0: 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 61  hidden columns a
26b0: 72 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  re..        /// 
26c0: 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2e 20 20  unconstrained.  
26d0: 48 6f 77 65 76 65 72 2c 20 61 6e 20 65 72 72 6f  However, an erro
26e0: 72 20 72 65 73 75 6c 74 73 20 69 66 20 74 68 65  r results if the
26f0: 72 65 20 61 72 65 20 6d 6f 72 65 20 61 72 67 75  re are more argu
2700: 6d 65 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 2f  ments..        /
2710: 2f 2f 20 74 68 61 6e 20 74 68 65 72 65 20 61 72  // than there ar
2720: 65 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73  e hidden columns
2730: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
2740: 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  table...        
2750: 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
2760: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
2770: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 42 65 67  .        /// Beg
2780: 69 6e 6e 69 6e 67 20 77 69 74 68 20 53 51 4c 69  inning with SQLi
2790: 74 65 20 76 65 72 73 69 6f 6e 20 33 2e 31 34 2e  te version 3.14.
27a0: 30 2c 20 74 68 65 20 43 52 45 41 54 45 20 54 41  0, the CREATE TA
27b0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  BLE statement th
27c0: 61 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  at..        /// 
27d0: 69 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 73  is passed into s
27e0: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
27f0: 74 61 62 28 29 20 6d 61 79 20 63 6f 6e 74 61 69  tab() may contai
2800: 6e 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  n a WITHOUT ROWI
2810: 44 20 63 6c 61 75 73 65 2e 0d 0a 20 20 20 20 20  D clause...     
2820: 20 20 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 75     /// This is u
2830: 73 65 66 75 6c 20 66 6f 72 20 63 61 73 65 73 20  seful for cases 
2840: 77 68 65 72 65 20 74 68 65 20 76 69 72 74 75 61  where the virtua
2850: 6c 20 74 61 62 6c 65 20 72 6f 77 73 20 0d 0a 20  l table rows .. 
2860: 20 20 20 20 20 20 20 2f 2f 2f 20 63 61 6e 6e 6f         /// canno
2870: 74 20 65 61 73 69 6c 79 20 62 65 20 6d 61 70 70  t easily be mapp
2880: 65 64 20 69 6e 74 6f 20 75 6e 69 71 75 65 20 69  ed into unique i
2890: 6e 74 65 67 65 72 73 2e 20 20 41 20 43 52 45 41  ntegers.  A CREA
28a0: 54 45 20 54 41 42 4c 45 0d 0a 20 20 20 20 20 20  TE TABLE..      
28b0: 20 20 2f 2f 2f 20 73 74 61 74 65 6d 65 6e 74 20    /// statement 
28c0: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 57 49  that includes WI
28d0: 54 48 4f 55 54 20 52 4f 57 49 44 20 6d 75 73 74  THOUT ROWID must
28e0: 20 64 65 66 69 6e 65 20 6f 6e 65 20 6f 72 20 6d   define one or m
28f0: 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 61 73 0d 0a  ore columns as..
2900: 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20          /// the 
2910: 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 45 76  PRIMARY KEY.  Ev
2920: 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ery column of th
2930: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 75  e PRIMARY KEY mu
2940: 73 74 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20  st individually 
2950: 62 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  be..        /// 
2960: 4e 4f 54 20 4e 55 4c 4c 20 61 6e 64 20 61 6c 6c  NOT NULL and all
2970: 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 65 61 63   columns for eac
2980: 68 20 72 6f 77 20 6d 75 73 74 20 62 65 20 63 6f  h row must be co
2990: 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e 69 71 75  llectively uniqu
29a0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
29b0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
29c0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
29d0: 20 20 20 20 20 2f 2f 2f 20 4e 6f 74 65 20 74 68       /// Note th
29e0: 61 74 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e  at SQLite does n
29f0: 6f 74 20 65 6e 66 6f 72 63 65 20 74 68 65 20 50  ot enforce the P
2a00: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 61  RIMARY KEY for a
2a10: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0d 0a   WITHOUT ROWID..
2a20: 20 20 20 20 20 20 20 20 2f 2f 2f 20 76 69 72 74          /// virt
2a30: 75 61 6c 20 74 61 62 6c 65 2e 20 20 45 6e 66 6f  ual table.  Enfo
2a40: 72 63 65 6d 65 6e 74 20 69 73 20 74 68 65 20 72  rcement is the r
2a50: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
2a60: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0d   the underlying.
2a70: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 76 69 72  .        /// vir
2a80: 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65  tual table imple
2a90: 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20  mentation.  But 
2aa0: 53 51 4c 69 74 65 20 64 6f 65 73 20 61 73 73 75  SQLite does assu
2ab0: 6d 65 20 74 68 61 74 20 74 68 65 20 50 52 49 4d  me that the PRIM
2ac0: 41 52 59 20 4b 45 59 0d 0a 20 20 20 20 20 20 20  ARY KEY..       
2ad0: 20 2f 2f 2f 20 63 6f 6e 73 74 72 61 69 6e 74 20   /// constraint 
2ae0: 69 73 20 76 61 6c 69 64 20 2d 20 74 68 61 74 20  is valid - that 
2af0: 74 68 65 20 69 64 65 6e 74 69 66 69 65 64 20 63  the identified c
2b00: 6f 6c 75 6d 6e 73 20 72 65 61 6c 6c 79 20 61 72  olumns really ar
2b10: 65 20 55 4e 49 51 55 45 20 61 6e 64 0d 0a 20 20  e UNIQUE and..  
2b20: 20 20 20 20 20 20 2f 2f 2f 20 4e 4f 54 20 4e 55        /// NOT NU
2b30: 4c 4c 20 2d 20 61 6e 64 20 69 74 20 75 73 65 73  LL - and it uses
2b40: 20 74 68 61 74 20 61 73 73 75 6d 70 74 69 6f 6e   that assumption
2b50: 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 71 75 65   to optimize que
2b60: 72 69 65 73 20 61 67 61 69 6e 73 74 20 74 68 65  ries against the
2b70: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 76 69  ..        /// vi
2b80: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a 20 20  rtual table...  
2b90: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
2ba0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
2bb0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
2bc0: 2f 2f 20 54 68 65 20 72 6f 77 69 64 20 63 6f 6c  // The rowid col
2bd0: 75 6d 6e 20 69 73 20 6e 6f 74 20 61 63 63 65 73  umn is not acces
2be0: 73 69 62 6c 65 20 6f 6e 20 61 0d 0a 20 20 20 20  sible on a..    
2bf0: 20 20 20 20 2f 2f 2f 20 57 49 54 48 4f 55 54 20      /// WITHOUT 
2c00: 52 4f 57 49 44 20 76 69 72 74 75 61 6c 20 74 61  ROWID virtual ta
2c10: 62 6c 65 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  ble (of course).
2c20: 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 73    Furthermore, s
2c30: 69 6e 63 65 20 74 68 65 0d 0a 20 20 20 20 20 20  ince the..      
2c40: 20 20 2f 2f 2f 20 78 55 70 64 61 74 65 20 6d 65    /// xUpdate me
2c50: 74 68 6f 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  thod depends on 
2c60: 68 61 76 69 6e 67 20 61 20 76 61 6c 69 64 20 72  having a valid r
2c70: 6f 77 69 64 2c 20 74 68 65 20 78 55 70 64 61 74  owid, the xUpdat
2c80: 65 20 6d 65 74 68 6f 64 20 0d 0a 20 20 20 20 20  e method ..     
2c90: 20 20 20 2f 2f 2f 20 6d 75 73 74 20 62 65 20 4e     /// must be N
2ca0: 55 4c 4c 20 66 6f 72 20 61 20 57 49 54 48 4f 55  ULL for a WITHOU
2cb0: 54 20 52 4f 57 49 44 20 76 69 72 74 75 61 6c 20  T ROWID virtual 
2cc0: 74 61 62 6c 65 2e 20 20 54 68 61 74 20 69 6e 20  table.  That in 
2cd0: 74 75 72 6e 20 6d 65 61 6e 73 20 74 68 61 74 0d  turn means that.
2ce0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 57 49 54  .        /// WIT
2cf0: 48 4f 55 54 20 52 4f 57 49 44 20 76 69 72 74 75  HOUT ROWID virtu
2d00: 61 6c 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62  al tables must b
2d10: 65 20 72 65 61 64 2d 6f 6e 6c 79 2e 0d 0a 20 20  e read-only...  
2d20: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
2d30: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
2d40: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  /summary>..     
2d50: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
2d60: 6d 65 3d 22 70 44 62 22 3e 0d 0a 20 20 20 20 20  me="pDb">..     
2d70: 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69 76     /// The nativ
2d80: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2d90: 63 74 69 6f 6e 20 68 61 6e 64 6c 65 2e 0d 0a 20  ction handle... 
2da0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
2db0: 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  am>..        ///
2dc0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 41   <param name="pA
2dd0: 75 78 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ux">..        //
2de0: 2f 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6e  / The original n
2df0: 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 76 61  ative pointer va
2e00: 6c 75 65 20 74 68 61 74 20 77 61 73 20 70 72 6f  lue that was pro
2e10: 76 69 64 65 64 20 74 6f 20 74 68 65 0d 0a 20 20  vided to the..  
2e20: 20 20 20 20 20 20 2f 2f 2f 20 73 71 6c 69 74 65        /// sqlite
2e30: 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28  3_create_module(
2e40: 29 2c 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ), sqlite3_creat
2e50: 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 29 20 6f 72  e_module_v2() or
2e60: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 71  ..        /// sq
2e70: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 64 69 73  lite3_create_dis
2e80: 70 6f 73 61 62 6c 65 5f 6d 6f 64 75 6c 65 28 29  posable_module()
2e90: 20 66 75 6e 63 74 69 6f 6e 73 2e 0d 0a 20 20 20   functions...   
2ea0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d       /// </param
2eb0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
2ec0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 63  param name="argc
2ed0: 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ">..        /// 
2ee0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  The number of ar
2ef0: 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  guments from the
2f00: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
2f10: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
2f20: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
2f30: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20  param>..        
2f40: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
2f50: 22 61 72 67 76 22 3e 0d 0a 20 20 20 20 20 20 20  "argv">..       
2f60: 20 2f 2f 2f 20 54 68 65 20 61 72 72 61 79 20 6f   /// The array o
2f70: 66 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e  f string argumen
2f80: 74 73 20 66 72 6f 6d 20 74 68 65 20 43 52 45 41  ts from the CREA
2f90: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
2fa0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 74  ..        /// st
2fb0: 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20 20 20  atement...      
2fc0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a    /// </param>..
2fd0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
2fe0: 61 6d 20 6e 61 6d 65 3d 22 70 56 74 61 62 22 3e  am name="pVtab">
2ff0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 55 70  ..        /// Up
3000: 6f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 69 73  on success, this
3010: 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20   parameter must 
3020: 62 65 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 70  be modified to p
3030: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 6c  oint to the newl
3040: 79 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 63  y..        /// c
3050: 72 65 61 74 65 64 20 6e 61 74 69 76 65 20 73 71  reated native sq
3060: 6c 69 74 65 33 5f 76 74 61 62 20 64 65 72 69 76  lite3_vtab deriv
3070: 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20  ed structure... 
3080: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
3090: 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  am>..        ///
30a0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 45   <param name="pE
30b0: 72 72 6f 72 22 3e 0d 0a 20 20 20 20 20 20 20 20  rror">..        
30c0: 2f 2f 2f 20 55 70 6f 6e 20 66 61 69 6c 75 72 65  /// Upon failure
30d0: 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  , this parameter
30e0: 20 6d 75 73 74 20 62 65 20 6d 6f 64 69 66 69 65   must be modifie
30f0: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
3100: 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  e error..       
3110: 20 2f 2f 2f 20 6d 65 73 73 61 67 65 2c 20 77 69   /// message, wi
3120: 74 68 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  th the underlyin
3130: 67 20 6d 65 6d 6f 72 79 20 68 61 76 69 6e 67 20  g memory having 
3140: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
3150: 6f 6d 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  om the..        
3160: 2f 2f 2f 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  /// sqlite3_mall
3170: 6f 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a  oc() function...
3180: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
3190: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ram>..        //
31a0: 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  / <returns>..   
31b0: 20 20 20 20 20 2f 2f 2f 20 41 20 73 74 61 6e 64       /// A stand
31c0: 61 72 64 20 53 51 4c 69 74 65 20 72 65 74 75 72  ard SQLite retur
31d0: 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20  n code...       
31e0: 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d   /// </returns>.
31f0: 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 45  .        SQLiteE
3200: 72 72 6f 72 43 6f 64 65 20 78 43 72 65 61 74 65  rrorCode xCreate
3210: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  (..            I
3220: 6e 74 50 74 72 20 70 44 62 2c 0d 0a 20 20 20 20  ntPtr pDb,..    
3230: 20 20 20 20 20 20 20 20 49 6e 74 50 74 72 20 70          IntPtr p
3240: 41 75 78 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  Aux,..          
3250: 20 20 69 6e 74 20 61 72 67 63 2c 0d 0a 20 20 20    int argc,..   
3260: 20 20 20 20 20 20 20 20 20 49 6e 74 50 74 72 20           IntPtr 
3270: 61 72 67 76 2c 0d 0a 20 20 20 20 20 20 20 20 20  argv,..         
3280: 20 20 20 72 65 66 20 49 6e 74 50 74 72 20 70 56     ref IntPtr pV
3290: 74 61 62 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tab,..          
32a0: 20 20 72 65 66 20 49 6e 74 50 74 72 20 70 45 72    ref IntPtr pEr
32b0: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ror..           
32c0: 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f   );....        /
32d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
32e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
32f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3300: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3310: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
3320: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
3330: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
3340: 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20  ra><code>..     
3350: 20 20 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 43 6f     /// int (*xCo
3360: 6e 6e 65 63 74 29 28 73 71 6c 69 74 65 33 2a 2c  nnect)(sqlite3*,
3370: 20 76 6f 69 64 20 2a 70 41 75 78 2c 0d 0a 20 20   void *pAux,..  
3380: 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 20        ///       
3390: 20 20 20 20 20 20 20 69 6e 74 20 61 72 67 63 2c         int argc,
33a0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 0d 0a 20   char **argv,.. 
33b0: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 20         ///      
33c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
33d0: 76 74 61 62 20 2a 2a 70 70 56 54 61 62 2c 0d 0a  vtab **ppVTab,..
33e0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20          ///     
33f0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a           char **
3400: 70 7a 45 72 72 29 3b 0d 0a 20 20 20 20 20 20 20  pzErr);..       
3410: 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61   /// </code></pa
3420: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
3430: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
3440: 20 2f 2f 2f 20 54 68 65 20 78 43 6f 6e 6e 65 63   /// The xConnec
3450: 74 20 6d 65 74 68 6f 64 20 69 73 20 76 65 72 79  t method is very
3460: 20 73 69 6d 69 6c 61 72 20 74 6f 20 78 43 72 65   similar to xCre
3470: 61 74 65 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f  ate. ..        /
3480: 2f 2f 20 49 74 20 68 61 73 20 74 68 65 20 73 61  // It has the sa
3490: 6d 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e  me parameters an
34a0: 64 20 63 6f 6e 73 74 72 75 63 74 73 20 61 20 6e  d constructs a n
34b0: 65 77 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ew sqlite3_vtab 
34c0: 73 74 72 75 63 74 75 72 65 20 0d 0a 20 20 20 20  structure ..    
34d0: 20 20 20 20 2f 2f 2f 20 6a 75 73 74 20 6c 69 6b      /// just lik
34e0: 65 20 78 43 72 65 61 74 65 2e 20 0d 0a 20 20 20  e xCreate. ..   
34f0: 20 20 20 20 20 2f 2f 2f 20 41 6e 64 20 69 74 20       /// And it 
3500: 6d 75 73 74 20 61 6c 73 6f 20 63 61 6c 6c 20 73  must also call s
3510: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
3520: 74 61 62 28 29 20 6c 69 6b 65 20 78 43 72 65 61  tab() like xCrea
3530: 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  te...        ///
3540: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
3550: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
3560: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 64 69        /// The di
3570: 66 66 65 72 65 6e 63 65 20 69 73 20 74 68 61 74  fference is that
3580: 20 78 43 6f 6e 6e 65 63 74 20 69 73 20 63 61 6c   xConnect is cal
3590: 6c 65 64 20 74 6f 20 65 73 74 61 62 6c 69 73 68  led to establish
35a0: 20 61 20 6e 65 77 20 0d 0a 20 20 20 20 20 20 20   a new ..       
35b0: 20 2f 2f 2f 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   /// connection 
35c0: 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67 20 76  to an existing v
35d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 68 65  irtual table whe
35e0: 72 65 61 73 20 78 43 72 65 61 74 65 20 69 73 20  reas xCreate is 
35f0: 63 61 6c 6c 65 64 20 0d 0a 20 20 20 20 20 20 20  called ..       
3600: 20 2f 2f 2f 20 74 6f 20 63 72 65 61 74 65 20 61   /// to create a
3610: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 61 62   new virtual tab
3620: 6c 65 20 66 72 6f 6d 20 73 63 72 61 74 63 68 2e  le from scratch.
3630: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
3640: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
3650: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
3660: 20 20 20 2f 2f 2f 20 54 68 65 20 78 43 72 65 61     /// The xCrea
3670: 74 65 20 61 6e 64 20 78 43 6f 6e 6e 65 63 74 20  te and xConnect 
3680: 6d 65 74 68 6f 64 73 20 61 72 65 20 6f 6e 6c 79  methods are only
3690: 20 64 69 66 66 65 72 65 6e 74 20 77 68 65 6e 20   different when 
36a0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  the..        ///
36b0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   virtual table h
36c0: 61 73 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20  as some kind of 
36d0: 62 61 63 6b 69 6e 67 20 73 74 6f 72 65 20 74 68  backing store th
36e0: 61 74 20 6d 75 73 74 20 62 65 20 69 6e 69 74 69  at must be initi
36f0: 61 6c 69 7a 65 64 20 0d 0a 20 20 20 20 20 20 20  alized ..       
3700: 20 2f 2f 2f 20 74 68 65 20 66 69 72 73 74 20 74   /// the first t
3710: 69 6d 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  ime the virtual 
3720: 74 61 62 6c 65 20 69 73 20 63 72 65 61 74 65 64  table is created
3730: 2e 20 54 68 65 20 78 43 72 65 61 74 65 20 6d 65  . The xCreate me
3740: 74 68 6f 64 20 63 72 65 61 74 65 73 20 0d 0a 20  thod creates .. 
3750: 20 20 20 20 20 20 20 2f 2f 2f 20 61 6e 64 20 69         /// and i
3760: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 62  nitializes the b
3770: 61 63 6b 69 6e 67 20 73 74 6f 72 65 2e 20 54 68  acking store. Th
3780: 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f  e xConnect metho
3790: 64 20 6a 75 73 74 20 63 6f 6e 6e 65 63 74 73 20  d just connects 
37a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f  ..        /// to
37b0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 62 61 63   an existing bac
37c0: 6b 69 6e 67 20 73 74 6f 72 65 2e 20 20 57 68 65  king store.  Whe
37d0: 6e 20 78 43 72 65 61 74 65 20 61 6e 64 20 78 43  n xCreate and xC
37e0: 6f 6e 6e 65 63 74 20 61 72 65 20 74 68 65 20 73  onnect are the s
37f0: 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ame,..        //
3800: 2f 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  / the table is a
3810: 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74  n eponymous virt
3820: 75 61 6c 20 74 61 62 6c 65 2e 0d 0a 20 20 20 20  ual table...    
3830: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
3840: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
3850: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
3860: 20 41 73 20 61 6e 20 65 78 61 6d 70 6c 65 2c 20   As an example, 
3870: 63 6f 6e 73 69 64 65 72 20 61 20 76 69 72 74 75  consider a virtu
3880: 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65  al table impleme
3890: 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 0d 0a 20  ntation that .. 
38a0: 20 20 20 20 20 20 20 2f 2f 2f 20 70 72 6f 76 69         /// provi
38b0: 64 65 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63  des read-only ac
38c0: 63 65 73 73 20 74 6f 20 65 78 69 73 74 69 6e 67  cess to existing
38d0: 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64   comma-separated
38e0: 2d 76 61 6c 75 65 20 28 43 53 56 29 0d 0a 20 20  -value (CSV)..  
38f0: 20 20 20 20 20 20 2f 2f 2f 20 66 69 6c 65 73 20        /// files 
3900: 6f 6e 20 64 69 73 6b 2e 20 54 68 65 72 65 20 69  on disk. There i
3910: 73 20 6e 6f 20 62 61 63 6b 69 6e 67 20 73 74 6f  s no backing sto
3920: 72 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  re that needs to
3930: 20 62 65 20 63 72 65 61 74 65 64 20 0d 0a 20 20   be created ..  
3940: 20 20 20 20 20 20 2f 2f 2f 20 6f 72 20 69 6e 69        /// or ini
3950: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 73 75 63  tialized for suc
3960: 68 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  h a virtual tabl
3970: 65 20 28 73 69 6e 63 65 20 74 68 65 20 43 53 56  e (since the CSV
3980: 20 66 69 6c 65 73 20 61 6c 72 65 61 64 79 20 0d   files already .
3990: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 65 78 69  .        /// exi
39a0: 73 74 20 6f 6e 20 64 69 73 6b 29 20 73 6f 20 74  st on disk) so t
39b0: 68 65 20 78 43 72 65 61 74 65 20 61 6e 64 20 78  he xCreate and x
39c0: 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 73 20  Connect methods 
39d0: 77 69 6c 6c 20 62 65 20 69 64 65 6e 74 69 63 61  will be identica
39e0: 6c 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  l ..        /// 
39f0: 66 6f 72 20 74 68 61 74 20 6d 6f 64 75 6c 65 2e  for that module.
3a00: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
3a10: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
3a20: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
3a30: 20 20 20 2f 2f 2f 20 41 6e 6f 74 68 65 72 20 65     /// Another e
3a40: 78 61 6d 70 6c 65 20 69 73 20 61 20 76 69 72 74  xample is a virt
3a50: 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
3a60: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 66 75 6c 6c  mplements a full
3a70: 2d 74 65 78 74 20 69 6e 64 65 78 2e 20 0d 0a 20  -text index. .. 
3a80: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78         /// The x
3a90: 43 72 65 61 74 65 20 6d 65 74 68 6f 64 20 6d 75  Create method mu
3aa0: 73 74 20 63 72 65 61 74 65 20 61 6e 64 20 69 6e  st create and in
3ab0: 69 74 69 61 6c 69 7a 65 20 64 61 74 61 20 73 74  itialize data st
3ac0: 72 75 63 74 75 72 65 73 20 74 6f 20 68 6f 6c 64  ructures to hold
3ad0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74   ..        /// t
3ae0: 68 65 20 64 69 63 74 69 6f 6e 61 72 79 20 61 6e  he dictionary an
3af0: 64 20 70 6f 73 74 69 6e 67 20 6c 69 73 74 73 20  d posting lists 
3b00: 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
3b10: 54 68 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74  The xConnect met
3b20: 68 6f 64 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f  hod,..        //
3b30: 2f 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  / on the other h
3b40: 61 6e 64 2c 20 6f 6e 6c 79 20 68 61 73 20 74 6f  and, only has to
3b50: 20 6c 6f 63 61 74 65 20 61 6e 64 20 75 73 65 20   locate and use 
3b60: 61 6e 20 65 78 69 73 74 69 6e 67 20 64 69 63 74  an existing dict
3b70: 69 6f 6e 61 72 79 20 0d 0a 20 20 20 20 20 20 20  ionary ..       
3b80: 20 2f 2f 2f 20 61 6e 64 20 70 6f 73 74 69 6e 67   /// and posting
3b90: 20 6c 69 73 74 73 20 74 68 61 74 20 77 65 72 65   lists that were
3ba0: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
3bb0: 69 6f 72 20 78 43 72 65 61 74 65 20 63 61 6c 6c  ior xCreate call
3bc0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
3bd0: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
3be0: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
3bf0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 43 6f 6e      /// The xCon
3c00: 6e 65 63 74 20 6d 65 74 68 6f 64 20 6d 75 73 74  nect method must
3c10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3c20: 4b 20 69 66 20 69 74 20 69 73 20 73 75 63 63 65  K if it is succe
3c30: 73 73 66 75 6c 20 0d 0a 20 20 20 20 20 20 20 20  ssful ..        
3c40: 2f 2f 2f 20 69 6e 20 63 72 65 61 74 69 6e 67 20  /// in creating 
3c50: 74 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20  the new virtual 
3c60: 74 61 62 6c 65 2c 20 6f 72 20 53 51 4c 49 54 45  table, or SQLITE
3c70: 5f 45 52 52 4f 52 20 69 66 20 69 74 20 69 73 20  _ERROR if it is 
3c80: 6e 6f 74 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  not ..        //
3c90: 2f 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 66  / successful. If
3ca0: 20 6e 6f 74 20 73 75 63 63 65 73 73 66 75 6c 2c   not successful,
3cb0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
3cc0: 62 20 73 74 72 75 63 74 75 72 65 20 6d 75 73 74  b structure must
3cd0: 20 6e 6f 74 20 62 65 20 0d 0a 20 20 20 20 20 20   not be ..      
3ce0: 20 20 2f 2f 2f 20 61 6c 6c 6f 63 61 74 65 64 2e    /// allocated.
3cf0: 20 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   An error messag
3d00: 65 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79  e may optionally
3d10: 20 62 65 20 72 65 74 75 72 6e 65 64 20 69 6e 20   be returned in 
3d20: 2a 70 7a 45 72 72 20 69 66 20 0d 0a 20 20 20 20  *pzErr if ..    
3d30: 20 20 20 20 2f 2f 2f 20 75 6e 73 75 63 63 65 73      /// unsucces
3d40: 73 66 75 6c 2e 20 0d 0a 20 20 20 20 20 20 20 20  sful. ..        
3d50: 2f 2f 2f 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  /// Space to hol
3d60: 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  d the error mess
3d70: 61 67 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20  age string must 
3d80: 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  be allocated usi
3d90: 6e 67 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ng..        /// 
3da0: 61 6e 20 53 51 4c 69 74 65 20 6d 65 6d 6f 72 79  an SQLite memory
3db0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63   allocation func
3dc0: 74 69 6f 6e 20 6c 69 6b 65 20 0d 0a 20 20 20 20  tion like ..    
3dd0: 20 20 20 20 2f 2f 2f 20 73 71 6c 69 74 65 33 5f      /// sqlite3_
3de0: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 73 71 6c 69  malloc() or sqli
3df0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 29 20 61 73  te3_mprintf() as
3e00: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
3e10: 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20 20 20 2f   will..        /
3e20: 2f 2f 20 61 74 74 65 6d 70 74 20 74 6f 20 66 72  // attempt to fr
3e30: 65 65 20 74 68 65 20 73 70 61 63 65 20 75 73 69  ee the space usi
3e40: 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
3e50: 29 20 61 66 74 65 72 20 74 68 65 20 65 72 72 6f  ) after the erro
3e60: 72 20 68 61 73 0d 0a 20 20 20 20 20 20 20 20 2f  r has..        /
3e70: 2f 2f 20 62 65 65 6e 20 72 65 70 6f 72 74 65 64  // been reported
3e80: 20 75 70 20 74 6f 20 74 68 65 20 61 70 70 6c 69   up to the appli
3e90: 63 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  cation...       
3ea0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
3eb0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
3ec0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
3ed0: 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f  e xConnect metho
3ee0: 64 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  d is required fo
3ef0: 72 20 65 76 65 72 79 20 76 69 72 74 75 61 6c 20  r every virtual 
3f00: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
3f10: 74 69 6f 6e 2c 20 0d 0a 20 20 20 20 20 20 20 20  tion, ..        
3f20: 2f 2f 2f 20 74 68 6f 75 67 68 20 74 68 65 20 78  /// though the x
3f30: 43 72 65 61 74 65 20 61 6e 64 20 78 43 6f 6e 6e  Create and xConn
3f40: 65 63 74 20 70 6f 69 6e 74 65 72 73 20 6f 66 20  ect pointers of 
3f50: 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  the sqlite3_modu
3f60: 6c 65 20 6f 62 6a 65 63 74 0d 0a 20 20 20 20 20  le object..     
3f70: 20 20 20 2f 2f 2f 20 6d 61 79 20 70 6f 69 6e 74     /// may point
3f80: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 75 6e   to the same fun
3f90: 63 74 69 6f 6e 20 69 66 20 74 68 65 20 76 69 72  ction if the vir
3fa0: 74 75 61 6c 20 74 61 62 6c 65 20 64 6f 65 73 20  tual table does 
3fb0: 6e 6f 74 20 6e 65 65 64 20 74 6f 0d 0a 20 20 20  not need to..   
3fc0: 20 20 20 20 20 2f 2f 2f 20 69 6e 69 74 69 61 6c       /// initial
3fd0: 69 7a 65 20 62 61 63 6b 69 6e 67 20 73 74 6f 72  ize backing stor
3fe0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
3ff0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
4000: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
4010: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
4020: 72 61 6d 20 6e 61 6d 65 3d 22 70 44 62 22 3e 0d  ram name="pDb">.
4030: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
4040: 20 6e 61 74 69 76 65 20 64 61 74 61 62 61 73 65   native database
4050: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
4060: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  le...        ///
4070: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
4080: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
4090: 6d 65 3d 22 70 41 75 78 22 3e 0d 0a 20 20 20 20  me="pAux">..    
40a0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 6f 72 69 67      /// The orig
40b0: 69 6e 61 6c 20 6e 61 74 69 76 65 20 70 6f 69 6e  inal native poin
40c0: 74 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 77  ter value that w
40d0: 61 73 20 70 72 6f 76 69 64 65 64 20 74 6f 20 74  as provided to t
40e0: 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  he..        /// 
40f0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d  sqlite3_create_m
4100: 6f 64 75 6c 65 28 29 2c 20 73 71 6c 69 74 65 33  odule(), sqlite3
4110: 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76  _create_module_v
4120: 32 28 29 20 6f 72 0d 0a 20 20 20 20 20 20 20 20  2() or..        
4130: 2f 2f 2f 20 73 71 6c 69 74 65 33 5f 63 72 65 61  /// sqlite3_crea
4140: 74 65 5f 64 69 73 70 6f 73 61 62 6c 65 5f 6d 6f  te_disposable_mo
4150: 64 75 6c 65 28 29 20 66 75 6e 63 74 69 6f 6e 73  dule() functions
4160: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
4170: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
4180: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
4190: 3d 22 61 72 67 63 22 3e 0d 0a 20 20 20 20 20 20  ="argc">..      
41a0: 20 20 2f 2f 2f 20 54 68 65 20 6e 75 6d 62 65 72    /// The number
41b0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66 72   of arguments fr
41c0: 6f 6d 20 74 68 65 20 43 52 45 41 54 45 20 56 49  om the CREATE VI
41d0: 52 54 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74  RTUAL TABLE stat
41e0: 65 6d 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20  ement...        
41f0: 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
4200: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
4210: 20 6e 61 6d 65 3d 22 61 72 67 76 22 3e 0d 0a 20   name="argv">.. 
4220: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 61         /// The a
4230: 72 72 61 79 20 6f 66 20 73 74 72 69 6e 67 20 61  rray of string a
4240: 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  rguments from th
4250: 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  e CREATE VIRTUAL
4260: 20 54 41 42 4c 45 0d 0a 20 20 20 20 20 20 20 20   TABLE..        
4270: 2f 2f 2f 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a  /// statement...
4280: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
4290: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ram>..        //
42a0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70  / <param name="p
42b0: 56 74 61 62 22 3e 0d 0a 20 20 20 20 20 20 20 20  Vtab">..        
42c0: 2f 2f 2f 20 55 70 6f 6e 20 73 75 63 63 65 73 73  /// Upon success
42d0: 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  , this parameter
42e0: 20 6d 75 73 74 20 62 65 20 6d 6f 64 69 66 69 65   must be modifie
42f0: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
4300: 65 20 6e 65 77 6c 79 0d 0a 20 20 20 20 20 20 20  e newly..       
4310: 20 2f 2f 2f 20 63 72 65 61 74 65 64 20 6e 61 74   /// created nat
4320: 69 76 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ive sqlite3_vtab
4330: 20 64 65 72 69 76 65 64 20 73 74 72 75 63 74 75   derived structu
4340: 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  re...        ///
4350: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
4360: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
4370: 6d 65 3d 22 70 45 72 72 6f 72 22 3e 0d 0a 20 20  me="pError">..  
4380: 20 20 20 20 20 20 2f 2f 2f 20 55 70 6f 6e 20 66        /// Upon f
4390: 61 69 6c 75 72 65 2c 20 74 68 69 73 20 70 61 72  ailure, this par
43a0: 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 6d  ameter must be m
43b0: 6f 64 69 66 69 65 64 20 74 6f 20 70 6f 69 6e 74  odified to point
43c0: 20 74 6f 20 74 68 65 20 65 72 72 6f 72 0d 0a 20   to the error.. 
43d0: 20 20 20 20 20 20 20 2f 2f 2f 20 6d 65 73 73 61         /// messa
43e0: 67 65 2c 20 77 69 74 68 20 74 68 65 20 75 6e 64  ge, with the und
43f0: 65 72 6c 79 69 6e 67 20 6d 65 6d 6f 72 79 20 68  erlying memory h
4400: 61 76 69 6e 67 20 62 65 65 6e 20 6f 62 74 61 69  aving been obtai
4410: 6e 65 64 20 66 72 6f 6d 20 74 68 65 0d 0a 20 20  ned from the..  
4420: 20 20 20 20 20 20 2f 2f 2f 20 73 71 6c 69 74 65        /// sqlite
4430: 33 5f 6d 61 6c 6c 6f 63 28 29 20 66 75 6e 63 74  3_malloc() funct
4440: 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ion...        //
4450: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
4460: 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
4470: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41  >..        /// A
4480: 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65   standard SQLite
4490: 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20   return code... 
44a0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74         /// </ret
44b0: 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53  urns>..        S
44c0: 51 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78  QLiteErrorCode x
44d0: 43 6f 6e 6e 65 63 74 28 0d 0a 20 20 20 20 20 20  Connect(..      
44e0: 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 44 62        IntPtr pDb
44f0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  ,..            I
4500: 6e 74 50 74 72 20 70 41 75 78 2c 0d 0a 20 20 20  ntPtr pAux,..   
4510: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 72 67           int arg
4520: 63 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  c,..            
4530: 49 6e 74 50 74 72 20 61 72 67 76 2c 0d 0a 20 20  IntPtr argv,..  
4540: 20 20 20 20 20 20 20 20 20 20 72 65 66 20 49 6e            ref In
4550: 74 50 74 72 20 70 56 74 61 62 2c 0d 0a 20 20 20  tPtr pVtab,..   
4560: 20 20 20 20 20 20 20 20 20 72 65 66 20 49 6e 74           ref Int
4570: 50 74 72 20 70 45 72 72 6f 72 0d 0a 20 20 20 20  Ptr pError..    
4580: 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20          );....  
4590: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
45a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
45b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
45c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
45d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
45e0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75  .        /// <su
45f0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20  mmary>..        
4600: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
4610: 20 20 20 20 2f 2f 2f 20 53 51 4c 69 74 65 20 75      /// SQLite u
4620: 73 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64  ses the xBestInd
4630: 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 76  ex method of a v
4640: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
4650: 75 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ule to determine
4660: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
4670: 65 20 62 65 73 74 20 77 61 79 20 74 6f 20 61 63  e best way to ac
4680: 63 65 73 73 20 74 68 65 20 76 69 72 74 75 61 6c  cess the virtual
4690: 20 74 61 62 6c 65 2e 20 0d 0a 20 20 20 20 20 20   table. ..      
46a0: 20 20 2f 2f 2f 20 54 68 65 20 78 42 65 73 74 49    /// The xBestI
46b0: 6e 64 65 78 20 6d 65 74 68 6f 64 20 68 61 73 20  ndex method has 
46c0: 61 20 70 72 6f 74 6f 74 79 70 65 20 6c 69 6b 65  a prototype like
46d0: 20 74 68 69 73 3a 0d 0a 20 20 20 20 20 20 20 20   this:..        
46e0: 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
46f0: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c       /// <para><
4700: 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f  code>..        /
4710: 2f 2f 20 69 6e 74 20 28 2a 78 42 65 73 74 49 6e  // int (*xBestIn
4720: 64 65 78 29 28 73 71 6c 69 74 65 33 5f 76 74 61  dex)(sqlite3_vta
4730: 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65  b *pVTab, sqlite
4740: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2a 29 3b 0d  3_index_info*);.
4750: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63  .        /// </c
4760: 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  ode></para>..   
4770: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
4780: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
4790: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 63 6f 6d   SQLite core com
47a0: 6d 75 6e 69 63 61 74 65 73 20 77 69 74 68 20 74  municates with t
47b0: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
47c0: 74 68 6f 64 20 62 79 20 66 69 6c 6c 69 6e 67 20  thod by filling 
47d0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e  ..        /// in
47e0: 20 63 65 72 74 61 69 6e 20 66 69 65 6c 64 73 20   certain fields 
47f0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
4800: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
4810: 75 72 65 20 61 6e 64 20 70 61 73 73 69 6e 67 20  ure and passing 
4820: 61 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a ..        /// 
4830: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20  pointer to that 
4840: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 78  structure into x
4850: 42 65 73 74 49 6e 64 65 78 20 61 73 20 74 68 65  BestIndex as the
4860: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
4870: 72 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  r. ..        ///
4880: 20 54 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   The xBestIndex 
4890: 6d 65 74 68 6f 64 20 66 69 6c 6c 73 20 6f 75 74  method fills out
48a0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
48b0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
48c0: 77 68 69 63 68 0d 0a 20 20 20 20 20 20 20 20 2f  which..        /
48d0: 2f 2f 20 66 6f 72 6d 73 20 74 68 65 20 72 65 70  // forms the rep
48e0: 6c 79 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  ly. The sqlite3_
48f0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
4900: 74 75 72 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  ture looks like 
4910: 74 68 69 73 3a 0d 0a 20 20 20 20 20 20 20 20 2f  this:..        /
4920: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
4930: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63      /// <para><c
4940: 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ode>..        //
4950: 2f 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  / struct sqlite3
4960: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 7b 0d 0a 20  _index_info {.. 
4970: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 2f 2a 20         ///   /* 
4980: 49 6e 70 75 74 73 20 2a 2f 0d 0a 20 20 20 20 20  Inputs */..     
4990: 20 20 20 2f 2f 2f 20 20 20 63 6f 6e 73 74 20 69     ///   const i
49a0: 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  nt nConstraint; 
49b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
49c0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 43 6f 6e   entries in aCon
49d0: 73 74 72 61 69 6e 74 20 2a 2f 0d 0a 20 20 20 20  straint */..    
49e0: 20 20 20 20 2f 2f 2f 20 20 20 63 6f 6e 73 74 20      ///   const 
49f0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
4a00: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
4a10: 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20  {..        ///  
4a20: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b      int iColumn;
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4a40: 20 43 6f 6c 75 6d 6e 20 63 6f 6e 73 74 72 61 69   Column constrai
4a50: 6e 65 64 2e 20 20 2d 31 20 66 6f 72 20 52 4f 57  ned.  -1 for ROW
4a60: 49 44 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f  ID */..        /
4a70: 2f 2f 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64  //      unsigned
4a80: 20 63 68 61 72 20 6f 70 3b 20 20 20 20 20 20 20   char op;       
4a90: 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
4aa0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0d 0a 20 20 20  operator */..   
4ab0: 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 75 6e       ///      un
4ac0: 73 69 67 6e 65 64 20 63 68 61 72 20 75 73 61 62  signed char usab
4ad0: 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  le;     /* True 
4ae0: 69 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  if this constrai
4af0: 6e 74 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0d  nt is usable */.
4b00: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20  .        ///    
4b10: 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 73 65    int iTermOffse
4b20: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  t;          /* U
4b30: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 2d  sed internally -
4b40: 20 78 42 65 73 74 49 6e 64 65 78 20 73 68 6f 75   xBestIndex shou
4b50: 6c 64 20 69 67 6e 6f 72 65 20 2a 2f 0d 0a 20 20  ld ignore */..  
4b60: 20 20 20 20 20 20 2f 2f 2f 20 20 20 7d 20 2a 63        ///   } *c
4b70: 6f 6e 73 74 20 61 43 6f 6e 73 74 72 61 69 6e 74  onst aConstraint
4b80: 3b 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  ;      /* Table 
4b90: 6f 66 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  of WHERE clause 
4ba0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0d 0a  constraints */..
4bb0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 63 6f          ///   co
4bc0: 6e 73 74 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  nst int nOrderBy
4bd0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
4be0: 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
4bf0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
4c00: 73 65 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f  se */..        /
4c10: 2f 2f 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63  //   const struc
4c20: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
4c30: 6f 72 64 65 72 62 79 20 7b 0d 0a 20 20 20 20 20  orderby {..     
4c40: 20 20 20 2f 2f 2f 20 20 20 20 20 20 69 6e 74 20     ///      int 
4c50: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
4c60: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
4c70: 6e 75 6d 62 65 72 20 2a 2f 0d 0a 20 20 20 20 20  number */..     
4c80: 20 20 20 2f 2f 2f 20 20 20 20 20 20 75 6e 73 69     ///      unsi
4c90: 67 6e 65 64 20 63 68 61 72 20 64 65 73 63 3b 20  gned char desc; 
4ca0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
4cb0: 72 20 44 45 53 43 2e 20 20 46 61 6c 73 65 20 66  r DESC.  False f
4cc0: 6f 72 20 41 53 43 2e 20 2a 2f 0d 0a 20 20 20 20  or ASC. */..    
4cd0: 20 20 20 20 2f 2f 2f 20 20 20 7d 20 2a 63 6f 6e      ///   } *con
4ce0: 73 74 20 61 4f 72 64 65 72 42 79 3b 20 20 20 20  st aOrderBy;    
4cf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
4d00: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0d 0a  R BY clause */..
4d10: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 2f 2a          ///   /*
4d20: 20 4f 75 74 70 75 74 73 20 2a 2f 0d 0a 20 20 20   Outputs */..   
4d30: 20 20 20 20 20 2f 2f 2f 20 20 20 73 74 72 75 63       ///   struc
4d40: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
4d50: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
4d60: 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20   {..        /// 
4d70: 20 20 20 20 69 6e 74 20 61 72 67 76 49 6e 64 65      int argvInde
4d80: 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x;           /* 
4d90: 69 66 20 3e 30 2c 20 63 6f 6e 73 74 72 61 69 6e  if >0, constrain
4da0: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 72 67  t is part of arg
4db0: 76 20 74 6f 20 78 46 69 6c 74 65 72 20 2a 2f 0d  v to xFilter */.
4dc0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20  .        ///    
4dd0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f   unsigned char o
4de0: 6d 69 74 3b 20 20 20 20 20 20 2f 2a 20 44 6f 20  mit;      /* Do 
4df0: 6e 6f 74 20 63 6f 64 65 20 61 20 74 65 73 74 20  not code a test 
4e00: 66 6f 72 20 74 68 69 73 20 63 6f 6e 73 74 72 61  for this constra
4e10: 69 6e 74 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  int */..        
4e20: 2f 2f 2f 20 20 20 7d 20 2a 63 6f 6e 73 74 20 61  ///   } *const a
4e30: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
4e40: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
4e50: 69 6e 74 20 69 64 78 4e 75 6d 3b 20 20 20 20 20  int idxNum;     
4e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4e70: 6d 62 65 72 20 75 73 65 64 20 74 6f 20 69 64 65  mber used to ide
4e80: 6e 74 69 66 79 20 74 68 65 20 69 6e 64 65 78 20  ntify the index 
4e90: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  */..        /// 
4ea0: 20 20 63 68 61 72 20 2a 69 64 78 53 74 72 3b 20    char *idxStr; 
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ec0: 53 74 72 69 6e 67 2c 20 70 6f 73 73 69 62 6c 79  String, possibly
4ed0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
4ee0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 2a 2f  qlite3_malloc */
4ef0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
4f00: 69 6e 74 20 6e 65 65 64 54 6f 46 72 65 65 49 64  int needToFreeId
4f10: 78 53 74 72 3b 20 20 20 20 20 20 2f 2a 20 46 72  xStr;      /* Fr
4f20: 65 65 20 69 64 78 53 74 72 20 75 73 69 6e 67 20  ee idxStr using 
4f30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 69  sqlite3_free() i
4f40: 66 20 74 72 75 65 20 2a 2f 0d 0a 20 20 20 20 20  f true */..     
4f50: 20 20 20 2f 2f 2f 20 20 20 69 6e 74 20 6f 72 64     ///   int ord
4f60: 65 72 42 79 43 6f 6e 73 75 6d 65 64 3b 20 20 20  erByConsumed;   
4f70: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
4f80: 75 74 70 75 74 20 69 73 20 61 6c 72 65 61 64 79  utput is already
4f90: 20 6f 72 64 65 72 65 64 20 2a 2f 0d 0a 20 20 20   ordered */..   
4fa0: 20 20 20 20 20 2f 2f 2f 20 20 20 64 6f 75 62 6c       ///   doubl
4fb0: 65 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b  e estimatedCost;
4fc0: 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
4fd0: 65 64 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67  ed cost of using
4fe0: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0d 0a   this index */..
4ff0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 3c 21          ///   <!
5000: 5b 43 44 41 54 41 5b 3c 62 3e 5d 5d 3e 2f 2a 20  [CDATA[<b>]]>/* 
5010: 46 69 65 6c 64 73 20 62 65 6c 6f 77 20 61 72 65  Fields below are
5020: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
5030: 69 6e 20 53 51 4c 69 74 65 20 33 2e 38 2e 32 20  in SQLite 3.8.2 
5040: 61 6e 64 20 6c 61 74 65 72 20 2a 2f 3c 21 5b 43  and later */<![C
5050: 44 41 54 41 5b 3c 2f 62 3e 5d 5d 3e 0d 0a 20 20  DATA[</b>]]>..  
5060: 20 20 20 20 20 20 2f 2f 2f 20 20 20 73 71 6c 69        ///   sqli
5070: 74 65 33 5f 69 6e 74 36 34 20 65 73 74 69 6d 61  te3_int64 estima
5080: 74 65 64 52 6f 77 73 3b 20 20 20 20 2f 2a 20 45  tedRows;    /* E
5090: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
50a0: 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64  of rows returned
50b0: 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   */..        ///
50c0: 20 20 20 3c 21 5b 43 44 41 54 41 5b 3c 62 3e 5d     <![CDATA[<b>]
50d0: 5d 3e 2f 2a 20 46 69 65 6c 64 73 20 62 65 6c 6f  ]>/* Fields belo
50e0: 77 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  w are only avail
50f0: 61 62 6c 65 20 69 6e 20 53 51 4c 69 74 65 20 33  able in SQLite 3
5100: 2e 39 2e 30 20 61 6e 64 20 6c 61 74 65 72 20 2a  .9.0 and later *
5110: 2f 3c 21 5b 43 44 41 54 41 5b 3c 2f 62 3e 5d 5d  /<![CDATA[</b>]]
5120: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20  >..        ///  
5130: 20 69 6e 74 20 69 64 78 46 6c 61 67 73 3b 20 20   int idxFlags;  
5140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
5150: 61 73 6b 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e  ask of SQLITE_IN
5160: 44 45 58 5f 53 43 41 4e 5f 2a 20 66 6c 61 67 73  DEX_SCAN_* flags
5170: 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   */..        ///
5180: 20 20 20 3c 21 5b 43 44 41 54 41 5b 3c 62 3e 5d     <![CDATA[<b>]
5190: 5d 3e 2f 2a 20 46 69 65 6c 64 73 20 62 65 6c 6f  ]>/* Fields belo
51a0: 77 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  w are only avail
51b0: 61 62 6c 65 20 69 6e 20 53 51 4c 69 74 65 20 33  able in SQLite 3
51c0: 2e 31 30 2e 30 20 61 6e 64 20 6c 61 74 65 72 20  .10.0 and later 
51d0: 2a 2f 3c 21 5b 43 44 41 54 41 5b 3c 2f 62 3e 5d  */<![CDATA[</b>]
51e0: 5d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ]>..        /// 
51f0: 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
5200: 20 63 6f 6c 55 73 65 64 3b 20 20 20 20 2f 2a 20   colUsed;    /* 
5210: 49 6e 70 75 74 3a 20 4d 61 73 6b 20 6f 66 20 63  Input: Mask of c
5220: 6f 6c 75 6d 6e 73 20 75 73 65 64 20 62 79 20 73  olumns used by s
5230: 74 61 74 65 6d 65 6e 74 20 2a 2f 0d 0a 20 20 20  tatement */..   
5240: 20 20 20 20 20 2f 2f 2f 20 7d 3b 0d 0a 20 20 20       /// };..   
5250: 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e       /// </code>
5260: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
5270: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
5280: 20 20 20 20 20 2f 2f 2f 20 4e 6f 74 65 20 74 68       /// Note th
5290: 65 20 77 61 72 6e 69 6e 67 73 20 6f 6e 20 74 68  e warnings on th
52a0: 65 20 22 65 73 74 69 6d 61 74 65 64 52 6f 77 73  e "estimatedRows
52b0: 22 2c 20 22 69 64 78 46 6c 61 67 73 22 2c 20 61  ", "idxFlags", a
52c0: 6e 64 20 63 6f 6c 55 73 65 64 20 66 69 65 6c 64  nd colUsed field
52d0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  s...        /// 
52e0: 54 68 65 73 65 20 66 69 65 6c 64 73 20 77 65 72  These fields wer
52f0: 65 20 61 64 64 65 64 20 77 69 74 68 20 53 51 4c  e added with SQL
5300: 69 74 65 20 76 65 72 73 69 6f 6e 73 20 33 2e 38  ite versions 3.8
5310: 2e 32 2c 20 33 2e 39 2e 30 2c 20 61 6e 64 20 33  .2, 3.9.0, and 3
5320: 2e 31 30 2e 30 2c 20 72 65 73 70 65 63 74 69 76  .10.0, respectiv
5330: 65 6c 79 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f  ely. ..        /
5340: 2f 2f 20 41 6e 79 20 65 78 74 65 6e 73 69 6f 6e  // Any extension
5350: 20 74 68 61 74 20 72 65 61 64 73 20 6f 72 20 77   that reads or w
5360: 72 69 74 65 73 20 74 68 65 73 65 20 66 69 65 6c  rites these fiel
5370: 64 73 20 6d 75 73 74 20 66 69 72 73 74 20 63 68  ds must first ch
5380: 65 63 6b 20 74 68 61 74 20 74 68 65 20 0d 0a 20  eck that the .. 
5390: 20 20 20 20 20 20 20 2f 2f 2f 20 76 65 72 73 69         /// versi
53a0: 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  on of the SQLite
53b0: 20 6c 69 62 72 61 72 79 20 69 6e 20 75 73 65 20   library in use 
53c0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
53d0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 61 70 70 72  or equal to appr
53e0: 6f 70 72 69 61 74 65 0d 0a 20 20 20 20 20 20 20  opriate..       
53f0: 20 2f 2f 2f 20 76 65 72 73 69 6f 6e 20 2d 20 70   /// version - p
5400: 65 72 68 61 70 73 20 63 6f 6d 70 61 72 69 6e 67  erhaps comparing
5410: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
5420: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
5430: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
5440: 65 72 28 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f  er()..        //
5450: 2f 20 61 67 61 69 6e 73 74 20 63 6f 6e 73 74 61  / against consta
5460: 6e 74 73 20 33 30 30 38 30 30 32 2c 20 33 30 30  nts 3008002, 300
5470: 39 30 30 30 2c 20 61 6e 64 2f 6f 72 20 33 30 31  9000, and/or 301
5480: 30 30 30 30 2e 20 54 68 65 20 72 65 73 75 6c 74  0000. The result
5490: 20 6f 66 20 61 74 74 65 6d 70 74 69 6e 67 20 0d   of attempting .
54a0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20  .        /// to 
54b0: 61 63 63 65 73 73 20 74 68 65 73 65 20 66 69 65  access these fie
54c0: 6c 64 73 20 69 6e 20 61 6e 20 73 71 6c 69 74 65  lds in an sqlite
54d0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
54e0: 75 63 74 75 72 65 20 63 72 65 61 74 65 64 20 62  ucture created b
54f0: 79 20 61 6e 20 0d 0a 20 20 20 20 20 20 20 20 2f  y an ..        /
5500: 2f 2f 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  // older version
5510: 20 6f 66 20 53 51 4c 69 74 65 20 61 72 65 20 75   of SQLite are u
5520: 6e 64 65 66 69 6e 65 64 2e 0d 0a 20 20 20 20 20  ndefined...     
5530: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
5540: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
5550: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
5560: 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20 74 68 65  In addition, the
5570: 72 65 20 61 72 65 20 73 6f 6d 65 20 64 65 66 69  re are some defi
5580: 6e 65 64 20 63 6f 6e 73 74 61 6e 74 73 3a 0d 0a  ned constants:..
5590: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
55a0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
55b0: 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20   <para><code>.. 
55c0: 20 20 20 20 20 20 20 2f 2f 2f 20 23 64 65 66 69         /// #defi
55d0: 6e 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  ne SQLITE_INDEX_
55e0: 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 20 20  CONSTRAINT_EQ   
55f0: 20 20 20 32 0d 0a 20 20 20 20 20 20 20 20 2f 2f     2..        //
5600: 2f 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  / #define SQLITE
5610: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
5620: 54 5f 47 54 20 20 20 20 20 20 34 0d 0a 20 20 20  T_GT      4..   
5630: 20 20 20 20 20 2f 2f 2f 20 23 64 65 66 69 6e 65       /// #define
5640: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
5650: 4e 53 54 52 41 49 4e 54 5f 4c 45 20 20 20 20 20  NSTRAINT_LE     
5660: 20 38 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20   8..        /// 
5670: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49  #define SQLITE_I
5680: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
5690: 4c 54 20 20 20 20 20 31 36 0d 0a 20 20 20 20 20  LT     16..     
56a0: 20 20 20 2f 2f 2f 20 23 64 65 66 69 6e 65 20 53     /// #define S
56b0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
56c0: 54 52 41 49 4e 54 5f 47 45 20 20 20 20 20 33 32  TRAINT_GE     32
56d0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 23 64  ..        /// #d
56e0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 44  efine SQLITE_IND
56f0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41  EX_CONSTRAINT_MA
5700: 54 43 48 20 20 36 34 0d 0a 20 20 20 20 20 20 20  TCH  64..       
5710: 20 2f 2f 2f 20 23 64 65 66 69 6e 65 20 53 51 4c   /// #define SQL
5720: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
5730: 41 49 4e 54 5f 4c 49 4b 45 20 20 20 36 35 20 20  AINT_LIKE   65  
5740: 20 20 20 2f 2a 20 33 2e 31 30 2e 30 20 61 6e 64     /* 3.10.0 and
5750: 20 6c 61 74 65 72 20 6f 6e 6c 79 20 2a 2f 0d 0a   later only */..
5760: 20 20 20 20 20 20 20 20 2f 2f 2f 20 23 64 65 66          /// #def
5770: 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ine SQLITE_INDEX
5780: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 4c 4f 42  _CONSTRAINT_GLOB
5790: 20 20 20 36 36 20 20 20 20 20 2f 2a 20 33 2e 31     66     /* 3.1
57a0: 30 2e 30 20 61 6e 64 20 6c 61 74 65 72 20 6f 6e  0.0 and later on
57b0: 6c 79 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f  ly */..        /
57c0: 2f 2f 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54  // #define SQLIT
57d0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
57e0: 4e 54 5f 52 45 47 45 58 50 20 36 37 20 20 20 20  NT_REGEXP 67    
57f0: 20 2f 2a 20 33 2e 31 30 2e 30 20 61 6e 64 20 6c   /* 3.10.0 and l
5800: 61 74 65 72 20 6f 6e 6c 79 20 2a 2f 0d 0a 20 20  ater only */..  
5810: 20 20 20 20 20 20 2f 2f 2f 20 23 64 65 66 69 6e        /// #defin
5820: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  e SQLITE_INDEX_S
5830: 43 41 4e 5f 55 4e 49 51 55 45 20 20 20 20 20 20  CAN_UNIQUE      
5840: 20 20 31 20 20 20 20 20 2f 2a 20 53 63 61 6e 20    1     /* Scan 
5850: 76 69 73 69 74 73 20 61 74 20 6d 6f 73 74 20 31  visits at most 1
5860: 20 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20   row */..       
5870: 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61   /// </code></pa
5880: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
5890: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
58a0: 20 2f 2f 2f 20 54 68 65 20 53 51 4c 69 74 65 20   /// The SQLite 
58b0: 63 6f 72 65 20 63 61 6c 6c 73 20 74 68 65 20 78  core calls the x
58c0: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
58d0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6f 6d 70   when it is comp
58e0: 69 6c 69 6e 67 20 61 20 71 75 65 72 79 0d 0a 20  iling a query.. 
58f0: 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 61 74 20         /// that 
5900: 69 6e 76 6f 6c 76 65 73 20 61 20 76 69 72 74 75  involves a virtu
5910: 61 6c 20 74 61 62 6c 65 2e 20 49 6e 20 6f 74 68  al table. In oth
5920: 65 72 20 77 6f 72 64 73 2c 20 53 51 4c 69 74 65  er words, SQLite
5930: 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68   calls this meth
5940: 6f 64 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  od ..        ///
5950: 20 77 68 65 6e 20 69 74 20 69 73 20 72 75 6e 6e   when it is runn
5960: 69 6e 67 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ing sqlite3_prep
5970: 61 72 65 28 29 20 6f 72 20 74 68 65 20 65 71 75  are() or the equ
5980: 69 76 61 6c 65 6e 74 2e 20 0d 0a 20 20 20 20 20  ivalent. ..     
5990: 20 20 20 2f 2f 2f 20 42 79 20 63 61 6c 6c 69 6e     /// By callin
59a0: 67 20 74 68 69 73 20 6d 65 74 68 6f 64 2c 20 74  g this method, t
59b0: 68 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  he ..        ///
59c0: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 69 73 20   SQLite core is 
59d0: 73 61 79 69 6e 67 20 74 6f 20 74 68 65 20 76 69  saying to the vi
59e0: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74  rtual table that
59f0: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61 63 63   it needs to acc
5a00: 65 73 73 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ess ..        //
5a10: 2f 20 73 6f 6d 65 20 73 75 62 73 65 74 20 6f 66  / some subset of
5a20: 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
5a30: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61   virtual table a
5a40: 6e 64 20 69 74 20 77 61 6e 74 73 20 74 6f 20 6b  nd it wants to k
5a50: 6e 6f 77 20 74 68 65 0d 0a 20 20 20 20 20 20 20  now the..       
5a60: 20 2f 2f 2f 20 6d 6f 73 74 20 65 66 66 69 63 69   /// most effici
5a70: 65 6e 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68  ent way to do th
5a80: 61 74 20 61 63 63 65 73 73 2e 20 54 68 65 20 78  at access. The x
5a90: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
5aa0: 20 72 65 70 6c 69 65 73 20 0d 0a 20 20 20 20 20   replies ..     
5ab0: 20 20 20 2f 2f 2f 20 77 69 74 68 20 69 6e 66 6f     /// with info
5ac0: 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 74 68 65  rmation that the
5ad0: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 63 61 6e   SQLite core can
5ae0: 20 74 68 65 6e 20 75 73 65 20 74 6f 20 63 6f 6e   then use to con
5af0: 64 75 63 74 20 61 6e 20 0d 0a 20 20 20 20 20 20  duct an ..      
5b00: 20 20 2f 2f 2f 20 65 66 66 69 63 69 65 6e 74 20    /// efficient 
5b10: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 76 69  search of the vi
5b20: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a 20 20  rtual table...  
5b30: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
5b40: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
5b50: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
5b60: 2f 2f 20 57 68 69 6c 65 20 63 6f 6d 70 69 6c 69  // While compili
5b70: 6e 67 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  ng a single SQL 
5b80: 71 75 65 72 79 2c 20 74 68 65 20 53 51 4c 69 74  query, the SQLit
5b90: 65 20 63 6f 72 65 20 6d 69 67 68 74 20 63 61 6c  e core might cal
5ba0: 6c 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  l ..        /// 
5bb0: 78 42 65 73 74 49 6e 64 65 78 20 6d 75 6c 74 69  xBestIndex multi
5bc0: 70 6c 65 20 74 69 6d 65 73 20 77 69 74 68 20 64  ple times with d
5bd0: 69 66 66 65 72 65 6e 74 20 73 65 74 74 69 6e 67  ifferent setting
5be0: 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  s in sqlite3_ind
5bf0: 65 78 5f 69 6e 66 6f 2e 0d 0a 20 20 20 20 20 20  ex_info...      
5c00: 20 20 2f 2f 2f 20 54 68 65 20 53 51 4c 69 74 65    /// The SQLite
5c10: 20 63 6f 72 65 20 77 69 6c 6c 20 74 68 65 6e 20   core will then 
5c20: 73 65 6c 65 63 74 20 74 68 65 20 63 6f 6d 62 69  select the combi
5c30: 6e 61 74 69 6f 6e 20 74 68 61 74 20 61 70 70 65  nation that appe
5c40: 61 72 73 20 74 6f 20 0d 0a 20 20 20 20 20 20 20  ars to ..       
5c50: 20 2f 2f 2f 20 67 69 76 65 20 74 68 65 20 62 65   /// give the be
5c60: 73 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0d  st performance..
5c70: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
5c80: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
5c90: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
5ca0: 20 20 2f 2f 2f 20 42 65 66 6f 72 65 20 63 61 6c    /// Before cal
5cb0: 6c 69 6e 67 20 74 68 69 73 20 6d 65 74 68 6f 64  ling this method
5cc0: 2c 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  , the SQLite cor
5cd0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e  e initializes an
5ce0: 20 69 6e 73 74 61 6e 63 65 20 0d 0a 20 20 20 20   instance ..    
5cf0: 20 20 20 20 2f 2f 2f 20 6f 66 20 74 68 65 20 73      /// of the s
5d00: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
5d10: 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  o structure with
5d20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
5d30: 75 74 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  ut the..        
5d40: 2f 2f 2f 20 71 75 65 72 79 20 74 68 61 74 20 69  /// query that i
5d50: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74  t is currently t
5d60: 72 79 69 6e 67 20 74 6f 20 70 72 6f 63 65 73 73  rying to process
5d70: 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
5d80: 6f 6e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  on ..        ///
5d90: 20 64 65 72 69 76 65 73 20 6d 61 69 6e 6c 79 20   derives mainly 
5da0: 66 72 6f 6d 20 74 68 65 20 57 48 45 52 45 20 63  from the WHERE c
5db0: 6c 61 75 73 65 20 61 6e 64 20 4f 52 44 45 52 20  lause and ORDER 
5dc0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
5dd0: 6c 61 75 73 65 73 20 0d 0a 20 20 20 20 20 20 20  lauses ..       
5de0: 20 2f 2f 2f 20 6f 66 20 74 68 65 20 71 75 65 72   /// of the quer
5df0: 79 2c 20 62 75 74 20 61 6c 73 6f 20 66 72 6f 6d  y, but also from
5e00: 20 61 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   any ON or USING
5e10: 20 63 6c 61 75 73 65 73 20 69 66 20 74 68 65 20   clauses if the 
5e20: 71 75 65 72 79 20 69 73 20 61 20 0d 0a 20 20 20  query is a ..   
5e30: 20 20 20 20 20 2f 2f 2f 20 6a 6f 69 6e 2e 20 54       /// join. T
5e40: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  he information t
5e50: 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 63  hat the SQLite c
5e60: 6f 72 65 20 70 72 6f 76 69 64 65 73 20 74 6f 20  ore provides to 
5e70: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 0d  the xBestIndex .
5e80: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d 65 74  .        /// met
5e90: 68 6f 64 20 69 73 20 68 65 6c 64 20 69 6e 20 74  hod is held in t
5ea0: 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  he part of the s
5eb0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
5ec0: 20 6d 61 72 6b 65 64 20 61 73 20 22 49 6e 70 75   marked as "Inpu
5ed0: 74 73 22 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f  ts". ..        /
5ee0: 2f 2f 20 54 68 65 20 22 4f 75 74 70 75 74 73 22  // The "Outputs"
5ef0: 20 73 65 63 74 69 6f 6e 20 69 73 20 69 6e 69 74   section is init
5f00: 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2e  ialized to zero.
5f10: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
5f20: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
5f30: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
5f40: 20 20 20 2f 2f 2f 20 54 68 65 20 69 6e 66 6f 72     /// The infor
5f50: 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 71  mation in the sq
5f60: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
5f70: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70   structure is ep
5f80: 68 65 6d 65 72 61 6c 0d 0a 20 20 20 20 20 20 20  hemeral..       
5f90: 20 2f 2f 2f 20 61 6e 64 20 6d 61 79 20 62 65 20   /// and may be 
5fa0: 6f 76 65 72 77 72 69 74 74 65 6e 20 6f 72 20 64  overwritten or d
5fb0: 65 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 73 6f  eallocated as so
5fc0: 6f 6e 20 61 73 20 74 68 65 20 78 42 65 73 74 49  on as the xBestI
5fd0: 6e 64 65 78 20 6d 65 74 68 6f 64 0d 0a 20 20 20  ndex method..   
5fe0: 20 20 20 20 20 2f 2f 2f 20 72 65 74 75 72 6e 73       /// returns
5ff0: 2e 20 20 49 66 20 74 68 65 20 78 42 65 73 74 49  .  If the xBestI
6000: 6e 64 65 78 20 6d 65 74 68 6f 64 20 6e 65 65 64  ndex method need
6010: 73 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 61 6e  s to remember an
6020: 79 20 70 61 72 74 20 6f 66 20 74 68 65 0d 0a 20  y part of the.. 
6030: 20 20 20 20 20 20 20 2f 2f 2f 20 73 71 6c 69 74         /// sqlit
6040: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
6050: 72 75 63 74 75 72 65 2c 20 69 74 20 73 68 6f 75  ructure, it shou
6060: 6c 64 20 6d 61 6b 65 20 61 20 63 6f 70 79 2e 20  ld make a copy. 
6070: 20 43 61 72 65 20 6d 75 73 74 20 62 65 0d 0a 20   Care must be.. 
6080: 20 20 20 20 20 20 20 2f 2f 2f 20 74 61 6b 65 20         /// take 
6090: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
60a0: 79 20 69 6e 20 61 20 70 6c 61 63 65 20 77 68 65  y in a place whe
60b0: 72 65 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65  re it will be de
60c0: 61 6c 6c 6f 63 61 74 65 64 2c 20 73 75 63 68 0d  allocated, such.
60d0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 73 20  .        /// as 
60e0: 69 6e 20 74 68 65 20 69 64 78 53 74 72 20 66 69  in the idxStr fi
60f0: 65 6c 64 20 77 69 74 68 20 6e 65 65 64 54 6f 46  eld with needToF
6100: 72 65 65 49 64 78 53 74 72 20 73 65 74 20 74 6f  reeIdxStr set to
6110: 20 31 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   1...        ///
6120: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
6130: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
6140: 20 20 20 20 20 20 2f 2f 2f 20 4e 6f 74 65 20 74        /// Note t
6150: 68 61 74 20 78 42 65 73 74 49 6e 64 65 78 20 77  hat xBestIndex w
6160: 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 63 61  ill always be ca
6170: 6c 6c 65 64 20 62 65 66 6f 72 65 20 78 46 69 6c  lled before xFil
6180: 74 65 72 2c 20 73 69 6e 63 65 0d 0a 20 20 20 20  ter, since..    
6190: 20 20 20 20 2f 2f 2f 20 74 68 65 20 69 64 78 4e      /// the idxN
61a0: 75 6d 20 61 6e 64 20 69 64 78 53 74 72 20 6f 75  um and idxStr ou
61b0: 74 70 75 74 73 20 66 72 6f 6d 20 78 42 65 73 74  tputs from xBest
61c0: 49 6e 64 65 78 20 61 72 65 20 72 65 71 75 69 72  Index are requir
61d0: 65 64 20 69 6e 70 75 74 73 20 74 6f 0d 0a 20 20  ed inputs to..  
61e0: 20 20 20 20 20 20 2f 2f 2f 20 78 46 69 6c 74 65        /// xFilte
61f0: 72 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 68 65  r.  However, the
6200: 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74  re is no guarant
6210: 65 65 20 74 68 61 74 20 78 46 69 6c 74 65 72 20  ee that xFilter 
6220: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 0d 0a  will be called..
6230: 20 20 20 20 20 20 20 20 2f 2f 2f 20 66 6f 6c 6c          /// foll
6240: 6f 77 69 6e 67 20 61 20 73 75 63 63 65 73 73 66  owing a successf
6250: 75 6c 20 78 42 65 73 74 49 6e 64 65 78 2e 20 20  ul xBestIndex.  
6260: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
6270: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
6280: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
6290: 20 20 20 2f 2f 2f 20 54 68 65 20 78 42 65 73 74     /// The xBest
62a0: 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 69 73 20  Index method is 
62b0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 76 65  required for eve
62c0: 72 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ry virtual table
62d0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
62e0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
62f0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
6300: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
6310: 20 20 20 2f 2f 2f 20 54 68 65 20 6d 61 69 6e 20     /// The main 
6320: 74 68 69 6e 67 20 74 68 61 74 20 74 68 65 20 53  thing that the S
6330: 51 4c 69 74 65 20 63 6f 72 65 20 69 73 20 74 72  QLite core is tr
6340: 79 69 6e 67 20 74 6f 20 63 6f 6d 6d 75 6e 69 63  ying to communic
6350: 61 74 65 20 74 6f 20 0d 0a 20 20 20 20 20 20 20  ate to ..       
6360: 20 2f 2f 2f 20 74 68 65 20 76 69 72 74 75 61 6c   /// the virtual
6370: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 63 6f   table is the co
6380: 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 61  nstraints that a
6390: 72 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  re available to 
63a0: 6c 69 6d 69 74 20 0d 0a 20 20 20 20 20 20 20 20  limit ..        
63b0: 2f 2f 2f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  /// the number o
63c0: 66 20 72 6f 77 73 20 74 68 61 74 20 6e 65 65 64  f rows that need
63d0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 2e   to be searched.
63e0: 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74   The aConstraint
63f0: 5b 5d 20 61 72 72 61 79 20 0d 0a 20 20 20 20 20  [] array ..     
6400: 20 20 20 2f 2f 2f 20 63 6f 6e 74 61 69 6e 73 20     /// contains 
6410: 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
6420: 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54  ch constraint. T
6430: 68 65 72 65 20 77 69 6c 6c 20 62 65 20 65 78 61  here will be exa
6440: 63 74 6c 79 20 0d 0a 20 20 20 20 20 20 20 20 2f  ctly ..        /
6450: 2f 2f 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 65  // nConstraint e
6460: 6e 74 72 69 65 73 20 69 6e 20 74 68 61 74 20 61  ntries in that a
6470: 72 72 61 79 2e 0d 0a 20 20 20 20 20 20 20 20 2f  rray...        /
6480: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
6490: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
64a0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 45 61 63 68          /// Each
64b0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 69 6c 6c   constraint will
64c0: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 61   correspond to a
64d0: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
64e0: 52 45 20 63 6c 61 75 73 65 0d 0a 20 20 20 20 20  RE clause..     
64f0: 20 20 20 2f 2f 2f 20 6f 72 20 69 6e 20 61 20 55     /// or in a U
6500: 53 49 4e 47 20 6f 72 20 4f 4e 20 63 6c 61 75 73  SING or ON claus
6510: 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65  e that is of the
6520: 20 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 2f   form..        /
6530: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
6540: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63      /// <para><c
6550: 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ode>..        //
6560: 2f 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20 4f  /      column  O
6570: 50 20 20 45 58 50 52 0d 0a 20 20 20 20 20 20 20  P  EXPR..       
6580: 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61   /// </code></pa
6590: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
65a0: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
65b0: 20 2f 2f 2f 20 57 68 65 72 65 20 22 63 6f 6c 75   /// Where "colu
65c0: 6d 6e 22 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  mn" is a column 
65d0: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  in the virtual t
65e0: 61 62 6c 65 2c 20 4f 50 20 69 73 20 61 6e 20 6f  able, OP is an o
65f0: 70 65 72 61 74 6f 72 20 0d 0a 20 20 20 20 20 20  perator ..      
6600: 20 20 2f 2f 2f 20 6c 69 6b 65 20 22 3d 22 20 6f    /// like "=" o
6610: 72 20 22 26 6c 74 3b 22 2c 20 61 6e 64 20 45 58  r "&lt;", and EX
6620: 50 52 20 69 73 20 61 6e 20 61 72 62 69 74 72 61  PR is an arbitra
6630: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 53  ry expression. S
6640: 6f 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 0d  o, for example,.
6650: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 66 20  .        /// if 
6660: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
6670: 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 74 65 72   contained a ter
6680: 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0d 0a 20 20  m like this:..  
6690: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
66a0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
66b0: 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20  para><code>..   
66c0: 20 20 20 20 20 2f 2f 2f 20 61 20 3d 20 35 0d 0a       /// a = 5..
66d0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f          /// </co
66e0: 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  de></para>..    
66f0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
6700: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 6e          /// Then
6710: 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f 6e 73   one of the cons
6720: 74 72 61 69 6e 74 73 20 77 6f 75 6c 64 20 62 65  traints would be
6730: 20 6f 6e 20 74 68 65 20 22 61 22 20 63 6f 6c 75   on the "a" colu
6740: 6d 6e 20 77 69 74 68 20 0d 0a 20 20 20 20 20 20  mn with ..      
6750: 20 20 2f 2f 2f 20 6f 70 65 72 61 74 6f 72 20 22    /// operator "
6760: 3d 22 20 61 6e 64 20 61 6e 20 65 78 70 72 65 73  =" and an expres
6770: 73 69 6f 6e 20 6f 66 20 22 35 22 2e 20 43 6f 6e  sion of "5". Con
6780: 73 74 72 61 69 6e 74 73 20 6e 65 65 64 20 6e 6f  straints need no
6790: 74 20 68 61 76 65 20 61 0d 0a 20 20 20 20 20 20  t have a..      
67a0: 20 20 2f 2f 2f 20 6c 69 74 65 72 61 6c 20 72 65    /// literal re
67b0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
67c0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
67d0: 2e 20 54 68 65 20 71 75 65 72 79 20 6f 70 74 69  . The query opti
67e0: 6d 69 7a 65 72 20 6d 69 67 68 74 0d 0a 20 20 20  mizer might..   
67f0: 20 20 20 20 20 2f 2f 2f 20 6d 61 6b 65 20 74 72       /// make tr
6800: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 74 6f  ansformations to
6810: 20 74 68 65 20 0d 0a 20 20 20 20 20 20 20 20 2f   the ..        /
6820: 2f 2f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  // WHERE clause 
6830: 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 74 72  in order to extr
6840: 61 63 74 20 61 73 20 6d 61 6e 79 20 63 6f 6e 73  act as many cons
6850: 74 72 61 69 6e 74 73 20 0d 0a 20 20 20 20 20 20  traints ..      
6860: 20 20 2f 2f 2f 20 61 73 20 69 74 20 63 61 6e 2e    /// as it can.
6870: 20 53 6f 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   So, for example
6880: 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  , if the WHERE c
6890: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 65 64 20  lause contained 
68a0: 73 6f 6d 65 74 68 69 6e 67 20 0d 0a 20 20 20 20  something ..    
68b0: 20 20 20 20 2f 2f 2f 20 6c 69 6b 65 20 74 68 69      /// like thi
68c0: 73 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  s:..        /// 
68d0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
68e0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65   /// <para><code
68f0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 78  >..        /// x
6900: 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20   BETWEEN 10 AND 
6910: 31 30 30 20 41 4e 44 20 39 39 39 26 67 74 3b 79  100 AND 999&gt;y
6920: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
6930: 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20  code></para>..  
6940: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
6950: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
6960: 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
6970: 72 20 6d 69 67 68 74 20 74 72 61 6e 73 6c 61 74  r might translat
6980: 65 20 74 68 69 73 20 69 6e 74 6f 20 74 68 72 65  e this into thre
6990: 65 20 73 65 70 61 72 61 74 65 20 63 6f 6e 73 74  e separate const
69a0: 72 61 69 6e 74 73 3a 0d 0a 20 20 20 20 20 20 20  raints:..       
69b0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
69c0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
69d0: 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20  <code>..        
69e0: 2f 2f 2f 20 78 20 26 67 74 3b 3d 20 31 30 0d 0a  /// x &gt;= 10..
69f0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 78 20 26 6c          /// x &l
6a00: 74 3b 3d 20 31 30 30 0d 0a 20 20 20 20 20 20 20  t;= 100..       
6a10: 20 2f 2f 2f 20 79 20 26 6c 74 3b 20 39 39 39 0d   /// y &lt; 999.
6a20: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63  .        /// </c
6a30: 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  ode></para>..   
6a40: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
6a50: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 46 6f 72  .        /// For
6a60: 20 65 61 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   each constraint
6a70: 2c 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e  , the aConstrain
6a80: 74 5b 5d 2e 69 43 6f 6c 75 6d 6e 20 66 69 65 6c  t[].iColumn fiel
6a90: 64 20 69 6e 64 69 63 61 74 65 73 20 77 68 69 63  d indicates whic
6aa0: 68 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  h ..        /// 
6ab0: 63 6f 6c 75 6d 6e 20 61 70 70 65 61 72 73 20 6f  column appears o
6ac0: 6e 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  n the left-hand 
6ad0: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6e 73  side of the cons
6ae0: 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20  traint...       
6af0: 20 2f 2f 2f 20 54 68 65 20 66 69 72 73 74 20 63   /// The first c
6b00: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 69 72  olumn of the vir
6b10: 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 63 6f  tual table is co
6b20: 6c 75 6d 6e 20 30 2e 20 0d 0a 20 20 20 20 20 20  lumn 0. ..      
6b30: 20 20 2f 2f 2f 20 54 68 65 20 72 6f 77 69 64 20    /// The rowid 
6b40: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
6b50: 61 62 6c 65 20 69 73 20 63 6f 6c 75 6d 6e 20 2d  able is column -
6b60: 31 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  1. ..        ///
6b70: 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74   The aConstraint
6b80: 5b 5d 2e 6f 70 20 66 69 65 6c 64 20 69 6e 64 69  [].op field indi
6b90: 63 61 74 65 73 20 77 68 69 63 68 20 6f 70 65 72  cates which oper
6ba0: 61 74 6f 72 20 69 73 20 75 73 65 64 2e 20 0d 0a  ator is used. ..
6bb0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
6bc0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
6bd0: 53 54 52 41 49 4e 54 5f 2a 20 63 6f 6e 73 74 61  STRAINT_* consta
6be0: 6e 74 73 20 6d 61 70 20 69 6e 74 65 67 65 72 20  nts map integer 
6bf0: 63 6f 6e 73 74 61 6e 74 73 20 0d 0a 20 20 20 20  constants ..    
6c00: 20 20 20 20 2f 2f 2f 20 69 6e 74 6f 20 6f 70 65      /// into ope
6c10: 72 61 74 6f 72 20 76 61 6c 75 65 73 2e 0d 0a 20  rator values... 
6c20: 20 20 20 20 20 20 20 2f 2f 2f 20 43 6f 6c 75 6d         /// Colum
6c30: 6e 73 20 6f 63 63 75 72 20 69 6e 20 74 68 65 20  ns occur in the 
6c40: 6f 72 64 65 72 20 74 68 65 79 20 77 65 72 65 20  order they were 
6c50: 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 63  defined by the c
6c60: 61 6c 6c 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  all to..        
6c70: 2f 2f 2f 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  /// sqlite3_decl
6c80: 61 72 65 5f 76 74 61 62 28 29 20 69 6e 20 74 68  are_vtab() in th
6c90: 65 20 78 43 72 65 61 74 65 20 6f 72 20 78 43 6f  e xCreate or xCo
6ca0: 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0d 0a 20  nnect method... 
6cb0: 20 20 20 20 20 20 20 2f 2f 2f 20 48 69 64 64 65         /// Hidde
6cc0: 6e 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f  n columns are co
6cd0: 75 6e 74 65 64 20 77 68 65 6e 20 64 65 74 65 72  unted when deter
6ce0: 6d 69 6e 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  mining the colum
6cf0: 6e 20 69 6e 64 65 78 2e 0d 0a 20 20 20 20 20 20  n index...      
6d00: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
6d10: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
6d20: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
6d30: 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  he aConstraint[]
6d40: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
6d50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
6d60: 74 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  t all constraint
6d70: 73 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  s ..        /// 
6d80: 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20 74 68  that apply to th
6d90: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
6da0: 20 42 75 74 20 73 6f 6d 65 20 6f 66 20 74 68 65   But some of the
6db0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6d 69 67   constraints mig
6dc0: 68 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ht..        /// 
6dd0: 6e 6f 74 20 62 65 20 75 73 61 62 6c 65 20 62 65  not be usable be
6de0: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
6df0: 20 74 61 62 6c 65 73 20 61 72 65 20 6f 72 64 65   tables are orde
6e00: 72 65 64 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 0d  red in a join. .
6e10: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
6e20: 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
6e30: 6f 64 20 6d 75 73 74 20 74 68 65 72 65 66 6f 72  od must therefor
6e40: 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20  e only consider 
6e50: 63 6f 6e 73 74 72 61 69 6e 74 73 20 0d 0a 20 20  constraints ..  
6e60: 20 20 20 20 20 20 2f 2f 2f 20 74 68 61 74 20 68        /// that h
6e70: 61 76 65 20 61 6e 20 61 43 6f 6e 73 74 72 61 69  ave an aConstrai
6e80: 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66 6c 61 67  nt[].usable flag
6e90: 20 77 68 69 63 68 20 69 73 20 74 72 75 65 2e 0d   which is true..
6ea0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
6eb0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
6ec0: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
6ed0: 20 20 2f 2f 2f 20 49 6e 20 61 64 64 69 74 69 6f    /// In additio
6ee0: 6e 20 74 6f 20 57 48 45 52 45 20 63 6c 61 75 73  n to WHERE claus
6ef0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  e constraints, t
6f00: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 61  he SQLite core a
6f10: 6c 73 6f 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  lso ..        //
6f20: 2f 20 74 65 6c 6c 73 20 74 68 65 20 78 42 65 73  / tells the xBes
6f30: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 61 62  tIndex method ab
6f40: 6f 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59  out the ORDER BY
6f50: 20 63 6c 61 75 73 65 2e 20 0d 0a 20 20 20 20 20   clause. ..     
6f60: 20 20 20 2f 2f 2f 20 28 49 6e 20 61 6e 20 61 67     /// (In an ag
6f70: 67 72 65 67 61 74 65 20 71 75 65 72 79 2c 20 74  gregate query, t
6f80: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6d  he SQLite core m
6f90: 69 67 68 74 20 70 75 74 20 69 6e 20 47 52 4f 55  ight put in GROU
6fa0: 50 20 42 59 20 63 6c 61 75 73 65 20 0d 0a 20 20  P BY clause ..  
6fb0: 20 20 20 20 20 20 2f 2f 2f 20 69 6e 66 6f 72 6d        /// inform
6fc0: 61 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65 20 6f  ation in place o
6fd0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
6fe0: 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
6ff0: 6e 2c 20 62 75 74 20 74 68 69 73 20 66 61 63 74  n, but this fact
7000: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 68  ..        /// sh
7010: 6f 75 6c 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e  ould not make an
7020: 79 20 64 69 66 66 65 72 65 6e 63 65 20 74 6f 20  y difference to 
7030: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
7040: 65 74 68 6f 64 2e 29 20 0d 0a 20 20 20 20 20 20  ethod.) ..      
7050: 20 20 2f 2f 2f 20 49 66 20 61 6c 6c 20 74 65 72    /// If all ter
7060: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
7070: 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f  BY clause are co
7080: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 69 72  lumns in the vir
7090: 74 75 61 6c 20 74 61 62 6c 65 2c 20 0d 0a 20 20  tual table, ..  
70a0: 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 6e 20 6e        /// then n
70b0: 4f 72 64 65 72 42 79 20 77 69 6c 6c 20 62 65 20  OrderBy will be 
70c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  the number of te
70d0: 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
70e0: 20 42 59 20 63 6c 61 75 73 65 20 0d 0a 20 20 20   BY clause ..   
70f0: 20 20 20 20 20 2f 2f 2f 20 61 6e 64 20 74 68 65       /// and the
7100: 20 61 4f 72 64 65 72 42 79 5b 5d 20 61 72 72 61   aOrderBy[] arra
7110: 79 20 77 69 6c 6c 20 69 64 65 6e 74 69 66 79 20  y will identify 
7120: 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 65  the column for e
7130: 61 63 68 20 74 65 72 6d 20 0d 0a 20 20 20 20 20  ach term ..     
7140: 20 20 20 2f 2f 2f 20 69 6e 20 74 68 65 20 6f 72     /// in the or
7150: 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 61 6e  der by clause an
7160: 64 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  d whether or not
7170: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73 20   that column is 
7180: 41 53 43 20 6f 72 20 44 45 53 43 2e 0d 0a 20 20  ASC or DESC...  
7190: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
71a0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
71b0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
71c0: 2f 2f 20 49 6e 20 53 51 4c 69 74 65 20 76 65 72  // In SQLite ver
71d0: 73 69 6f 6e 20 33 2e 31 30 2e 30 20 61 6e 64 20  sion 3.10.0 and 
71e0: 6c 61 74 65 72 2c 20 74 68 65 20 63 6f 6c 55 73  later, the colUs
71f0: 65 64 20 66 69 65 6c 64 20 69 73 20 61 76 61 69  ed field is avai
7200: 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 2f  lable..        /
7210: 2f 2f 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  // to indicate w
7220: 68 69 63 68 20 66 69 65 6c 64 73 20 6f 66 20 74  hich fields of t
7230: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
7240: 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73   are actually us
7250: 65 64 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20  ed by the..     
7260: 20 20 20 2f 2f 2f 20 73 74 61 74 65 6d 65 6e 74     /// statement
7270: 20 62 65 69 6e 67 20 70 72 65 70 61 72 65 64 2e   being prepared.
7280: 20 20 49 66 20 74 68 65 20 6c 6f 77 65 73 74 20    If the lowest 
7290: 62 69 74 20 6f 66 20 63 6f 6c 55 73 65 64 20 69  bit of colUsed i
72a0: 73 20 73 65 74 2c 20 74 68 61 74 0d 0a 20 20 20  s set, that..   
72b0: 20 20 20 20 20 2f 2f 2f 20 6d 65 61 6e 73 20 74       /// means t
72c0: 68 61 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  hat the first co
72d0: 6c 75 6d 6e 20 69 73 20 75 73 65 64 2e 20 20 54  lumn is used.  T
72e0: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 77 65 73 74  he second lowest
72f0: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73   bit corresponds
7300: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f  ..        /// to
7310: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6c 75   the second colu
7320: 6d 6e 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  mn.  And so fort
7330: 68 2e 20 20 49 66 20 74 68 65 20 6d 6f 73 74 20  h.  If the most 
7340: 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74 20  significant bit 
7350: 6f 66 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  of..        /// 
7360: 63 6f 6c 55 73 65 64 20 69 73 20 73 65 74 2c 20  colUsed is set, 
7370: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
7380: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  one or more colu
7390: 6d 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  mns other than t
73a0: 68 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  he ..        ///
73b0: 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e   first 63 column
73c0: 73 20 61 72 65 20 75 73 65 64 2e 20 20 49 66 20  s are used.  If 
73d0: 63 6f 6c 75 6d 6e 20 75 73 61 67 65 20 69 6e 66  column usage inf
73e0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
73f0: 65 64 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20  ed by the..     
7400: 20 20 20 2f 2f 2f 20 78 46 69 6c 74 65 72 20 6d     /// xFilter m
7410: 65 74 68 6f 64 2c 20 74 68 65 6e 20 74 68 65 20  ethod, then the 
7420: 72 65 71 75 69 72 65 64 20 62 69 74 73 20 6d 75  required bits mu
7430: 73 74 20 62 65 20 65 6e 63 6f 64 65 64 20 69 6e  st be encoded in
7440: 74 6f 20 65 69 74 68 65 72 0d 0a 20 20 20 20 20  to either..     
7450: 20 20 20 2f 2f 2f 20 74 68 65 20 69 64 78 4e 75     /// the idxNu
7460: 6d 20 6f 72 20 69 64 78 53 74 72 20 6f 75 74 70  m or idxStr outp
7470: 75 74 20 66 69 65 6c 64 73 2e 0d 0a 20 20 20 20  ut fields...    
7480: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
7490: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
74a0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
74b0: 20 47 69 76 65 6e 20 61 6c 6c 20 6f 66 20 74 68   Given all of th
74c0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
74d0: 6f 76 65 2c 20 74 68 65 20 6a 6f 62 20 6f 66 20  ove, the job of 
74e0: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 0d  the xBestIndex .
74f0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d 65 74  .        /// met
7500: 68 6f 64 20 69 74 20 74 6f 20 66 69 67 75 72 65  hod it to figure
7510: 20 6f 75 74 20 74 68 65 20 62 65 73 74 20 77 61   out the best wa
7520: 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20  y to search the 
7530: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a  virtual table...
7540: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
7550: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
7560: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
7570: 20 2f 2f 2f 20 54 68 65 20 78 42 65 73 74 49 6e   /// The xBestIn
7580: 64 65 78 20 6d 65 74 68 6f 64 20 66 69 6c 6c 73  dex method fills
7590: 20 74 68 65 20 69 64 78 4e 75 6d 20 61 6e 64 20   the idxNum and 
75a0: 69 64 78 53 74 72 20 66 69 65 6c 64 73 20 77 69  idxStr fields wi
75b0: 74 68 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  th ..        ///
75c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
75d0: 74 20 63 6f 6d 6d 75 6e 69 63 61 74 65 73 20 61  t communicates a
75e0: 6e 20 69 6e 64 65 78 69 6e 67 20 73 74 72 61 74  n indexing strat
75f0: 65 67 79 20 74 6f 20 74 68 65 20 78 46 69 6c 74  egy to the xFilt
7600: 65 72 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  er ..        ///
7610: 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 69 6e 66   method. The inf
7620: 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 69 64 78 4e  ormation in idxN
7630: 75 6d 20 61 6e 64 20 69 64 78 53 74 72 20 69 73  um and idxStr is
7640: 20 61 72 62 69 74 72 61 72 79 20 61 73 20 66 61   arbitrary as fa
7650: 72 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  r ..        /// 
7660: 61 73 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  as the SQLite co
7670: 72 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2e  re is concerned.
7680: 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   The SQLite core
7690: 20 6a 75 73 74 20 63 6f 70 69 65 73 20 74 68 65   just copies the
76a0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69   ..        /// i
76b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 72 6f 75  nformation throu
76c0: 67 68 20 74 6f 20 74 68 65 20 78 46 69 6c 74 65  gh to the xFilte
76d0: 72 20 6d 65 74 68 6f 64 2e 20 41 6e 79 20 64 65  r method. Any de
76e0: 73 69 72 65 64 20 6d 65 61 6e 69 6e 67 20 63 61  sired meaning ca
76f0: 6e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  n ..        /// 
7700: 62 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 69  be assigned to i
7710: 64 78 4e 75 6d 20 61 6e 64 20 69 64 78 53 74 72  dxNum and idxStr
7720: 20 61 73 20 6c 6f 6e 67 20 61 73 20 78 42 65 73   as long as xBes
7730: 74 49 6e 64 65 78 20 61 6e 64 20 78 46 69 6c 74  tIndex and xFilt
7740: 65 72 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  er ..        ///
7750: 20 61 67 72 65 65 20 6f 6e 20 77 68 61 74 20 74   agree on what t
7760: 68 61 74 20 6d 65 61 6e 69 6e 67 20 69 73 2e 0d  hat meaning is..
7770: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
7780: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
7790: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
77a0: 20 20 2f 2f 2f 20 54 68 65 20 69 64 78 53 74 72    /// The idxStr
77b0: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 61 20   value may be a 
77c0: 73 74 72 69 6e 67 20 6f 62 74 61 69 6e 65 64 20  string obtained 
77d0: 66 72 6f 6d 20 61 6e 20 53 51 4c 69 74 65 0d 0a  from an SQLite..
77e0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d 65 6d 6f          /// memo
77f0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75  ry allocation fu
7800: 6e 63 74 69 6f 6e 20 73 75 63 68 20 61 73 20 73  nction such as s
7810: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 29  qlite3_mprintf()
7820: 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  . ..        /// 
7830: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
7840: 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65  ase, then the ne
7850: 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 66  edToFreeIdxStr f
7860: 6c 61 67 20 6d 75 73 74 20 62 65 20 73 65 74 20  lag must be set 
7870: 74 6f 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  to ..        ///
7880: 20 74 72 75 65 20 73 6f 20 74 68 61 74 20 74 68   true so that th
7890: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 69  e SQLite core wi
78a0: 6c 6c 20 6b 6e 6f 77 20 74 6f 20 63 61 6c 6c 20  ll know to call 
78b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f  sqlite3_free() o
78c0: 6e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  n ..        /// 
78d0: 74 68 61 74 20 73 74 72 69 6e 67 20 77 68 65 6e  that string when
78e0: 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64   it has finished
78f0: 20 77 69 74 68 20 69 74 2c 20 61 6e 64 20 74 68   with it, and th
7900: 75 73 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  us avoid a memor
7910: 79 20 6c 65 61 6b 2e 0d 0a 20 20 20 20 20 20 20  y leak...       
7920: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
7930: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
7940: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 49 66  ..        /// If
7950: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
7960: 6c 65 20 77 69 6c 6c 20 6f 75 74 70 75 74 20 72  le will output r
7970: 6f 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72  ows in the order
7980: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 0d 0a   specified by ..
7990: 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20          /// the 
79a0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
79b0: 20 74 68 65 6e 20 74 68 65 20 6f 72 64 65 72 42   then the orderB
79c0: 79 43 6f 6e 73 75 6d 65 64 20 66 6c 61 67 20 6d  yConsumed flag m
79d0: 61 79 20 62 65 20 73 65 74 20 74 6f 20 0d 0a 20  ay be set to .. 
79e0: 20 20 20 20 20 20 20 2f 2f 2f 20 74 72 75 65 2e         /// true.
79f0: 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
7a00: 73 20 6e 6f 74 20 61 75 74 6f 6d 61 74 69 63 61  s not automatica
7a10: 6c 6c 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65  lly in the corre
7a20: 63 74 20 6f 72 64 65 72 20 0d 0a 20 20 20 20 20  ct order ..     
7a30: 20 20 20 2f 2f 2f 20 74 68 65 6e 20 6f 72 64 65     /// then orde
7a40: 72 42 79 43 6f 6e 73 75 6d 65 64 20 6d 75 73 74  rByConsumed must
7a50: 20 62 65 20 6c 65 66 74 20 69 6e 20 69 74 73 20   be left in its 
7a60: 64 65 66 61 75 6c 74 20 66 61 6c 73 65 20 73 65  default false se
7a70: 74 74 69 6e 67 2e 20 0d 0a 20 20 20 20 20 20 20  tting. ..       
7a80: 20 2f 2f 2f 20 54 68 69 73 20 77 69 6c 6c 20 69   /// This will i
7a90: 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65 20 53  ndicate to the S
7aa0: 51 4c 69 74 65 20 63 6f 72 65 20 74 68 61 74 20  QLite core that 
7ab0: 69 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  it will need to 
7ac0: 64 6f 20 61 20 0d 0a 20 20 20 20 20 20 20 20 2f  do a ..        /
7ad0: 2f 2f 20 73 65 70 61 72 61 74 65 20 73 6f 72 74  // separate sort
7ae0: 69 6e 67 20 70 61 73 73 20 6f 76 65 72 20 74 68  ing pass over th
7af0: 65 20 64 61 74 61 20 61 66 74 65 72 20 69 74 20  e data after it 
7b00: 63 6f 6d 65 73 20 6f 75 74 20 6f 66 20 74 68 65  comes out of the
7b10: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d   virtual table..
7b20: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
7b30: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
7b40: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
7b50: 20 20 2f 2f 2f 20 54 68 65 20 65 73 74 69 6d 61    /// The estima
7b60: 74 65 64 43 6f 73 74 20 66 69 65 6c 64 20 73 68  tedCost field sh
7b70: 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 74  ould be set to t
7b80: 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
7b90: 62 65 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ber..        ///
7ba0: 20 6f 66 20 64 69 73 6b 20 61 63 63 65 73 73 20   of disk access 
7bb0: 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69  operations requi
7bc0: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
7bd0: 68 69 73 20 71 75 65 72 79 20 61 67 61 69 6e 73  his query agains
7be0: 74 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  t ..        /// 
7bf0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
7c00: 65 2e 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f  e. The SQLite co
7c10: 72 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 63 61  re will often ca
7c20: 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 20 0d 0a  ll xBestIndex ..
7c30: 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d 75 6c 74          /// mult
7c40: 69 70 6c 65 20 74 69 6d 65 73 20 77 69 74 68 20  iple times with 
7c50: 64 69 66 66 65 72 65 6e 74 20 63 6f 6e 73 74 72  different constr
7c60: 61 69 6e 74 73 2c 20 6f 62 74 61 69 6e 20 6d 75  aints, obtain mu
7c70: 6c 74 69 70 6c 65 20 63 6f 73 74 0d 0a 20 20 20  ltiple cost..   
7c80: 20 20 20 20 20 2f 2f 2f 20 65 73 74 69 6d 61 74       /// estimat
7c90: 65 73 2c 20 74 68 65 6e 20 63 68 6f 6f 73 65 20  es, then choose 
7ca0: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 74  the query plan t
7cb0: 68 61 74 20 67 69 76 65 73 20 74 68 65 20 6c 6f  hat gives the lo
7cc0: 77 65 73 74 20 65 73 74 69 6d 61 74 65 2e 0d 0a  west estimate...
7cd0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
7ce0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
7cf0: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
7d00: 20 2f 2f 2f 20 49 66 20 74 68 65 20 63 75 72 72   /// If the curr
7d10: 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 53  ent version of S
7d20: 51 4c 69 74 65 20 69 73 20 33 2e 38 2e 32 20 6f  QLite is 3.8.2 o
7d30: 72 20 67 72 65 61 74 65 72 2c 20 74 68 65 20 65  r greater, the e
7d40: 73 74 69 6d 61 74 65 64 52 6f 77 73 0d 0a 20 20  stimatedRows..  
7d50: 20 20 20 20 20 20 2f 2f 2f 20 66 69 65 6c 64 20        /// field 
7d60: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
7d70: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
7d80: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
7d90: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0d  returned by the.
7da0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 70 72 6f  .        /// pro
7db0: 70 6f 73 65 64 20 71 75 65 72 79 20 70 6c 61 6e  posed query plan
7dc0: 2e 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20  . If this value 
7dd0: 69 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  is not explicitl
7de0: 79 20 73 65 74 2c 20 74 68 65 20 64 65 66 61 75  y set, the defau
7df0: 6c 74 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  lt ..        ///
7e00: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 32 35 20   estimate of 25 
7e10: 72 6f 77 73 20 69 73 20 75 73 65 64 2e 0d 0a 20  rows is used... 
7e20: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
7e30: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
7e40: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
7e50: 2f 2f 2f 20 49 66 20 74 68 65 20 63 75 72 72 65  /// If the curre
7e60: 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51  nt version of SQ
7e70: 4c 69 74 65 20 69 73 20 33 2e 39 2e 30 20 6f 72  Lite is 3.9.0 or
7e80: 20 67 72 65 61 74 65 72 2c 20 74 68 65 20 69 64   greater, the id
7e90: 78 46 6c 61 67 73 20 66 69 65 6c 64 0d 0a 20 20  xFlags field..  
7ea0: 20 20 20 20 20 20 2f 2f 2f 20 6d 61 79 20 62 65        /// may be
7eb0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
7ec0: 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45  NDEX_SCAN_UNIQUE
7ed0: 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
7ee0: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  t the virtual ta
7ef0: 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ble..        ///
7f00: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 6f 6e 6c   will return onl
7f10: 79 20 7a 65 72 6f 20 6f 72 20 6f 6e 65 20 72 6f  y zero or one ro
7f20: 77 73 20 67 69 76 65 6e 20 74 68 65 20 69 6e 70  ws given the inp
7f30: 75 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ut constraints. 
7f40: 20 41 64 64 69 74 69 6f 6e 61 6c 0d 0a 20 20 20   Additional..   
7f50: 20 20 20 20 20 2f 2f 2f 20 62 69 74 73 20 6f 66       /// bits of
7f60: 20 74 68 65 20 69 64 78 46 6c 61 67 73 20 66 69   the idxFlags fi
7f70: 65 6c 64 20 6d 69 67 68 74 20 62 65 20 75 6e 64  eld might be und
7f80: 65 72 73 74 6f 6f 64 20 69 6e 20 6c 61 74 65 72  erstood in later
7f90: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
7fa0: 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ite...        //
7fb0: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
7fc0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
7fd0: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 61         /// The a
7fe0: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
7ff0: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
8000: 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72   one element for
8010: 20 65 61 63 68 20 6f 66 20 0d 0a 20 20 20 20 20   each of ..     
8020: 20 20 20 2f 2f 2f 20 74 68 65 20 6e 43 6f 6e 73     /// the nCons
8030: 74 72 61 69 6e 74 20 63 6f 6e 73 74 72 61 69 6e  traint constrain
8040: 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 73  ts in the inputs
8050: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
8060: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 71  ..        /// sq
8070: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
8080: 20 73 74 72 75 63 74 75 72 65 2e 20 0d 0a 20 20   structure. ..  
8090: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 61 43        /// The aC
80a0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 5d  onstraintUsage[]
80b0: 20 61 72 72 61 79 20 69 73 20 75 73 65 64 20 62   array is used b
80c0: 79 20 78 42 65 73 74 49 6e 64 65 78 20 74 6f 20  y xBestIndex to 
80d0: 74 65 6c 6c 20 74 68 65 20 0d 0a 20 20 20 20 20  tell the ..     
80e0: 20 20 20 2f 2f 2f 20 63 6f 72 65 20 68 6f 77 20     /// core how 
80f0: 69 74 20 69 73 20 75 73 69 6e 67 20 74 68 65 20  it is using the 
8100: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20  constraints...  
8110: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
8120: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
8130: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
8140: 2f 2f 20 54 68 65 20 78 42 65 73 74 49 6e 64 65  // The xBestInde
8150: 78 20 6d 65 74 68 6f 64 20 6d 61 79 20 73 65 74  x method may set
8160: 20 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67   aConstraintUsag
8170: 65 5b 5d 2e 61 72 67 76 49 6e 64 65 78 20 0d 0a  e[].argvIndex ..
8180: 20 20 20 20 20 20 20 20 2f 2f 2f 20 65 6e 74 72          /// entr
8190: 69 65 73 20 74 6f 20 76 61 6c 75 65 73 20 67 72  ies to values gr
81a0: 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
81b0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 45   ..        /// E
81c0: 78 61 63 74 6c 79 20 6f 6e 65 20 65 6e 74 72 79  xactly one entry
81d0: 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 74   should be set t
81e0: 6f 20 31 2c 20 61 6e 6f 74 68 65 72 20 74 6f 20  o 1, another to 
81f0: 32 2c 20 61 6e 6f 74 68 65 72 20 74 6f 20 33 2c  2, another to 3,
8200: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61   ..        /// a
8210: 6e 64 20 73 6f 20 66 6f 72 74 68 20 75 70 20 74  nd so forth up t
8220: 6f 20 61 73 20 6d 61 6e 79 20 6f 72 20 61 73 20  o as many or as 
8230: 66 65 77 20 61 73 20 74 68 65 20 78 42 65 73 74  few as the xBest
8240: 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 77 61 6e  Index method wan
8250: 74 73 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ts. ..        //
8260: 2f 20 54 68 65 20 45 58 50 52 20 6f 66 20 74 68  / The EXPR of th
8270: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
8280: 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c  constraints will
8290: 20 74 68 65 6e 20 62 65 20 70 61 73 73 65 64 20   then be passed 
82a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e  ..        /// in
82b0: 20 61 73 20 74 68 65 20 61 72 67 76 5b 5d 20 70   as the argv[] p
82c0: 61 72 61 6d 65 74 65 72 73 20 74 6f 20 78 46 69  arameters to xFi
82d0: 6c 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 2f  lter...        /
82e0: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
82f0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
8300: 20 20 20 20 20 20 20 20 2f 2f 2f 20 46 6f 72 20          /// For 
8310: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
8320: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 33 5d 2e 61  aConstraint[3].a
8330: 72 67 76 49 6e 64 65 78 20 69 73 20 73 65 74 20  rgvIndex is set 
8340: 74 6f 20 31 2c 20 74 68 65 6e 20 0d 0a 20 20 20  to 1, then ..   
8350: 20 20 20 20 20 2f 2f 2f 20 77 68 65 6e 20 78 46       /// when xF
8360: 69 6c 74 65 72 20 69 73 20 63 61 6c 6c 65 64 2c  ilter is called,
8370: 20 74 68 65 20 61 72 67 76 5b 30 5d 20 70 61 73   the argv[0] pas
8380: 73 65 64 20 74 6f 20 78 46 69 6c 74 65 72 20 77  sed to xFilter w
8390: 69 6c 6c 20 68 61 76 65 20 0d 0a 20 20 20 20 20  ill have ..     
83a0: 20 20 20 2f 2f 2f 20 74 68 65 20 45 58 50 52 20     /// the EXPR 
83b0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 43 6f  value of the aCo
83c0: 6e 73 74 72 61 69 6e 74 5b 33 5d 20 63 6f 6e 73  nstraint[3] cons
83d0: 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20  traint...       
83e0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
83f0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
8400: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 42 79  ..        /// By
8410: 20 64 65 66 61 75 6c 74 2c 20 74 68 65 20 53 51   default, the SQ
8420: 4c 69 74 65 20 63 6f 72 65 20 64 6f 75 62 6c 65  Lite core double
8430: 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 6f 6e 73   checks all cons
8440: 74 72 61 69 6e 74 73 20 6f 6e 20 0d 0a 20 20 20  traints on ..   
8450: 20 20 20 20 20 2f 2f 2f 20 65 61 63 68 20 72 6f       /// each ro
8460: 77 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  w of the virtual
8470: 20 74 61 62 6c 65 20 74 68 61 74 20 69 74 20 72   table that it r
8480: 65 63 65 69 76 65 73 2e 20 49 66 20 73 75 63 68  eceives. If such
8490: 20 61 20 63 68 65 63 6b 20 0d 0a 20 20 20 20 20   a check ..     
84a0: 20 20 20 2f 2f 2f 20 69 73 20 72 65 64 75 6e 64     /// is redund
84b0: 61 6e 74 2c 20 74 68 65 20 78 42 65 73 74 46 69  ant, the xBestFi
84c0: 6c 74 65 72 20 6d 65 74 68 6f 64 20 63 61 6e 20  lter method can 
84d0: 73 75 70 70 72 65 73 73 20 74 68 61 74 20 64 6f  suppress that do
84e0: 75 62 6c 65 2d 63 68 65 63 6b 20 62 79 20 0d 0a  uble-check by ..
84f0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 65 74 74          /// sett
8500: 69 6e 67 20 61 43 6f 6e 73 74 72 61 69 6e 74 55  ing aConstraintU
8510: 73 61 67 65 5b 5d 2e 6f 6d 69 74 2e 0d 0a 20 20  sage[].omit...  
8520: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
8530: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
8540: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  /summary>..     
8550: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
8560: 6d 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20 20 20  me="pVtab">..   
8570: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74       /// The nat
8580: 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ive pointer to t
8590: 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  he sqlite3_vtab 
85a0: 64 65 72 69 76 65 64 20 73 74 72 75 63 74 75 72  derived structur
85b0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
85c0: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
85d0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
85e0: 65 3d 22 70 49 6e 64 65 78 22 3e 0d 0a 20 20 20  e="pIndex">..   
85f0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74       /// The nat
8600: 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ive pointer to t
8610: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
8620: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
8630: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
8640: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20  param>..        
8650: 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20  /// <returns>.. 
8660: 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74 61         /// A sta
8670: 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72 65 74  ndard SQLite ret
8680: 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20  urn code...     
8690: 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73     /// </returns
86a0: 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74  >..        SQLit
86b0: 65 45 72 72 6f 72 43 6f 64 65 20 78 42 65 73 74  eErrorCode xBest
86c0: 49 6e 64 65 78 28 0d 0a 20 20 20 20 20 20 20 20  Index(..        
86d0: 20 20 20 20 49 6e 74 50 74 72 20 70 56 74 61 62      IntPtr pVtab
86e0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  ,..            I
86f0: 6e 74 50 74 72 20 70 49 6e 64 65 78 0d 0a 20 20  ntPtr pIndex..  
8700: 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a            );....
8710: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
8720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8740: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
8760: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
8770: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
8780: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64    /// <para><cod
8790: 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e>..        /// 
87a0: 69 6e 74 20 28 2a 78 44 69 73 63 6f 6e 6e 65 63  int (*xDisconnec
87b0: 74 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  t)(sqlite3_vtab 
87c0: 2a 70 56 54 61 62 29 3b 0d 0a 20 20 20 20 20 20  *pVTab);..      
87d0: 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70    /// </code></p
87e0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
87f0: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
8800: 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f    /// This metho
8810: 64 20 72 65 6c 65 61 73 65 73 20 61 20 63 6f 6e  d releases a con
8820: 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 76 69 72  nection to a vir
8830: 74 75 61 6c 20 74 61 62 6c 65 2e 20 0d 0a 20 20  tual table. ..  
8840: 20 20 20 20 20 20 2f 2f 2f 20 4f 6e 6c 79 20 74        /// Only t
8850: 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  he sqlite3_vtab 
8860: 6f 62 6a 65 63 74 20 69 73 20 64 65 73 74 72 6f  object is destro
8870: 79 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  yed...        //
8880: 2f 20 54 68 65 20 76 69 72 74 75 61 6c 20 74 61  / The virtual ta
8890: 62 6c 65 20 69 73 20 6e 6f 74 20 64 65 73 74 72  ble is not destr
88a0: 6f 79 65 64 20 61 6e 64 20 61 6e 79 20 62 61 63  oyed and any bac
88b0: 6b 69 6e 67 20 73 74 6f 72 65 20 0d 0a 20 20 20  king store ..   
88c0: 20 20 20 20 20 2f 2f 2f 20 61 73 73 6f 63 69 61       /// associa
88d0: 74 65 64 20 77 69 74 68 20 74 68 65 20 76 69 72  ted with the vir
88e0: 74 75 61 6c 20 74 61 62 6c 65 20 70 65 72 73 69  tual table persi
88f0: 73 74 73 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f  sts. ..        /
8900: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
8910: 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74      /// This met
8920: 68 6f 64 20 75 6e 64 6f 65 73 20 74 68 65 20 77  hod undoes the w
8930: 6f 72 6b 20 6f 66 20 78 43 6f 6e 6e 65 63 74 2e  ork of xConnect.
8940: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
8950: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
8960: 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73  / This method is
8970: 20 61 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f   a destructor fo
8980: 72 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  r a connection t
8990: 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  o the virtual ta
89a0: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ble...        //
89b0: 2f 20 43 6f 6e 74 72 61 73 74 20 74 68 69 73 20  / Contrast this 
89c0: 6d 65 74 68 6f 64 20 77 69 74 68 20 78 44 65 73  method with xDes
89d0: 74 72 6f 79 2e 20 20 54 68 65 20 78 44 65 73 74  troy.  The xDest
89e0: 72 6f 79 20 69 73 20 61 20 64 65 73 74 72 75 63  roy is a destruc
89f0: 74 6f 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  tor..        ///
8a00: 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
8a10: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a  virtual table...
8a20: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
8a30: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
8a40: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
8a50: 20 2f 2f 2f 20 54 68 65 20 78 44 69 73 63 6f 6e   /// The xDiscon
8a60: 6e 65 63 74 20 6d 65 74 68 6f 64 20 69 73 20 72  nect method is r
8a70: 65 71 75 69 72 65 64 20 66 6f 72 20 65 76 65 72  equired for ever
8a80: 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  y virtual table 
8a90: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 0d  implementation,.
8aa0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 6f  .        /// tho
8ab0: 75 67 68 20 69 74 20 69 73 20 61 63 63 65 70 74  ugh it is accept
8ac0: 61 62 6c 65 20 66 6f 72 20 74 68 65 20 78 44 69  able for the xDi
8ad0: 73 63 6f 6e 6e 65 63 74 20 61 6e 64 20 78 44 65  sconnect and xDe
8ae0: 73 74 72 6f 79 20 6d 65 74 68 6f 64 73 20 74 6f  stroy methods to
8af0: 20 62 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   be..        ///
8b00: 20 74 68 65 20 73 61 6d 65 20 66 75 6e 63 74 69   the same functi
8b10: 6f 6e 20 69 66 20 74 68 61 74 20 6d 61 6b 65 73  on if that makes
8b20: 20 73 65 6e 73 65 20 66 6f 72 20 74 68 65 20 70   sense for the p
8b30: 61 72 74 69 63 75 6c 61 72 20 76 69 72 74 75 61  articular virtua
8b40: 6c 20 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  l table...      
8b50: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
8b60: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d         /// </sum
8b70: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f  mary>..        /
8b80: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
8b90: 70 56 74 61 62 22 3e 0d 0a 20 20 20 20 20 20 20  pVtab">..       
8ba0: 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69 76 65 20   /// The native 
8bb0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
8bc0: 71 6c 69 74 65 33 5f 76 74 61 62 20 64 65 72 69  qlite3_vtab deri
8bd0: 76 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a  ved structure...
8be0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
8bf0: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ram>..        //
8c00: 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  / <returns>..   
8c10: 20 20 20 20 20 2f 2f 2f 20 41 20 73 74 61 6e 64       /// A stand
8c20: 61 72 64 20 53 51 4c 69 74 65 20 72 65 74 75 72  ard SQLite retur
8c30: 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20  n code...       
8c40: 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d   /// </returns>.
8c50: 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 45  .        SQLiteE
8c60: 72 72 6f 72 43 6f 64 65 20 78 44 69 73 63 6f 6e  rrorCode xDiscon
8c70: 6e 65 63 74 28 0d 0a 20 20 20 20 20 20 20 20 20  nect(..         
8c80: 20 20 20 49 6e 74 50 74 72 20 70 56 74 61 62 0d     IntPtr pVtab.
8c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d  .            );.
8ca0: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  ...        /////
8cb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8cc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8cd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8ce0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8cf0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  //....        //
8d00: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
8d10: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c       /// <para><
8d20: 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f  code>..        /
8d30: 2f 2f 20 69 6e 74 20 28 2a 78 44 65 73 74 72 6f  // int (*xDestro
8d40: 79 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  y)(sqlite3_vtab 
8d50: 2a 70 56 54 61 62 29 3b 0d 0a 20 20 20 20 20 20  *pVTab);..      
8d60: 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70    /// </code></p
8d70: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
8d80: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
8d90: 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f    /// This metho
8da0: 64 20 72 65 6c 65 61 73 65 73 20 61 20 63 6f 6e  d releases a con
8db0: 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 76 69 72  nection to a vir
8dc0: 74 75 61 6c 20 74 61 62 6c 65 2c 20 6a 75 73 74  tual table, just
8dd0: 20 6c 69 6b 65 20 0d 0a 20 20 20 20 20 20 20 20   like ..        
8de0: 2f 2f 2f 20 74 68 65 20 78 44 69 73 63 6f 6e 6e  /// the xDisconn
8df0: 65 63 74 20 6d 65 74 68 6f 64 2c 20 61 6e 64 20  ect method, and 
8e00: 69 74 20 61 6c 73 6f 20 64 65 73 74 72 6f 79 73  it also destroys
8e10: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
8e20: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 61  ..        /// ta
8e30: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
8e40: 6f 6e 2e 20 54 68 69 73 20 6d 65 74 68 6f 64 20  on. This method 
8e50: 75 6e 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20  undoes the work 
8e60: 6f 66 20 78 43 72 65 61 74 65 2e 0d 0a 20 20 20  of xCreate...   
8e70: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
8e80: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
8e90: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
8ea0: 2f 20 54 68 65 20 78 44 69 73 63 6f 6e 6e 65 63  / The xDisconnec
8eb0: 74 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  t method is call
8ec0: 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 64 61  ed whenever a da
8ed0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8ee0: 6e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74  n..        /// t
8ef0: 68 61 74 20 75 73 65 73 20 61 20 76 69 72 74 75  hat uses a virtu
8f00: 61 6c 20 74 61 62 6c 65 20 69 73 20 63 6c 6f 73  al table is clos
8f10: 65 64 2e 20 54 68 65 20 78 44 65 73 74 72 6f 79  ed. The xDestroy
8f20: 20 6d 65 74 68 6f 64 20 69 73 20 6f 6e 6c 79 20   method is only 
8f30: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 63 61  ..        /// ca
8f40: 6c 6c 65 64 20 77 68 65 6e 20 61 20 44 52 4f 50  lled when a DROP
8f50: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
8f60: 20 69 73 20 65 78 65 63 75 74 65 64 20 61 67 61   is executed aga
8f70: 69 6e 73 74 20 74 68 65 20 76 69 72 74 75 61 6c  inst the virtual
8f80: 20 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20   table...       
8f90: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
8fa0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
8fb0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
8fc0: 65 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68 6f  e xDestroy metho
8fd0: 64 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  d is required fo
8fe0: 72 20 65 76 65 72 79 20 76 69 72 74 75 61 6c 20  r every virtual 
8ff0: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
9000: 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 2f  tion,..        /
9010: 2f 2f 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  // though it is 
9020: 61 63 63 65 70 74 61 62 6c 65 20 66 6f 72 20 74  acceptable for t
9030: 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 61  he xDisconnect a
9040: 6e 64 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68  nd xDestroy meth
9050: 6f 64 73 20 74 6f 20 62 65 0d 0a 20 20 20 20 20  ods to be..     
9060: 20 20 20 2f 2f 2f 20 74 68 65 20 73 61 6d 65 20     /// the same 
9070: 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 61 74  function if that
9080: 20 6d 61 6b 65 73 20 73 65 6e 73 65 20 66 6f 72   makes sense for
9090: 20 74 68 65 20 70 61 72 74 69 63 75 6c 61 72 20   the particular 
90a0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a  virtual table...
90b0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
90c0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
90d0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
90e0: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
90f0: 6e 61 6d 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20  name="pVtab">.. 
9100: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
9110: 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f  ative pointer to
9120: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
9130: 62 20 64 65 72 69 76 65 64 20 73 74 72 75 63 74  b derived struct
9140: 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ure...        //
9150: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
9160: 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
9170: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41  >..        /// A
9180: 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65   standard SQLite
9190: 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20   return code... 
91a0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74         /// </ret
91b0: 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53  urns>..        S
91c0: 51 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78  QLiteErrorCode x
91d0: 44 65 73 74 72 6f 79 28 0d 0a 20 20 20 20 20 20  Destroy(..      
91e0: 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 56 74        IntPtr pVt
91f0: 61 62 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab..            
9200: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  );....        //
9210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9240: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9250: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
9260: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
9270: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
9280: 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20  a><code>..      
9290: 20 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 4f 70 65    /// int (*xOpe
92a0: 6e 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  n)(sqlite3_vtab 
92b0: 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f  *pVTab, sqlite3_
92c0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70  vtab_cursor **pp
92d0: 43 75 72 73 6f 72 29 3b 0d 0a 20 20 20 20 20 20  Cursor);..      
92e0: 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70    /// </code></p
92f0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
9300: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
9310: 20 20 2f 2f 2f 20 54 68 65 20 78 4f 70 65 6e 20    /// The xOpen 
9320: 6d 65 74 68 6f 64 20 63 72 65 61 74 65 73 20 61  method creates a
9330: 20 6e 65 77 20 63 75 72 73 6f 72 20 75 73 65 64   new cursor used
9340: 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 28   for accessing (
9350: 72 65 61 64 20 61 6e 64 2f 6f 72 0d 0a 20 20 20  read and/or..   
9360: 20 20 20 20 20 2f 2f 2f 20 77 72 69 74 69 6e 67       /// writing
9370: 29 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ) a virtual tabl
9380: 65 2e 20 20 41 20 73 75 63 63 65 73 73 66 75 6c  e.  A successful
9390: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
93a0: 68 69 73 20 6d 65 74 68 6f 64 20 0d 0a 20 20 20  his method ..   
93b0: 20 20 20 20 20 2f 2f 2f 20 77 69 6c 6c 20 61 6c       /// will al
93c0: 6c 6f 63 61 74 65 20 74 68 65 20 6d 65 6d 6f 72  locate the memor
93d0: 79 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  y for the sqlite
93e0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 28 6f  3_vtab_cursor (o
93f0: 72 20 61 20 73 75 62 63 6c 61 73 73 29 2c 0d 0a  r a subclass),..
9400: 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 69 74          /// init
9410: 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 77 20 6f  ialize the new o
9420: 62 6a 65 63 74 2c 20 61 6e 64 20 6d 61 6b 65 20  bject, and make 
9430: 2a 70 70 43 75 72 73 6f 72 20 70 6f 69 6e 74 20  *ppCursor point 
9440: 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  to the new objec
9450: 74 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  t...        /// 
9460: 54 68 65 20 73 75 63 63 65 73 73 66 75 6c 20 63  The successful c
9470: 61 6c 6c 20 74 68 65 6e 20 72 65 74 75 72 6e 73  all then returns
9480: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0d 0a 20 20 20   SQLITE_OK...   
9490: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
94a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
94b0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
94c0: 2f 20 46 6f 72 20 65 76 65 72 79 20 73 75 63 63  / For every succ
94d0: 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 20 74  essful call to t
94e0: 68 69 73 20 6d 65 74 68 6f 64 2c 20 74 68 65 20  his method, the 
94f0: 53 51 4c 69 74 65 20 63 6f 72 65 20 77 69 6c 6c  SQLite core will
9500: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6c 61  ..        /// la
9510: 74 65 72 20 69 6e 76 6f 6b 65 20 74 68 65 20 78  ter invoke the x
9520: 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 74 6f 20  Close method to 
9530: 64 65 73 74 72 6f 79 20 0d 0a 20 20 20 20 20 20  destroy ..      
9540: 20 20 2f 2f 2f 20 74 68 65 20 61 6c 6c 6f 63 61    /// the alloca
9550: 74 65 64 20 63 75 72 73 6f 72 2e 0d 0a 20 20 20  ted cursor...   
9560: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
9570: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
9580: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
9590: 2f 20 54 68 65 20 78 4f 70 65 6e 20 6d 65 74 68  / The xOpen meth
95a0: 6f 64 20 6e 65 65 64 20 6e 6f 74 20 69 6e 69 74  od need not init
95b0: 69 61 6c 69 7a 65 20 74 68 65 20 70 56 74 61 62  ialize the pVtab
95c0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0d 0a 20   field of the.. 
95d0: 20 20 20 20 20 20 20 2f 2f 2f 20 73 71 6c 69 74         /// sqlit
95e0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 73  e3_vtab_cursor s
95f0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 53  tructure.  The S
9600: 51 4c 69 74 65 20 63 6f 72 65 20 77 69 6c 6c 20  QLite core will 
9610: 74 61 6b 65 20 63 61 72 65 0d 0a 20 20 20 20 20  take care..     
9620: 20 20 20 2f 2f 2f 20 6f 66 20 74 68 61 74 20 63     /// of that c
9630: 68 6f 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  hore automatical
9640: 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ly...        ///
9650: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
9660: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
9670: 20 20 20 20 20 20 2f 2f 2f 20 41 20 76 69 72 74        /// A virt
9680: 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d  ual table implem
9690: 65 6e 74 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  entation must be
96a0: 20 61 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74   able to support
96b0: 20 61 6e 20 61 72 62 69 74 72 61 72 79 0d 0a 20   an arbitrary.. 
96c0: 20 20 20 20 20 20 20 2f 2f 2f 20 6e 75 6d 62 65         /// numbe
96d0: 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75  r of simultaneou
96e0: 73 6c 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  sly open cursors
96f0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
9700: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
9710: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
9720: 20 20 20 20 2f 2f 2f 20 57 68 65 6e 20 69 6e 69      /// When ini
9730: 74 69 61 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 74  tially opened, t
9740: 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
9750: 61 6e 20 75 6e 64 65 66 69 6e 65 64 20 73 74 61  an undefined sta
9760: 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  te...        ///
9770: 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   The SQLite core
9780: 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65   will invoke the
9790: 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 0d   xFilter method.
97a0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6f 6e 20  .        /// on 
97b0: 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72  the cursor prior
97c0: 20 74 6f 20 61 6e 79 20 61 74 74 65 6d 70 74 20   to any attempt 
97d0: 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6f 72 20 72  to position or r
97e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
97f0: 73 6f 72 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  sor...        //
9800: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
9810: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
9820: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78         /// The x
9830: 4f 70 65 6e 20 6d 65 74 68 6f 64 20 69 73 20 72  Open method is r
9840: 65 71 75 69 72 65 64 20 66 6f 72 20 65 76 65 72  equired for ever
9850: 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  y virtual table 
9860: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d  implementation..
9870: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
9880: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
9890: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
98a0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
98b0: 20 6e 61 6d 65 3d 22 70 56 74 61 62 22 3e 0d 0a   name="pVtab">..
98c0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
98d0: 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74  native pointer t
98e0: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74  o the sqlite3_vt
98f0: 61 62 20 64 65 72 69 76 65 64 20 73 74 72 75 63  ab derived struc
9900: 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f  ture...        /
9910: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
9920: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
9930: 6e 61 6d 65 3d 22 70 43 75 72 73 6f 72 22 3e 0d  name="pCursor">.
9940: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 55 70 6f  .        /// Upo
9950: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 69 73 20  n success, this 
9960: 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62  parameter must b
9970: 65 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 70 6f  e modified to po
9980: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 6c 79  int to the newly
9990: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 63 72  ..        /// cr
99a0: 65 61 74 65 64 20 6e 61 74 69 76 65 20 73 71 6c  eated native sql
99b0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
99c0: 20 64 65 72 69 76 65 64 20 73 74 72 75 63 74 75   derived structu
99d0: 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  re...        ///
99e0: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
99f0: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
9a00: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20  ..        /// A 
9a10: 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20  standard SQLite 
9a20: 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20  return code...  
9a30: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75        /// </retu
9a40: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51  rns>..        SQ
9a50: 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78 4f  LiteErrorCode xO
9a60: 70 65 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20  pen(..          
9a70: 20 20 49 6e 74 50 74 72 20 70 56 74 61 62 2c 0d    IntPtr pVtab,.
9a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66  .            ref
9a90: 20 49 6e 74 50 74 72 20 70 43 75 72 73 6f 72 0d   IntPtr pCursor.
9aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d  .            );.
9ab0: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  ...        /////
9ac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9ad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9af0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9b00: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  //....        //
9b10: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
9b20: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c       /// <para><
9b30: 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f  code>..        /
9b40: 2f 2f 20 69 6e 74 20 28 2a 78 43 6c 6f 73 65 29  // int (*xClose)
9b50: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
9b60: 72 73 6f 72 2a 29 3b 0d 0a 20 20 20 20 20 20 20  rsor*);..       
9b70: 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61   /// </code></pa
9b80: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
9b90: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
9ba0: 20 2f 2f 2f 20 54 68 65 20 78 43 6c 6f 73 65 20   /// The xClose 
9bb0: 6d 65 74 68 6f 64 20 63 6c 6f 73 65 73 20 61 20  method closes a 
9bc0: 63 75 72 73 6f 72 20 70 72 65 76 69 6f 75 73 6c  cursor previousl
9bd0: 79 20 6f 70 65 6e 65 64 20 62 79 20 0d 0a 20 20  y opened by ..  
9be0: 20 20 20 20 20 20 2f 2f 2f 20 78 4f 70 65 6e 2e        /// xOpen.
9bf0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54   ..        /// T
9c00: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77  he SQLite core w
9c10: 69 6c 6c 20 61 6c 77 61 79 73 20 63 61 6c 6c 20  ill always call 
9c20: 78 43 6c 6f 73 65 20 6f 6e 63 65 20 66 6f 72 20  xClose once for 
9c30: 65 61 63 68 20 63 75 72 73 6f 72 20 6f 70 65 6e  each cursor open
9c40: 65 64 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ed ..        ///
9c50: 20 75 73 69 6e 67 20 78 4f 70 65 6e 2e 0d 0a 20   using xOpen... 
9c60: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
9c70: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
9c80: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
9c90: 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20  /// This method 
9ca0: 6d 75 73 74 20 72 65 6c 65 61 73 65 20 61 6c 6c  must release all
9cb0: 20 72 65 73 6f 75 72 63 65 73 20 61 6c 6c 6f 63   resources alloc
9cc0: 61 74 65 64 20 62 79 20 74 68 65 0d 0a 20 20 20  ated by the..   
9cd0: 20 20 20 20 20 2f 2f 2f 20 63 6f 72 72 65 73 70       /// corresp
9ce0: 6f 6e 64 69 6e 67 20 78 4f 70 65 6e 20 63 61 6c  onding xOpen cal
9cf0: 6c 2e 20 54 68 65 20 72 6f 75 74 69 6e 65 20 77  l. The routine w
9d00: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  ill not be calle
9d10: 64 20 61 67 61 69 6e 20 65 76 65 6e 20 69 66 20  d again even if 
9d20: 69 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  it..        /// 
9d30: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
9d40: 2e 20 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f  .  The SQLite co
9d50: 72 65 20 77 69 6c 6c 20 6e 6f 74 20 75 73 65 20  re will not use 
9d60: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  the..        ///
9d70: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
9d80: 72 73 6f 72 20 61 67 61 69 6e 20 61 66 74 65 72  rsor again after
9d90: 20 69 74 20 68 61 73 20 62 65 65 6e 20 63 6c 6f   it has been clo
9da0: 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  sed...        //
9db0: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
9dc0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
9dd0: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78         /// The x
9de0: 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 69 73 20  Close method is 
9df0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 76 65  required for eve
9e00: 72 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ry virtual table
9e10: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
9e20: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
9e30: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
9e40: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
9e50: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
9e60: 6d 20 6e 61 6d 65 3d 22 70 43 75 72 73 6f 72 22  m name="pCursor"
9e70: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
9e80: 68 65 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65  he native pointe
9e90: 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  r to the sqlite3
9ea0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 64 65 72  _vtab_cursor der
9eb0: 69 76 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d  ived structure..
9ec0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
9ed0: 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f  aram>..        /
9ee0: 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20  // <returns>..  
9ef0: 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74 61 6e        /// A stan
9f00: 64 61 72 64 20 53 51 4c 69 74 65 20 72 65 74 75  dard SQLite retu
9f10: 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20  rn code...      
9f20: 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e    /// </returns>
9f30: 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65  ..        SQLite
9f40: 45 72 72 6f 72 43 6f 64 65 20 78 43 6c 6f 73 65  ErrorCode xClose
9f50: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  (..            I
9f60: 6e 74 50 74 72 20 70 43 75 72 73 6f 72 0d 0a 20  ntPtr pCursor.. 
9f70: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d             );...
9f80: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
9f90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9fa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9fc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9fd0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ....        /// 
9fe0: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  <summary>..     
9ff0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f     /// <para><co
a000: 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  de>..        ///
a010: 20 69 6e 74 20 28 2a 78 46 69 6c 74 65 72 29 28   int (*xFilter)(
a020: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
a030: 73 6f 72 2a 2c 20 69 6e 74 20 69 64 78 4e 75 6d  sor*, int idxNum
a040: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64  , const char *id
a050: 78 53 74 72 2c 0d 0a 20 20 20 20 20 20 20 20 2f  xStr,..        /
a060: 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  //              
a070: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
a080: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
a090: 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ;..        /// <
a0a0: 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20  /code></para>.. 
a0b0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
a0c0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
a0d0: 68 69 73 20 6d 65 74 68 6f 64 20 62 65 67 69 6e  his method begin
a0e0: 73 20 61 20 73 65 61 72 63 68 20 6f 66 20 61 20  s a search of a 
a0f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 0d  virtual table. .
a100: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
a110: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
a120: 69 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e  is a cursor open
a130: 65 64 20 62 79 20 78 4f 70 65 6e 2e 20 0d 0a 20  ed by xOpen. .. 
a140: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
a150: 65 78 74 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  ext two argument
a160: 73 20 64 65 66 69 6e 65 20 61 20 70 61 72 74 69  s define a parti
a170: 63 75 6c 61 72 20 73 65 61 72 63 68 20 69 6e 64  cular search ind
a180: 65 78 20 70 72 65 76 69 6f 75 73 6c 79 20 0d 0a  ex previously ..
a190: 20 20 20 20 20 20 20 20 2f 2f 2f 20 63 68 6f 73          /// chos
a1a0: 65 6e 20 62 79 20 78 42 65 73 74 49 6e 64 65 78  en by xBestIndex
a1b0: 2e 20 54 68 65 20 73 70 65 63 69 66 69 63 20 6d  . The specific m
a1c0: 65 61 6e 69 6e 67 73 20 6f 66 20 69 64 78 4e 75  eanings of idxNu
a1d0: 6d 20 61 6e 64 20 69 64 78 53 74 72 20 0d 0a 20  m and idxStr .. 
a1e0: 20 20 20 20 20 20 20 2f 2f 2f 20 61 72 65 20 75         /// are u
a1f0: 6e 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 6c 6f  nimportant as lo
a200: 6e 67 20 61 73 20 78 46 69 6c 74 65 72 20 61 6e  ng as xFilter an
a210: 64 20 78 42 65 73 74 49 6e 64 65 78 20 61 67 72  d xBestIndex agr
a220: 65 65 20 6f 6e 20 77 68 61 74 20 0d 0a 20 20 20  ee on what ..   
a230: 20 20 20 20 20 2f 2f 2f 20 74 68 61 74 20 6d 65       /// that me
a240: 61 6e 69 6e 67 20 69 73 2e 0d 0a 20 20 20 20 20  aning is...     
a250: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
a260: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
a270: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
a280: 54 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 66  The xBestIndex f
a290: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61 76 65  unction may have
a2a0: 20 72 65 71 75 65 73 74 65 64 20 74 68 65 20 76   requested the v
a2b0: 61 6c 75 65 73 20 6f 66 20 0d 0a 20 20 20 20 20  alues of ..     
a2c0: 20 20 20 2f 2f 2f 20 63 65 72 74 61 69 6e 20 65     /// certain e
a2d0: 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67  xpressions using
a2e0: 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74   the aConstraint
a2f0: 55 73 61 67 65 5b 5d 2e 61 72 67 76 49 6e 64 65  Usage[].argvInde
a300: 78 20 76 61 6c 75 65 73 20 0d 0a 20 20 20 20 20  x values ..     
a310: 20 20 20 2f 2f 2f 20 6f 66 20 74 68 65 20 73 71     /// of the sq
a320: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
a330: 20 73 74 72 75 63 74 75 72 65 2e 20 0d 0a 20 20   structure. ..  
a340: 20 20 20 20 20 20 2f 2f 2f 20 54 68 6f 73 65 20        /// Those 
a350: 76 61 6c 75 65 73 20 61 72 65 20 70 61 73 73 65  values are passe
a360: 64 20 74 6f 20 78 46 69 6c 74 65 72 20 75 73 69  d to xFilter usi
a370: 6e 67 20 74 68 65 20 61 72 67 63 20 61 6e 64 20  ng the argc and 
a380: 61 72 67 76 20 70 61 72 61 6d 65 74 65 72 73 2e  argv parameters.
a390: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
a3a0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
a3b0: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
a3c0: 20 20 20 2f 2f 2f 20 49 66 20 74 68 65 20 76 69     /// If the vi
a3d0: 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e 74  rtual table cont
a3e0: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
a3f0: 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68   rows that match
a400: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f   the..        //
a410: 2f 20 73 65 61 72 63 68 20 63 72 69 74 65 72 69  / search criteri
a420: 61 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  a, then the curs
a430: 6f 72 20 6d 75 73 74 20 62 65 20 6c 65 66 74 20  or must be left 
a440: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72  point at the fir
a450: 73 74 20 72 6f 77 2e 0d 0a 20 20 20 20 20 20 20  st row...       
a460: 20 2f 2f 2f 20 53 75 62 73 65 71 75 65 6e 74 20   /// Subsequent 
a470: 63 61 6c 6c 73 20 74 6f 20 78 45 6f 66 20 6d 75  calls to xEof mu
a480: 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20  st return false 
a490: 28 7a 65 72 6f 29 2e 0d 0a 20 20 20 20 20 20 20  (zero)...       
a4a0: 20 2f 2f 2f 20 49 66 20 74 68 65 72 65 20 61 72   /// If there ar
a4b0: 65 20 6e 6f 20 72 6f 77 73 20 6d 61 74 63 68 2c  e no rows match,
a4c0: 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
a4d0: 20 6d 75 73 74 20 62 65 20 6c 65 66 74 20 69 6e   must be left in
a4e0: 20 61 20 73 74 61 74 65 20 0d 0a 20 20 20 20 20   a state ..     
a4f0: 20 20 20 2f 2f 2f 20 74 68 61 74 20 77 69 6c 6c     /// that will
a500: 20 63 61 75 73 65 20 74 68 65 20 78 45 6f 66 20   cause the xEof 
a510: 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 28  to return true (
a520: 6e 6f 6e 2d 7a 65 72 6f 29 2e 0d 0a 20 20 20 20  non-zero)...    
a530: 20 20 20 20 2f 2f 2f 20 54 68 65 20 53 51 4c 69      /// The SQLi
a540: 74 65 20 65 6e 67 69 6e 65 20 77 69 6c 6c 20 75  te engine will u
a550: 73 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  se..        /// 
a560: 74 68 65 20 78 43 6f 6c 75 6d 6e 20 61 6e 64 20  the xColumn and 
a570: 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 73 20 74  xRowid methods t
a580: 6f 20 61 63 63 65 73 73 20 74 68 61 74 20 72 6f  o access that ro
a590: 77 20 63 6f 6e 74 65 6e 74 2e 0d 0a 20 20 20 20  w content...    
a5a0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 4e 65 78      /// The xNex
a5b0: 74 20 6d 65 74 68 6f 64 20 77 69 6c 6c 20 62 65  t method will be
a5c0: 20 75 73 65 64 20 74 6f 20 61 64 76 61 6e 63 65   used to advance
a5d0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
a5e0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
a5f0: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
a600: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
a610: 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74      /// This met
a620: 68 6f 64 20 6d 75 73 74 20 72 65 74 75 72 6e 20  hod must return 
a630: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
a640: 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 73  cessful, or an s
a650: 71 6c 69 74 65 20 0d 0a 20 20 20 20 20 20 20 20  qlite ..        
a660: 2f 2f 2f 20 65 72 72 6f 72 20 63 6f 64 65 20 69  /// error code i
a670: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
a680: 73 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  s...        /// 
a690: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
a6a0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
a6b0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 46 69       /// The xFi
a6c0: 6c 74 65 72 20 6d 65 74 68 6f 64 20 69 73 20 72  lter method is r
a6d0: 65 71 75 69 72 65 64 20 66 6f 72 20 65 76 65 72  equired for ever
a6e0: 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  y virtual table 
a6f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d  implementation..
a700: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
a710: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
a720: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
a730: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
a740: 20 6e 61 6d 65 3d 22 70 43 75 72 73 6f 72 22 3e   name="pCursor">
a750: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
a760: 65 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72  e native pointer
a770: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
a780: 76 74 61 62 5f 63 75 72 73 6f 72 20 64 65 72 69  vtab_cursor deri
a790: 76 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a  ved structure...
a7a0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
a7b0: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ram>..        //
a7c0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69  / <param name="i
a7d0: 64 78 4e 75 6d 22 3e 0d 0a 20 20 20 20 20 20 20  dxNum">..       
a7e0: 20 2f 2f 2f 20 4e 75 6d 62 65 72 20 75 73 65 64   /// Number used
a7f0: 20 74 6f 20 68 65 6c 70 20 69 64 65 6e 74 69 66   to help identif
a800: 79 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 69  y the selected i
a810: 6e 64 65 78 2e 0d 0a 20 20 20 20 20 20 20 20 2f  ndex...        /
a820: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
a830: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
a840: 6e 61 6d 65 3d 22 69 64 78 53 74 72 22 3e 0d 0a  name="idxStr">..
a850: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
a860: 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74  native pointer t
a870: 6f 20 74 68 65 20 55 54 46 2d 38 20 65 6e 63 6f  o the UTF-8 enco
a880: 64 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ded string conta
a890: 69 6e 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20  ining the..     
a8a0: 20 20 20 2f 2f 2f 20 73 74 72 69 6e 67 20 75 73     /// string us
a8b0: 65 64 20 74 6f 20 68 65 6c 70 20 69 64 65 6e 74  ed to help ident
a8c0: 69 66 79 20 74 68 65 20 73 65 6c 65 63 74 65 64  ify the selected
a8d0: 20 69 6e 64 65 78 2e 0d 0a 20 20 20 20 20 20 20   index...       
a8e0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20   /// </param>.. 
a8f0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
a900: 6d 20 6e 61 6d 65 3d 22 61 72 67 63 22 3e 0d 0a  m name="argc">..
a910: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
a920: 6e 75 6d 62 65 72 20 6f 66 20 6e 61 74 69 76 65  number of native
a930: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 71 6c   pointers to sql
a940: 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
a950: 74 75 72 65 73 20 73 70 65 63 69 66 69 65 64 0d  tures specified.
a960: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 20  .        /// in 
a970: 3c 70 61 72 61 6d 72 65 66 20 6e 61 6d 65 3d 22  <paramref name="
a980: 61 72 67 76 22 20 2f 3e 2e 0d 0a 20 20 20 20 20  argv" />...     
a990: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d     /// </param>.
a9a0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
a9b0: 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 76 22 3e  ram name="argv">
a9c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 6e  ..        /// An
a9d0: 20 61 72 72 61 79 20 6f 66 20 6e 61 74 69 76 65   array of native
a9e0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 71 6c   pointers to sql
a9f0: 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
aa00: 74 75 72 65 73 20 63 6f 6e 74 61 69 6e 69 6e 67  tures containing
aa10: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 66 69  ..        /// fi
aa20: 6c 74 65 72 69 6e 67 20 63 72 69 74 65 72 69 61  ltering criteria
aa30: 20 66 6f 72 20 74 68 65 20 73 65 6c 65 63 74 65   for the selecte
aa40: 64 20 69 6e 64 65 78 2e 0d 0a 20 20 20 20 20 20  d index...      
aa50: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a    /// </param>..
aa60: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74          /// <ret
aa70: 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 2f  urns>..        /
aa80: 2f 2f 20 41 20 73 74 61 6e 64 61 72 64 20 53 51  // A standard SQ
aa90: 4c 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65  Lite return code
aaa0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
aab0: 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20  /returns>..     
aac0: 20 20 20 53 51 4c 69 74 65 45 72 72 6f 72 43 6f     SQLiteErrorCo
aad0: 64 65 20 78 46 69 6c 74 65 72 28 0d 0a 20 20 20  de xFilter(..   
aae0: 20 20 20 20 20 20 20 20 20 49 6e 74 50 74 72 20           IntPtr 
aaf0: 70 43 75 72 73 6f 72 2c 0d 0a 20 20 20 20 20 20  pCursor,..      
ab00: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 75 6d        int idxNum
ab10: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  ,..            I
ab20: 6e 74 50 74 72 20 69 64 78 53 74 72 2c 0d 0a 20  ntPtr idxStr,.. 
ab30: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61             int a
ab40: 72 67 63 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  rgc,..          
ab50: 20 20 49 6e 74 50 74 72 20 61 72 67 76 0d 0a 20    IntPtr argv.. 
ab60: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d             );...
ab70: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
ab80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ab90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
aba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
abb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
abc0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ....        /// 
abd0: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  <summary>..     
abe0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f     /// <para><co
abf0: 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  de>..        ///
ac00: 20 69 6e 74 20 28 2a 78 4e 65 78 74 29 28 73 71   int (*xNext)(sq
ac10: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
ac20: 72 2a 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  r*);..        //
ac30: 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e  / </code></para>
ac40: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
ac50: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
ac60: 2f 20 54 68 65 20 78 4e 65 78 74 20 6d 65 74 68  / The xNext meth
ac70: 6f 64 20 61 64 76 61 6e 63 65 73 20 61 20 76 69  od advances a vi
ac80: 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
ac90: 6f 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  or..        /// 
aca0: 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  to the next row 
acb0: 6f 66 20 61 20 72 65 73 75 6c 74 20 73 65 74 20  of a result set 
acc0: 69 6e 69 74 69 61 74 65 64 20 62 79 20 78 46 69  initiated by xFi
acd0: 6c 74 65 72 2e 20 0d 0a 20 20 20 20 20 20 20 20  lter. ..        
ace0: 2f 2f 2f 20 49 66 20 74 68 65 20 63 75 72 73 6f  /// If the curso
acf0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
ad00: 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73  nting at the las
ad10: 74 20 72 6f 77 20 77 68 65 6e 20 74 68 69 73 20  t row when this 
ad20: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 72 6f  ..        /// ro
ad30: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
ad40: 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
ad50: 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 6f 69 6e 74   no longer point
ad60: 73 20 74 6f 20 76 61 6c 69 64 20 0d 0a 20 20 20  s to valid ..   
ad70: 20 20 20 20 20 2f 2f 2f 20 64 61 74 61 20 61 6e       /// data an
ad80: 64 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63  d a subsequent c
ad90: 61 6c 6c 20 74 6f 20 74 68 65 20 78 45 6f 66 20  all to the xEof 
ada0: 6d 65 74 68 6f 64 20 6d 75 73 74 20 72 65 74 75  method must retu
adb0: 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
adc0: 6f 29 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  o). ..        //
add0: 2f 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  / If the cursor 
ade0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
adf0: 61 64 76 61 6e 63 65 64 20 74 6f 20 61 6e 6f 74  advanced to anot
ae00: 68 65 72 20 72 6f 77 20 6f 66 20 63 6f 6e 74 65  her row of conte
ae10: 6e 74 2c 20 74 68 65 6e 0d 0a 20 20 20 20 20 20  nt, then..      
ae20: 20 20 2f 2f 2f 20 73 75 62 73 65 71 75 65 6e 74    /// subsequent
ae30: 20 63 61 6c 6c 73 20 74 6f 20 78 45 6f 66 20 6d   calls to xEof m
ae40: 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65  ust return false
ae50: 20 28 7a 65 72 6f 29 2e 0d 0a 20 20 20 20 20 20   (zero)...      
ae60: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
ae70: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
ae80: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
ae90: 68 69 73 20 6d 65 74 68 6f 64 20 6d 75 73 74 20  his method must 
aea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
aeb0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
aec0: 6f 72 20 61 6e 20 73 71 6c 69 74 65 20 0d 0a 20  or an sqlite .. 
aed0: 20 20 20 20 20 20 20 2f 2f 2f 20 65 72 72 6f 72         /// error
aee0: 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f   code if an erro
aef0: 72 20 6f 63 63 75 72 73 2e 0d 0a 20 20 20 20 20  r occurs...     
af00: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
af10: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
af20: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
af30: 54 68 65 20 78 4e 65 78 74 20 6d 65 74 68 6f 64  The xNext method
af40: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
af50: 20 65 76 65 72 79 20 76 69 72 74 75 61 6c 20 74   every virtual t
af60: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
af70: 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ion...        //
af80: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
af90: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
afa0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
afb0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 43 75 72  param name="pCur
afc0: 73 6f 72 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f  sor">..        /
afd0: 2f 2f 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f  // The native po
afe0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c  inter to the sql
aff0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
b000: 20 64 65 72 69 76 65 64 20 73 74 72 75 63 74 75   derived structu
b010: 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  re...        ///
b020: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
b030: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
b040: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20  ..        /// A 
b050: 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20  standard SQLite 
b060: 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20  return code...  
b070: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75        /// </retu
b080: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51  rns>..        SQ
b090: 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78 4e  LiteErrorCode xN
b0a0: 65 78 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ext(..          
b0b0: 20 20 49 6e 74 50 74 72 20 70 43 75 72 73 6f 72    IntPtr pCursor
b0c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  ..            );
b0d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
b0e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b0f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b100: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b120: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  ///....        /
b130: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
b140: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
b150: 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20  <code>..        
b160: 2f 2f 2f 20 69 6e 74 20 28 2a 78 45 6f 66 29 28  /// int (*xEof)(
b170: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
b180: 73 6f 72 2a 29 3b 0d 0a 20 20 20 20 20 20 20 20  sor*);..        
b190: 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72  /// </code></par
b1a0: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
b1b0: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
b1c0: 2f 2f 2f 20 54 68 65 20 78 45 6f 66 20 6d 65 74  /// The xEof met
b1d0: 68 6f 64 20 6d 75 73 74 20 72 65 74 75 72 6e 20  hod must return 
b1e0: 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 69 66 20  false (zero) if 
b1f0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63 75  the specified cu
b200: 72 73 6f 72 20 0d 0a 20 20 20 20 20 20 20 20 2f  rsor ..        /
b210: 2f 2f 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  // currently poi
b220: 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 72  nts to a valid r
b230: 6f 77 20 6f 66 20 64 61 74 61 2c 20 6f 72 20 74  ow of data, or t
b240: 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 6f  rue (non-zero) o
b250: 74 68 65 72 77 69 73 65 2e 20 0d 0a 20 20 20 20  therwise. ..    
b260: 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74      /// This met
b270: 68 6f 64 20 69 73 20 63 61 6c 6c 65 64 20 62 79  hod is called by
b280: 20 74 68 65 20 53 51 4c 20 65 6e 67 69 6e 65 20   the SQL engine 
b290: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
b2a0: 72 20 65 61 63 68 20 0d 0a 20 20 20 20 20 20 20  r each ..       
b2b0: 20 2f 2f 2f 20 78 46 69 6c 74 65 72 20 61 6e 64   /// xFilter and
b2c0: 20 78 4e 65 78 74 20 69 6e 76 6f 63 61 74 69 6f   xNext invocatio
b2d0: 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  n...        /// 
b2e0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
b2f0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
b300: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 45 6f       /// The xEo
b310: 66 20 6d 65 74 68 6f 64 20 69 73 20 72 65 71 75  f method is requ
b320: 69 72 65 64 20 66 6f 72 20 65 76 65 72 79 20 76  ired for every v
b330: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70  irtual table imp
b340: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 20  lementation...  
b350: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
b360: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
b370: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  /summary>..     
b380: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
b390: 6d 65 3d 22 70 43 75 72 73 6f 72 22 3e 0d 0a 20  me="pCursor">.. 
b3a0: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
b3b0: 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f  ative pointer to
b3c0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
b3d0: 62 5f 63 75 72 73 6f 72 20 64 65 72 69 76 65 64  b_cursor derived
b3e0: 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20   structure...   
b3f0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d       /// </param
b400: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
b410: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20  returns>..      
b420: 20 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72 6f 20 69    /// Non-zero i
b430: 66 20 6e 6f 20 6d 6f 72 65 20 72 6f 77 73 20 61  f no more rows a
b440: 72 65 20 61 76 61 69 6c 61 62 6c 65 3b 20 7a 65  re available; ze
b450: 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0d 0a 20  ro otherwise... 
b460: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74         /// </ret
b470: 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 69  urns>..        i
b480: 6e 74 20 78 45 6f 66 28 0d 0a 20 20 20 20 20 20  nt xEof(..      
b490: 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 43 75        IntPtr pCu
b4a0: 72 73 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20  rsor..          
b4b0: 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20    );....        
b4c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b4d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b4e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b4f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b500: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
b510: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
b520: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
b530: 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20  ara><code>..    
b540: 20 20 20 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 43      /// int (*xC
b550: 6f 6c 75 6d 6e 29 28 73 71 6c 69 74 65 33 5f 76  olumn)(sqlite3_v
b560: 74 61 62 5f 63 75 72 73 6f 72 2a 2c 20 73 71 6c  tab_cursor*, sql
b570: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 69  ite3_context*, i
b580: 6e 74 20 4e 29 3b 0d 0a 20 20 20 20 20 20 20 20  nt N);..        
b590: 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72  /// </code></par
b5a0: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
b5b0: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
b5c0: 2f 2f 2f 20 54 68 65 20 53 51 4c 69 74 65 20 63  /// The SQLite c
b5d0: 6f 72 65 20 69 6e 76 6f 6b 65 73 20 74 68 69 73  ore invokes this
b5e0: 20 6d 65 74 68 6f 64 20 69 6e 20 6f 72 64 65 72   method in order
b5f0: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 76 61 6c   to find the val
b600: 75 65 20 66 6f 72 20 0d 0a 20 20 20 20 20 20 20  ue for ..       
b610: 20 2f 2f 2f 20 74 68 65 20 4e 2d 74 68 20 63 6f   /// the N-th co
b620: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 75 72 72  lumn of the curr
b630: 65 6e 74 20 72 6f 77 2e 20 4e 20 69 73 20 7a 65  ent row. N is ze
b640: 72 6f 2d 62 61 73 65 64 20 73 6f 20 74 68 65 20  ro-based so the 
b650: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 0d 0a 20  first column .. 
b660: 20 20 20 20 20 20 20 2f 2f 2f 20 69 73 20 6e 75         /// is nu
b670: 6d 62 65 72 65 64 20 30 2e 20 0d 0a 20 20 20 20  mbered 0. ..    
b680: 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 43 6f 6c      /// The xCol
b690: 75 6d 6e 20 6d 65 74 68 6f 64 20 6d 61 79 20 72  umn method may r
b6a0: 65 74 75 72 6e 20 69 74 73 20 72 65 73 75 6c 74  eturn its result
b6b0: 20 62 61 63 6b 20 74 6f 20 53 51 4c 69 74 65 20   back to SQLite 
b6c0: 75 73 69 6e 67 20 6f 6e 65 20 6f 66 20 74 68 65  using one of the
b6d0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 66 6f  ..        /// fo
b6e0: 6c 6c 6f 77 69 6e 67 20 69 6e 74 65 72 66 61 63  llowing interfac
b6f0: 65 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e:..        /// 
b700: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
b710: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
b720: 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54       /// <![CDAT
b730: 41 5b 3c 75 6c 3e 5d 5d 3e 0d 0a 20 20 20 20 20  A[<ul>]]>..     
b740: 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b     /// <![CDATA[
b750: 3c 6c 69 3e 5d 5d 3e 20 73 71 6c 69 74 65 33 5f  <li>]]> sqlite3_
b760: 72 65 73 75 6c 74 5f 62 6c 6f 62 28 29 0d 0a 20  result_blob().. 
b770: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44         /// <![CD
b780: 41 54 41 5b 3c 2f 6c 69 3e 5d 5d 3e 3c 21 5b 43  ATA[</li>]]><![C
b790: 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 73 71 6c  DATA[<li>]]> sql
b7a0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
b7b0: 6c 65 28 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f  le()..        //
b7c0: 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 6c 69 3e  / <![CDATA[</li>
b7d0: 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 6c 69 3e  ]]><![CDATA[<li>
b7e0: 5d 5d 3e 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ]]> sqlite3_resu
b7f0: 6c 74 5f 69 6e 74 28 29 0d 0a 20 20 20 20 20 20  lt_int()..      
b800: 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c    /// <![CDATA[<
b810: 2f 6c 69 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b  /li>]]><![CDATA[
b820: 3c 6c 69 3e 5d 5d 3e 20 73 71 6c 69 74 65 33 5f  <li>]]> sqlite3_
b830: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 29 0d 0a  result_int64()..
b840: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43          /// <![C
b850: 44 41 54 41 5b 3c 2f 6c 69 3e 5d 5d 3e 3c 21 5b  DATA[</li>]]><![
b860: 43 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 73 71  CDATA[<li>]]> sq
b870: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
b880: 6c 28 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  l()..        ///
b890: 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 6c 69 3e 5d   <![CDATA[</li>]
b8a0: 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 6c 69 3e 5d  ]><![CDATA[<li>]
b8b0: 5d 3e 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ]> sqlite3_resul
b8c0: 74 5f 74 65 78 74 28 29 0d 0a 20 20 20 20 20 20  t_text()..      
b8d0: 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c    /// <![CDATA[<
b8e0: 2f 6c 69 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b  /li>]]><![CDATA[
b8f0: 3c 6c 69 3e 5d 5d 3e 20 73 71 6c 69 74 65 33 5f  <li>]]> sqlite3_
b900: 72 65 73 75 6c 74 5f 74 65 78 74 31 36 28 29 0d  result_text16().
b910: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b  .        /// <![
b920: 43 44 41 54 41 5b 3c 2f 6c 69 3e 5d 5d 3e 3c 21  CDATA[</li>]]><!
b930: 5b 43 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 73  [CDATA[<li>]]> s
b940: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
b950: 78 74 31 36 6c 65 28 29 0d 0a 20 20 20 20 20 20  xt16le()..      
b960: 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c    /// <![CDATA[<
b970: 2f 6c 69 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b  /li>]]><![CDATA[
b980: 3c 6c 69 3e 5d 5d 3e 20 73 71 6c 69 74 65 33 5f  <li>]]> sqlite3_
b990: 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28  result_text16be(
b9a0: 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  )..        /// <
b9b0: 21 5b 43 44 41 54 41 5b 3c 2f 6c 69 3e 5d 5d 3e  ![CDATA[</li>]]>
b9c0: 3c 21 5b 43 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e  <![CDATA[<li>]]>
b9d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
b9e0: 7a 65 72 6f 62 6c 6f 62 28 29 0d 0a 20 20 20 20  zeroblob()..    
b9f0: 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41      /// <![CDATA
ba00: 5b 3c 2f 6c 69 3e 5d 5d 3e 3c 21 5b 43 44 41 54  [</li>]]><![CDAT
ba10: 41 5b 3c 2f 75 6c 3e 5d 5d 3e 0d 0a 20 20 20 20  A[</ul>]]>..    
ba20: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
ba30: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
ba40: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
ba50: 20 49 66 20 74 68 65 20 78 43 6f 6c 75 6d 6e 20   If the xColumn 
ba60: 6d 65 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74  method implement
ba70: 61 74 69 6f 6e 20 63 61 6c 6c 73 20 6e 6f 6e 65  ation calls none
ba80: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
ba90: 73 20 61 62 6f 76 65 2c 0d 0a 20 20 20 20 20 20  s above,..      
baa0: 20 20 2f 2f 2f 20 74 68 65 6e 20 74 68 65 20 76    /// then the v
bab0: 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  alue of the colu
bac0: 6d 6e 20 64 65 66 61 75 6c 74 73 20 74 6f 20 61  mn defaults to a
bad0: 6e 20 53 51 4c 20 4e 55 4c 4c 2e 0d 0a 20 20 20  n SQL NULL...   
bae0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
baf0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
bb00: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
bb10: 2f 20 54 6f 20 72 61 69 73 65 20 61 6e 20 65 72  / To raise an er
bb20: 72 6f 72 2c 20 74 68 65 20 78 43 6f 6c 75 6d 6e  ror, the xColumn
bb30: 20 6d 65 74 68 6f 64 20 73 68 6f 75 6c 64 20 75   method should u
bb40: 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 65  se one of the re
bb50: 73 75 6c 74 5f 74 65 78 74 28 29 20 0d 0a 20 20  sult_text() ..  
bb60: 20 20 20 20 20 20 2f 2f 2f 20 6d 65 74 68 6f 64        /// method
bb70: 73 20 74 6f 20 73 65 74 20 74 68 65 20 65 72 72  s to set the err
bb80: 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 2c  or message text,
bb90: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 6e 20   then return an 
bba0: 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20 20  appropriate..   
bbb0: 20 20 20 20 20 2f 2f 2f 20 65 72 72 6f 72 20 63       /// error c
bbc0: 6f 64 65 2e 20 20 54 68 65 20 78 43 6f 6c 75 6d  ode.  The xColum
bbd0: 6e 20 6d 65 74 68 6f 64 20 6d 75 73 74 20 72 65  n method must re
bbe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
bbf0: 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20 20 20  n success...    
bc00: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
bc10: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
bc20: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
bc30: 20 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74   The xColumn met
bc40: 68 6f 64 20 69 73 20 72 65 71 75 69 72 65 64 20  hod is required 
bc50: 66 6f 72 20 65 76 65 72 79 20 76 69 72 74 75 61  for every virtua
bc60: 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e  l table implemen
bc70: 74 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  tation...       
bc80: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
bc90: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d        /// </summ
bca0: 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ary>..        //
bcb0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70  / <param name="p
bcc0: 43 75 72 73 6f 72 22 3e 0d 0a 20 20 20 20 20 20  Cursor">..      
bcd0: 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69 76 65    /// The native
bce0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
bcf0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
bd00: 73 6f 72 20 64 65 72 69 76 65 64 20 73 74 72 75  sor derived stru
bd10: 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20  cture...        
bd20: 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
bd30: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
bd40: 20 6e 61 6d 65 3d 22 70 43 6f 6e 74 65 78 74 22   name="pContext"
bd50: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
bd60: 68 65 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65  he native pointe
bd70: 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  r to the sqlite3
bd80: 5f 63 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  _context structu
bd90: 72 65 20 74 6f 20 62 65 20 75 73 65 64 0d 0a 20  re to be used.. 
bda0: 20 20 20 20 20 20 20 2f 2f 2f 20 66 6f 72 20 72         /// for r
bdb0: 65 74 75 72 6e 69 6e 67 20 74 68 65 20 73 70 65  eturning the spe
bdc0: 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 76 61  cified column va
bdd0: 6c 75 65 20 74 6f 20 74 68 65 20 53 51 4c 69 74  lue to the SQLit
bde0: 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 20 20  e core..        
bdf0: 2f 2f 2f 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20  /// library...  
be00: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
be10: 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  m>..        /// 
be20: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69 6e 64  <param name="ind
be30: 65 78 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ex">..        //
be40: 2f 20 54 68 65 20 7a 65 72 6f 2d 62 61 73 65 64  / The zero-based
be50: 20 69 6e 64 65 78 20 63 6f 72 72 65 73 70 6f 6e   index correspon
be60: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6c 75  ding to the colu
be70: 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  mn containing th
be80: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 76  e..        /// v
be90: 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
bea0: 6e 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ned...        //
beb0: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
bec0: 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
bed0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41  >..        /// A
bee0: 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65   standard SQLite
bef0: 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20   return code... 
bf00: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74         /// </ret
bf10: 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53  urns>..        S
bf20: 51 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78  QLiteErrorCode x
bf30: 43 6f 6c 75 6d 6e 28 0d 0a 20 20 20 20 20 20 20  Column(..       
bf40: 20 20 20 20 20 49 6e 74 50 74 72 20 70 43 75 72       IntPtr pCur
bf50: 73 6f 72 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  sor,..          
bf60: 20 20 49 6e 74 50 74 72 20 70 43 6f 6e 74 65 78    IntPtr pContex
bf70: 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
bf80: 69 6e 74 20 69 6e 64 65 78 0d 0a 20 20 20 20 20  int index..     
bf90: 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20         );....   
bfa0: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
bfb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bfc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bfd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bfe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
bff0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d          /// <sum
c000: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f  mary>..        /
c010: 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d  // <para><code>.
c020: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74  .        /// int
c030: 20 28 2a 78 52 6f 77 69 64 29 28 73 71 6c 69 74   (*xRowid)(sqlit
c040: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
c050: 70 43 75 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74  pCur, sqlite_int
c060: 36 34 20 2a 70 52 6f 77 69 64 29 3b 0d 0a 20 20  64 *pRowid);..  
c070: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65        /// </code
c080: 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  ></para>..      
c090: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
c0a0: 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 75 63 63        /// A succ
c0b0: 65 73 73 66 75 6c 20 69 6e 76 6f 63 61 74 69 6f  essful invocatio
c0c0: 6e 20 6f 66 20 74 68 69 73 20 6d 65 74 68 6f 64  n of this method
c0d0: 20 77 69 6c 6c 20 63 61 75 73 65 20 2a 70 52 6f   will cause *pRo
c0e0: 77 69 64 20 74 6f 20 62 65 0d 0a 20 20 20 20 20  wid to be..     
c0f0: 20 20 20 2f 2f 2f 20 66 69 6c 6c 65 64 20 77 69     /// filled wi
c100: 74 68 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  th the rowid of 
c110: 72 6f 77 20 74 68 61 74 20 74 68 65 0d 0a 20 20  row that the..  
c120: 20 20 20 20 20 20 2f 2f 2f 20 76 69 72 74 75 61        /// virtua
c130: 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 70  l table cursor p
c140: 43 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  Cur is currently
c150: 20 70 6f 69 6e 74 69 6e 67 20 61 74 2e 0d 0a 20   pointing at... 
c160: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20         /// This 
c170: 6d 65 74 68 6f 64 20 72 65 74 75 72 6e 73 20 53  method returns S
c180: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
c190: 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ess...        //
c1a0: 2f 20 49 74 20 72 65 74 75 72 6e 73 20 61 6e 20  / It returns an 
c1b0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
c1c0: 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
c1d0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
c1e0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
c1f0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
c200: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 52 6f       /// The xRo
c210: 77 69 64 20 6d 65 74 68 6f 64 20 69 73 20 72 65  wid method is re
c220: 71 75 69 72 65 64 20 66 6f 72 20 65 76 65 72 79  quired for every
c230: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
c240: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a  mplementation...
c250: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
c260: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
c270: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
c280: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
c290: 6e 61 6d 65 3d 22 70 43 75 72 73 6f 72 22 3e 0d  name="pCursor">.
c2a0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
c2b0: 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20   native pointer 
c2c0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
c2d0: 74 61 62 5f 63 75 72 73 6f 72 20 64 65 72 69 76  tab_cursor deriv
c2e0: 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20  ed structure... 
c2f0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
c300: 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  am>..        ///
c310: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 72 6f   <param name="ro
c320: 77 49 64 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f  wId">..        /
c330: 2f 2f 20 55 70 6f 6e 20 73 75 63 63 65 73 73 2c  // Upon success,
c340: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
c350: 6d 75 73 74 20 62 65 20 6d 6f 64 69 66 69 65 64  must be modified
c360: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
c370: 75 6e 69 71 75 65 0d 0a 20 20 20 20 20 20 20 20  unique..        
c380: 2f 2f 2f 20 69 6e 74 65 67 65 72 20 72 6f 77 20  /// integer row 
c390: 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74  identifier for t
c3a0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 66  he current row f
c3b0: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
c3c0: 20 63 75 72 73 6f 72 2e 0d 0a 20 20 20 20 20 20   cursor...      
c3d0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a    /// </param>..
c3e0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74          /// <ret
c3f0: 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 2f  urns>..        /
c400: 2f 2f 20 41 20 73 74 61 6e 64 61 72 64 20 53 51  // A standard SQ
c410: 4c 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65  Lite return code
c420: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
c430: 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20  /returns>..     
c440: 20 20 20 53 51 4c 69 74 65 45 72 72 6f 72 43 6f     SQLiteErrorCo
c450: 64 65 20 78 52 6f 77 49 64 28 0d 0a 20 20 20 20  de xRowId(..    
c460: 20 20 20 20 20 20 20 20 49 6e 74 50 74 72 20 70          IntPtr p
c470: 43 75 72 73 6f 72 2c 0d 0a 20 20 20 20 20 20 20  Cursor,..       
c480: 20 20 20 20 20 72 65 66 20 6c 6f 6e 67 20 72 6f       ref long ro
c490: 77 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20  wId..           
c4a0: 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f   );....        /
c4b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c4c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c4d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c4e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c4f0: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
c500: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
c510: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
c520: 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20  ra><code>..     
c530: 20 20 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 55 70     /// int (*xUp
c540: 64 61 74 65 29 28 0d 0a 20 20 20 20 20 20 20 20  date)(..        
c550: 2f 2f 2f 20 20 20 73 71 6c 69 74 65 33 5f 76 74  ///   sqlite3_vt
c560: 61 62 20 2a 70 56 54 61 62 2c 0d 0a 20 20 20 20  ab *pVTab,..    
c570: 20 20 20 20 2f 2f 2f 20 20 20 69 6e 74 20 61 72      ///   int ar
c580: 67 63 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  gc,..        ///
c590: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
c5a0: 20 2a 2a 61 72 67 76 2c 0d 0a 20 20 20 20 20 20   **argv,..      
c5b0: 20 20 2f 2f 2f 20 20 20 73 71 6c 69 74 65 5f 69    ///   sqlite_i
c5c0: 6e 74 36 34 20 2a 70 52 6f 77 69 64 0d 0a 20 20  nt64 *pRowid..  
c5d0: 20 20 20 20 20 20 2f 2f 2f 20 29 3b 0d 0a 20 20        /// );..  
c5e0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65        /// </code
c5f0: 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  ></para>..      
c600: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
c610: 20 20 20 20 20 20 2f 2f 2f 20 41 6c 6c 20 63 68        /// All ch
c620: 61 6e 67 65 73 20 74 6f 20 61 20 76 69 72 74 75  anges to a virtu
c630: 61 6c 20 74 61 62 6c 65 20 61 72 65 20 6d 61 64  al table are mad
c640: 65 20 75 73 69 6e 67 20 74 68 65 20 78 55 70 64  e using the xUpd
c650: 61 74 65 20 6d 65 74 68 6f 64 2e 0d 0a 20 20 20  ate method...   
c660: 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6f 6e       /// This on
c670: 65 20 6d 65 74 68 6f 64 20 63 61 6e 20 62 65 20  e method can be 
c680: 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74 2c 20  used to insert, 
c690: 64 65 6c 65 74 65 2c 20 6f 72 20 75 70 64 61 74  delete, or updat
c6a0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
c6b0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
c6c0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
c6d0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 61 72 67       /// The arg
c6e0: 63 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  c parameter spec
c6f0: 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
c700: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
c710: 68 65 20 61 72 67 76 20 61 72 72 61 79 2e 20 0d  he argv array. .
c720: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
c730: 20 76 61 6c 75 65 20 6f 66 20 61 72 67 63 20 77   value of argc w
c740: 69 6c 6c 20 62 65 20 31 20 66 6f 72 20 61 20 70  ill be 1 for a p
c750: 75 72 65 20 64 65 6c 65 74 65 20 6f 70 65 72 61  ure delete opera
c760: 74 69 6f 6e 20 6f 72 20 4e 2b 32 20 66 6f 72 20  tion or N+2 for 
c770: 61 6e 20 69 6e 73 65 72 74 0d 0a 20 20 20 20 20  an insert..     
c780: 20 20 20 2f 2f 2f 20 6f 72 20 72 65 70 6c 61 63     /// or replac
c790: 65 20 6f 72 20 75 70 64 61 74 65 20 77 68 65 72  e or update wher
c7a0: 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
c7b0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
c7c0: 74 68 65 20 74 61 62 6c 65 2e 20 20 0d 0a 20 20  the table.  ..  
c7d0: 20 20 20 20 20 20 2f 2f 2f 20 49 6e 20 74 68 65        /// In the
c7e0: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
c7f0: 63 65 2c 20 4e 20 69 6e 63 6c 75 64 65 73 20 61  ce, N includes a
c800: 6e 79 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  ny hidden column
c810: 73 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  s...        /// 
c820: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
c830: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
c840: 20 20 20 20 20 2f 2f 2f 20 45 76 65 72 79 20 61       /// Every a
c850: 72 67 76 20 65 6e 74 72 79 20 77 69 6c 6c 20 68  rgv entry will h
c860: 61 76 65 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76  ave a non-NULL v
c870: 61 6c 75 65 20 69 6e 20 43 20 62 75 74 20 6d 61  alue in C but ma
c880: 79 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 0d 0a  y contain the ..
c890: 20 20 20 20 20 20 20 20 2f 2f 2f 20 53 51 4c 20          /// SQL 
c8a0: 76 61 6c 75 65 20 4e 55 4c 4c 2e 20 20 49 6e 20  value NULL.  In 
c8b0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20  other words, it 
c8c0: 69 73 20 61 6c 77 61 79 73 20 74 72 75 65 20 74  is always true t
c8d0: 68 61 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  hat..        ///
c8e0: 20 3c 21 5b 43 44 41 54 41 5b 3c 74 74 3e 5d 5d   <![CDATA[<tt>]]
c8f0: 3e 61 72 67 76 5b 69 5d 21 3d 30 3c 21 5b 43 44  >argv[i]!=0<![CD
c900: 41 54 41 5b 3c 2f 74 74 3e 5d 5d 3e 20 66 6f 72  ATA[</tt>]]> for
c910: 20 3c 21 5b 43 44 41 54 41 5b 3c 62 3e 5d 5d 3e   <![CDATA[<b>]]>
c920: 69 3c 21 5b 43 44 41 54 41 5b 3c 2f 62 3e 5d 5d  i<![CDATA[</b>]]
c930: 3e 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  > between 0 and 
c940: 3c 21 5b 43 44 41 54 41 5b 3c 74 74 3e 5d 5d 3e  <![CDATA[<tt>]]>
c950: 61 72 67 63 2d 31 3c 21 5b 43 44 41 54 41 5b 3c  argc-1<![CDATA[<
c960: 2f 74 74 3e 5d 5d 3e 2e 0d 0a 20 20 20 20 20 20  /tt>]]>...      
c970: 20 20 2f 2f 2f 20 48 6f 77 65 76 65 72 2c 20 69    /// However, i
c980: 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
c990: 61 73 65 20 74 68 61 74 0d 0a 20 20 20 20 20 20  ase that..      
c9a0: 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c    /// <![CDATA[<
c9b0: 74 74 3e 5d 5d 3e 73 71 6c 69 74 65 33 5f 76 61  tt>]]>sqlite3_va
c9c0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d  lue_type(argv[i]
c9d0: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 3c 21  )==SQLITE_NULL<!
c9e0: 5b 43 44 41 54 41 5b 3c 2f 74 74 3e 5d 5d 3e 2e  [CDATA[</tt>]]>.
c9f0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
ca00: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
ca10: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
ca20: 20 20 20 2f 2f 2f 20 54 68 65 20 61 72 67 76 5b     /// The argv[
ca30: 30 5d 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  0] parameter is 
ca40: 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61 20 72  the rowid of a r
ca50: 6f 77 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  ow in the virtua
ca60: 6c 20 74 61 62 6c 65 20 0d 0a 20 20 20 20 20 20  l table ..      
ca70: 20 20 2f 2f 2f 20 74 6f 20 62 65 20 64 65 6c 65    /// to be dele
ca80: 74 65 64 2e 20 49 66 20 61 72 67 76 5b 30 5d 20  ted. If argv[0] 
ca90: 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20  is an SQL NULL, 
caa0: 74 68 65 6e 20 6e 6f 20 64 65 6c 65 74 69 6f 6e  then no deletion
cab0: 20 6f 63 63 75 72 73 2e 0d 0a 20 20 20 20 20 20   occurs...      
cac0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
cad0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
cae0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
caf0: 68 65 20 61 72 67 76 5b 31 5d 20 70 61 72 61 6d  he argv[1] param
cb00: 65 74 65 72 20 69 73 20 74 68 65 20 72 6f 77 69  eter is the rowi
cb10: 64 20 6f 66 20 61 20 6e 65 77 20 72 6f 77 20 74  d of a new row t
cb20: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 0d 0a  o be inserted ..
cb30: 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74 6f          /// into
cb40: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
cb50: 6c 65 2e 20 49 66 20 61 72 67 76 5b 31 5d 20 69  le. If argv[1] i
cb60: 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 74  s an SQL NULL, t
cb70: 68 65 6e 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  hen the implemen
cb80: 74 61 74 69 6f 6e 20 0d 0a 20 20 20 20 20 20 20  tation ..       
cb90: 20 2f 2f 2f 20 6d 75 73 74 20 63 68 6f 6f 73 65   /// must choose
cba0: 20 61 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65   a rowid for the
cbb0: 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20   newly inserted 
cbc0: 72 6f 77 2e 20 53 75 62 73 65 71 75 65 6e 74 20  row. Subsequent 
cbd0: 61 72 67 76 5b 5d 20 0d 0a 20 20 20 20 20 20 20  argv[] ..       
cbe0: 20 2f 2f 2f 20 65 6e 74 72 69 65 73 20 63 6f 6e   /// entries con
cbf0: 74 61 69 6e 20 76 61 6c 75 65 73 20 6f 66 20 74  tain values of t
cc00: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
cc10: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  e virtual table,
cc20: 20 69 6e 20 74 68 65 20 0d 0a 20 20 20 20 20 20   in the ..      
cc30: 20 20 2f 2f 2f 20 6f 72 64 65 72 20 74 68 61 74    /// order that
cc40: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 77 65 72   the columns wer
cc50: 65 20 64 65 63 6c 61 72 65 64 2e 20 54 68 65 20  e declared. The 
cc60: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
cc70: 73 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20 20 20  s will..        
cc80: 2f 2f 2f 20 6d 61 74 63 68 20 74 68 65 20 74 61  /// match the ta
cc90: 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ble declaration 
cca0: 74 68 61 74 20 74 68 65 20 78 43 6f 6e 6e 65 63  that the xConnec
ccb0: 74 20 6f 72 20 78 43 72 65 61 74 65 20 6d 65 74  t or xCreate met
ccc0: 68 6f 64 20 6d 61 64 65 20 0d 0a 20 20 20 20 20  hod made ..     
ccd0: 20 20 20 2f 2f 2f 20 75 73 69 6e 67 20 74 68 65     /// using the
cce0: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
ccf0: 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 20 41  _vtab() call.  A
cd00: 6c 6c 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  ll hidden column
cd10: 73 20 61 72 65 20 69 6e 63 6c 75 64 65 64 2e 0d  s are included..
cd20: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
cd30: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
cd40: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
cd50: 20 20 2f 2f 2f 20 57 68 65 6e 20 64 6f 69 6e 67    /// When doing
cd60: 20 61 6e 20 69 6e 73 65 72 74 20 77 69 74 68 6f   an insert witho
cd70: 75 74 20 61 20 72 6f 77 69 64 20 28 61 72 67 63  ut a rowid (argc
cd80: 3e 31 2c 20 61 72 67 76 5b 31 5d 20 69 73 20 61  >1, argv[1] is a
cd90: 6e 20 53 51 4c 20 4e 55 4c 4c 29 2c 20 74 68 65  n SQL NULL), the
cda0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69   ..        /// i
cdb0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75  mplementation mu
cdc0: 73 74 20 73 65 74 20 2a 70 52 6f 77 69 64 20 74  st set *pRowid t
cdd0: 6f 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  o the rowid of t
cde0: 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
cdf0: 64 20 72 6f 77 3b 20 0d 0a 20 20 20 20 20 20 20  d row; ..       
ce00: 20 2f 2f 2f 20 74 68 69 73 20 77 69 6c 6c 20 62   /// this will b
ce10: 65 63 6f 6d 65 20 74 68 65 20 76 61 6c 75 65 20  ecome the value 
ce20: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
ce30: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
ce40: 65 72 74 5f 72 6f 77 69 64 28 29 0d 0a 20 20 20  ert_rowid()..   
ce50: 20 20 20 20 20 2f 2f 2f 20 66 75 6e 63 74 69 6f       /// functio
ce60: 6e 2e 20 53 65 74 74 69 6e 67 20 74 68 69 73 20  n. Setting this 
ce70: 76 61 6c 75 65 20 69 6e 20 61 6c 6c 20 74 68 65  value in all the
ce80: 20 6f 74 68 65 72 20 63 61 73 65 73 20 69 73 20   other cases is 
ce90: 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
cea0: 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74  ;..        /// t
ceb0: 68 65 20 53 51 4c 69 74 65 20 65 6e 67 69 6e 65  he SQLite engine
cec0: 20 69 67 6e 6f 72 65 73 20 74 68 65 20 2a 70 52   ignores the *pR
ced0: 6f 77 69 64 20 72 65 74 75 72 6e 20 76 61 6c 75  owid return valu
cee0: 65 20 69 66 20 61 72 67 63 3d 3d 31 20 6f 72 20  e if argc==1 or 
cef0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 72  ..        /// ar
cf00: 67 76 5b 31 5d 20 69 73 20 6e 6f 74 20 61 6e 20  gv[1] is not an 
cf10: 53 51 4c 20 4e 55 4c 4c 2e 0d 0a 20 20 20 20 20  SQL NULL...     
cf20: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
cf30: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
cf40: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
cf50: 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 78 55 70  Each call to xUp
cf60: 64 61 74 65 20 77 69 6c 6c 20 66 61 6c 6c 20 69  date will fall i
cf70: 6e 74 6f 20 6f 6e 65 20 6f 66 20 63 61 73 65 73  nto one of cases
cf80: 20 73 68 6f 77 6e 20 62 65 6c 6f 77 2e 0d 0a 20   shown below... 
cf90: 20 20 20 20 20 20 20 2f 2f 2f 20 4e 6f 74 20 74         /// Not t
cfa0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
cfb0: 6f 20 3c 21 5b 43 44 41 54 41 5b 3c 62 3e 5d 5d  o <![CDATA[<b>]]
cfc0: 3e 61 72 67 76 5b 69 5d 3c 21 5b 43 44 41 54 41  >argv[i]<![CDATA
cfd0: 5b 3c 2f 62 3e 5d 5d 3e 20 6d 65 61 6e 20 74 68  [</b>]]> mean th
cfe0: 65 20 53 51 4c 20 76 61 6c 75 65 0d 0a 20 20 20  e SQL value..   
cff0: 20 20 20 20 20 2f 2f 2f 20 68 65 6c 64 20 77 69       /// held wi
d000: 74 68 69 6e 20 74 68 65 20 61 72 67 76 5b 69 5d  thin the argv[i]
d010: 20 6f 62 6a 65 63 74 2c 20 6e 6f 74 20 74 68 65   object, not the
d020: 20 61 72 67 76 5b 69 5d 0d 0a 20 20 20 20 20 20   argv[i]..      
d030: 20 20 2f 2f 2f 20 6f 62 6a 65 63 74 20 69 74 73    /// object its
d040: 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  elf...        //
d050: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
d060: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f     /// <para><co
d070: 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  de>..        ///
d080: 20 3c 21 5b 43 44 41 54 41 5b 3c 64 6c 3e 5d 5d   <![CDATA[<dl>]]
d090: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
d0a0: 21 5b 43 44 41 54 41 5b 3c 64 74 3e 5d 5d 3e 3c  ![CDATA[<dt>]]><
d0b0: 21 5b 43 44 41 54 41 5b 3c 62 3e 5d 5d 3e 61 72  ![CDATA[<b>]]>ar
d0c0: 67 63 20 3d 20 31 3c 21 5b 43 44 41 54 41 5b 3c  gc = 1<![CDATA[<
d0d0: 2f 62 3e 5d 5d 3e 0d 0a 20 20 20 20 20 20 20 20  /b>]]>..        
d0e0: 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 64  /// <![CDATA[</d
d0f0: 74 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 64  t>]]><![CDATA[<d
d100: 64 3e 5d 5d 3e 54 68 65 20 73 69 6e 67 6c 65 20  d>]]>The single 
d110: 72 6f 77 20 77 69 74 68 20 72 6f 77 69 64 20 65  row with rowid e
d120: 71 75 61 6c 20 74 6f 20 61 72 67 76 5b 30 5d 20  qual to argv[0] 
d130: 69 73 20 64 65 6c 65 74 65 64 2e 20 4e 6f 20 69  is deleted. No i
d140: 6e 73 65 72 74 20 6f 63 63 75 72 73 2e 0d 0a 20  nsert occurs... 
d150: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44         /// <![CD
d160: 41 54 41 5b 3c 2f 64 64 3e 5d 5d 3e 3c 21 5b 43  ATA[</dd>]]><![C
d170: 44 41 54 41 5b 3c 64 74 3e 5d 5d 3e 3c 21 5b 43  DATA[<dt>]]><![C
d180: 44 41 54 41 5b 3c 62 3e 5d 5d 3e 61 72 67 63 20  DATA[<b>]]>argc 
d190: 26 67 74 3b 20 31 20 3c 21 5b 43 44 41 54 41 5b  &gt; 1 <![CDATA[
d1a0: 3c 62 72 3e 5d 5d 3e 20 61 72 67 76 5b 30 5d 20  <br>]]> argv[0] 
d1b0: 3d 20 4e 55 4c 4c 3c 21 5b 43 44 41 54 41 5b 3c  = NULL<![CDATA[<
d1c0: 2f 62 72 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b  /br>]]><![CDATA[
d1d0: 3c 2f 62 3e 5d 5d 3e 0d 0a 20 20 20 20 20 20 20  </b>]]>..       
d1e0: 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f   /// <![CDATA[</
d1f0: 64 74 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c  dt>]]><![CDATA[<
d200: 64 64 3e 5d 5d 3e 41 20 6e 65 77 20 72 6f 77 20  dd>]]>A new row 
d210: 69 73 20 69 6e 73 65 72 74 65 64 20 77 69 74 68  is inserted with
d220: 20 61 20 72 6f 77 69 64 20 61 72 67 76 5b 31 5d   a rowid argv[1]
d230: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   and column valu
d240: 65 73 20 69 6e 0d 0a 20 20 20 20 20 20 20 20 2f  es in..        /
d250: 2f 2f 20 20 20 20 20 20 20 20 61 72 67 76 5b 32  //        argv[2
d260: 5d 20 61 6e 64 20 66 6f 6c 6c 6f 77 69 6e 67 2e  ] and following.
d270: 20 20 49 66 20 61 72 67 76 5b 31 5d 20 69 73 20    If argv[1] is 
d280: 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 0d 0a 20 20  an SQL NULL,..  
d290: 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 20        ///       
d2a0: 20 74 68 65 20 61 20 6e 65 77 20 75 6e 69 71 75   the a new uniqu
d2b0: 65 20 72 6f 77 69 64 20 69 73 20 67 65 6e 65 72  e rowid is gener
d2c0: 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
d2d0: 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ly...        ///
d2e0: 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 64 64 3e 5d   <![CDATA[</dd>]
d2f0: 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 64 74 3e 5d  ]><![CDATA[<dt>]
d300: 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 62 3e 5d 5d  ]><![CDATA[<b>]]
d310: 3e 61 72 67 63 20 26 67 74 3b 20 31 20 3c 21 5b  >argc &gt; 1 <![
d320: 43 44 41 54 41 5b 3c 62 72 3e 5d 5d 3e 20 61 72  CDATA[<br>]]> ar
d330: 67 76 5b 30 5d 20 26 23 38 38 30 30 3b 20 4e 55  gv[0] &#8800; NU
d340: 4c 4c 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 62 72  LL <![CDATA[</br
d350: 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 62 72  >]]><![CDATA[<br
d360: 3e 5d 5d 3e 20 61 72 67 76 5b 30 5d 20 3d 20 61  >]]> argv[0] = a
d370: 72 67 76 5b 31 5d 3c 21 5b 43 44 41 54 41 5b 3c  rgv[1]<![CDATA[<
d380: 2f 62 72 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b  /br>]]><![CDATA[
d390: 3c 2f 62 3e 5d 5d 3e 0d 0a 20 20 20 20 20 20 20  </b>]]>..       
d3a0: 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f   /// <![CDATA[</
d3b0: 64 74 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c  dt>]]><![CDATA[<
d3c0: 64 64 3e 5d 5d 3e 54 68 65 20 72 6f 77 20 77 69  dd>]]>The row wi
d3d0: 74 68 20 72 6f 77 69 64 20 61 72 67 76 5b 30 5d  th rowid argv[0]
d3e0: 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
d3f0: 20 6e 65 77 20 76 61 6c 75 65 73 20 0d 0a 20 20   new values ..  
d400: 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 20        ///       
d410: 20 69 6e 20 61 72 67 76 5b 32 5d 20 61 6e 64 20   in argv[2] and 
d420: 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
d430: 74 65 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 2f  ters...        /
d440: 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 64 64  // <![CDATA[</dd
d450: 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 64 74  >]]><![CDATA[<dt
d460: 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 62 3e  >]]><![CDATA[<b>
d470: 5d 5d 3e 61 72 67 63 20 26 67 74 3b 20 31 20 3c  ]]>argc &gt; 1 <
d480: 21 5b 43 44 41 54 41 5b 3c 62 72 3e 5d 5d 3e 20  ![CDATA[<br>]]> 
d490: 61 72 67 76 5b 30 5d 20 26 23 38 38 30 30 3b 20  argv[0] &#8800; 
d4a0: 4e 55 4c 4c 20 3c 21 5b 43 44 41 54 41 5b 3c 2f  NULL <![CDATA[</
d4b0: 62 72 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c  br>]]><![CDATA[<
d4c0: 62 72 3e 5d 5d 3e 20 61 72 67 76 5b 30 5d 20 26  br>]]> argv[0] &
d4d0: 23 38 38 30 30 3b 20 61 72 67 76 5b 31 5d 3c 21  #8800; argv[1]<!
d4e0: 5b 43 44 41 54 41 5b 3c 2f 62 72 3e 5d 5d 3e 3c  [CDATA[</br>]]><
d4f0: 21 5b 43 44 41 54 41 5b 3c 2f 62 3e 5d 5d 3e 0d  ![CDATA[</b>]]>.
d500: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b  .        /// <![
d510: 43 44 41 54 41 5b 3c 2f 64 74 3e 5d 5d 3e 3c 21  CDATA[</dt>]]><!
d520: 5b 43 44 41 54 41 5b 3c 64 64 3e 5d 5d 3e 20 54  [CDATA[<dd>]]> T
d530: 68 65 20 72 6f 77 20 77 69 74 68 20 72 6f 77 69  he row with rowi
d540: 64 20 61 72 67 76 5b 30 5d 20 69 73 20 75 70 64  d argv[0] is upd
d550: 61 74 65 64 20 77 69 74 68 20 72 6f 77 69 64 20  ated with rowid 
d560: 61 72 67 76 5b 31 5d 20 0d 0a 20 20 20 20 20 20  argv[1] ..      
d570: 20 20 2f 2f 2f 20 61 6e 64 20 6e 65 77 20 76 61    /// and new va
d580: 6c 75 65 73 20 69 6e 20 61 72 67 76 5b 32 5d 20  lues in argv[2] 
d590: 61 6e 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  and following pa
d5a0: 72 61 6d 65 74 65 72 73 2e 20 54 68 69 73 20 77  rameters. This w
d5b0: 69 6c 6c 20 6f 63 63 75 72 20 0d 0a 20 20 20 20  ill occur ..    
d5c0: 20 20 20 20 2f 2f 2f 20 77 68 65 6e 20 61 6e 20      /// when an 
d5d0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 75 70  SQL statement up
d5e0: 64 61 74 65 73 20 61 20 72 6f 77 69 64 2c 20 61  dates a rowid, a
d5f0: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
d600: 6e 74 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  nt:..        ///
d610: 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20   <para><code>.. 
d620: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 55 50         ///    UP
d630: 44 41 54 45 20 74 61 62 6c 65 20 53 45 54 20 72  DATE table SET r
d640: 6f 77 69 64 3d 72 6f 77 69 64 2b 31 20 57 48 45  owid=rowid+1 WHE
d650: 52 45 20 2e 2e 2e 3b 20 0d 0a 20 20 20 20 20 20  RE ...; ..      
d660: 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70    /// </code></p
d670: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
d680: 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 64 64 3e  / <![CDATA[</dd>
d690: 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 2f 64 6c  ]]><![CDATA[</dl
d6a0: 3e 5d 5d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  >]]>..        //
d6b0: 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e  / </code></para>
d6c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
d6d0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
d6e0: 2f 20 54 68 65 20 78 55 70 64 61 74 65 20 6d 65  / The xUpdate me
d6f0: 74 68 6f 64 20 6d 75 73 74 20 72 65 74 75 72 6e  thod must return
d700: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6e   SQLITE_OK if an
d710: 64 20 6f 6e 6c 79 20 69 66 20 69 74 20 69 73 0d  d only if it is.
d720: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 75 63  .        /// suc
d730: 63 65 73 73 66 75 6c 2e 20 20 49 66 20 61 20 66  cessful.  If a f
d740: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74  ailure occurs, t
d750: 68 65 20 78 55 70 64 61 74 65 20 6d 75 73 74 20  he xUpdate must 
d760: 72 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70  return an approp
d770: 72 69 61 74 65 0d 0a 20 20 20 20 20 20 20 20 2f  riate..        /
d780: 2f 2f 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  // error code.  
d790: 4f 6e 20 61 20 66 61 69 6c 75 72 65 2c 20 74 68  On a failure, th
d7a0: 65 20 70 56 54 61 62 2d 3e 7a 45 72 72 4d 73 67  e pVTab->zErrMsg
d7b0: 20 65 6c 65 6d 65 6e 74 20 6d 61 79 20 6f 70 74   element may opt
d7c0: 69 6f 6e 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20  ionally..       
d7d0: 20 2f 2f 2f 20 62 65 20 72 65 70 6c 61 63 65 64   /// be replaced
d7e0: 20 77 69 74 68 20 65 72 72 6f 72 20 6d 65 73 73   with error mess
d7f0: 61 67 65 20 74 65 78 74 20 73 74 6f 72 65 64 20  age text stored 
d800: 69 6e 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  in memory alloca
d810: 74 65 64 20 66 72 6f 6d 20 53 51 4c 69 74 65 20  ted from SQLite 
d820: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 75 73  ..        /// us
d830: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 73 75  ing functions su
d840: 63 68 20 61 73 20 73 71 6c 69 74 65 33 5f 6d 70  ch as sqlite3_mp
d850: 72 69 6e 74 66 28 29 20 6f 72 20 73 71 6c 69 74  rintf() or sqlit
d860: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0d 0a 20 20  e3_malloc()...  
d870: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
d880: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
d890: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
d8a0: 2f 2f 20 49 66 20 74 68 65 20 78 55 70 64 61 74  // If the xUpdat
d8b0: 65 20 6d 65 74 68 6f 64 20 76 69 6f 6c 61 74 65  e method violate
d8c0: 73 20 73 6f 6d 65 20 63 6f 6e 73 74 72 61 69 6e  s some constrain
d8d0: 74 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  t of the virtual
d8e0: 20 74 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20   table..        
d8f0: 2f 2f 2f 20 28 69 6e 63 6c 75 64 69 6e 67 2c 20  /// (including, 
d900: 62 75 74 20 6e 6f 74 20 6c 69 6d 69 74 65 64 20  but not limited 
d910: 74 6f 2c 20 61 74 74 65 6d 70 74 69 6e 67 20 74  to, attempting t
d920: 6f 20 73 74 6f 72 65 20 61 20 76 61 6c 75 65 20  o store a value 
d930: 6f 66 20 74 68 65 20 77 72 6f 6e 67 20 0d 0a 20  of the wrong .. 
d940: 20 20 20 20 20 20 20 2f 2f 2f 20 64 61 74 61 74         /// datat
d950: 79 70 65 2c 20 61 74 74 65 6d 70 74 69 6e 67 20  ype, attempting 
d960: 74 6f 20 73 74 6f 72 65 20 61 20 76 61 6c 75 65  to store a value
d970: 20 74 68 61 74 20 69 73 20 74 6f 6f 0d 0a 20 20   that is too..  
d980: 20 20 20 20 20 20 2f 2f 2f 20 6c 61 72 67 65 20        /// large 
d990: 6f 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 6f 72  or too small, or
d9a0: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 63   attempting to c
d9b0: 68 61 6e 67 65 20 61 20 72 65 61 64 2d 6f 6e 6c  hange a read-onl
d9c0: 79 20 76 61 6c 75 65 29 20 74 68 65 6e 20 74 68  y value) then th
d9d0: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 78  e..        /// x
d9e0: 55 70 64 61 74 65 20 6d 75 73 74 20 66 61 69 6c  Update must fail
d9f0: 20 77 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72   with an appropr
da00: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
da10: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
da20: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
da30: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
da40: 20 20 20 2f 2f 2f 20 54 68 65 72 65 20 6d 69 67     /// There mig
da50: 68 74 20 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  ht be one or mor
da60: 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  e sqlite3_vtab_c
da70: 75 72 73 6f 72 20 6f 62 6a 65 63 74 73 20 6f 70  ursor objects op
da80: 65 6e 20 61 6e 64 20 69 6e 20 75 73 65 20 0d 0a  en and in use ..
da90: 20 20 20 20 20 20 20 20 2f 2f 2f 20 6f 6e 20 74          /// on t
daa0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
dab0: 20 69 6e 73 74 61 6e 63 65 20 61 6e 64 20 70 65   instance and pe
dac0: 72 68 61 70 73 20 65 76 65 6e 20 6f 6e 20 74 68  rhaps even on th
dad0: 65 20 72 6f 77 20 6f 66 20 74 68 65 20 76 69 72  e row of the vir
dae0: 74 75 61 6c 0d 0a 20 20 20 20 20 20 20 20 2f 2f  tual..        //
daf0: 2f 20 74 61 62 6c 65 20 77 68 65 6e 20 74 68 65  / table when the
db00: 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20   xUpdate method 
db10: 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65  is invoked.  The
db20: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
db30: 6f 66 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  of..        /// 
db40: 78 55 70 64 61 74 65 20 6d 75 73 74 20 62 65 20  xUpdate must be 
db50: 70 72 65 70 61 72 65 64 20 66 6f 72 20 61 74 74  prepared for att
db60: 65 6d 70 74 73 20 74 6f 20 64 65 6c 65 74 65 20  empts to delete 
db70: 6f 72 20 6d 6f 64 69 66 79 20 72 6f 77 73 20 6f  or modify rows o
db80: 66 20 74 68 65 20 74 61 62 6c 65 0d 0a 20 20 20  f the table..   
db90: 20 20 20 20 20 2f 2f 2f 20 6f 75 74 20 66 72 6f       /// out fro
dba0: 6d 20 6f 74 68 65 72 20 65 78 69 73 74 69 6e 67  m other existing
dbb0: 20 63 75 72 73 6f 72 73 2e 20 20 49 66 20 74 68   cursors.  If th
dbc0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
dbd0: 63 61 6e 6e 6f 74 20 61 63 63 6f 6d 6d 6f 64 61  cannot accommoda
dbe0: 74 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  te..        /// 
dbf0: 73 75 63 68 20 63 68 61 6e 67 65 73 2c 20 74 68  such changes, th
dc00: 65 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64  e xUpdate method
dc10: 20 6d 75 73 74 20 72 65 74 75 72 6e 20 61 6e 20   must return an 
dc20: 65 72 72 6f 72 20 63 6f 64 65 2e 0d 0a 20 20 20  error code...   
dc30: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
dc40: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
dc50: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
dc60: 2f 20 54 68 65 20 78 55 70 64 61 74 65 20 6d 65  / The xUpdate me
dc70: 74 68 6f 64 20 69 73 20 6f 70 74 69 6f 6e 61 6c  thod is optional
dc80: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 49  ...        /// I
dc90: 66 20 74 68 65 20 78 55 70 64 61 74 65 20 70 6f  f the xUpdate po
dca0: 69 6e 74 65 72 20 69 6e 20 74 68 65 20 73 71 6c  inter in the sql
dcb0: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 66 6f 72 20  ite3_module for 
dcc0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0d  a virtual table.
dcd0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 73 20  .        /// is 
dce0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20  a NULL pointer, 
dcf0: 74 68 65 6e 20 74 68 65 20 76 69 72 74 75 61 6c  then the virtual
dd00: 20 74 61 62 6c 65 20 69 73 20 72 65 61 64 2d 6f   table is read-o
dd10: 6e 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  nly...        //
dd20: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
dd30: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
dd40: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
dd50: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74 61  param name="pVta
dd60: 62 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  b">..        ///
dd70: 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f 69 6e   The native poin
dd80: 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ter to the sqlit
dd90: 65 33 5f 76 74 61 62 20 64 65 72 69 76 65 64 20  e3_vtab derived 
dda0: 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20 20  structure...    
ddb0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
ddc0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
ddd0: 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 63 22  aram name="argc"
dde0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
ddf0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 77  he number of new
de00: 20 6f 72 20 6d 6f 64 69 66 69 65 64 20 63 6f 6c   or modified col
de10: 75 6d 6e 20 76 61 6c 75 65 73 20 63 6f 6e 74 61  umn values conta
de20: 69 6e 65 64 20 69 6e 0d 0a 20 20 20 20 20 20 20  ined in..       
de30: 20 2f 2f 2f 20 3c 70 61 72 61 6d 72 65 66 20 6e   /// <paramref n
de40: 61 6d 65 3d 22 61 72 67 76 22 20 2f 3e 2e 0d 0a  ame="argv" />...
de50: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
de60: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ram>..        //
de70: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61  / <param name="a
de80: 72 67 76 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f  rgv">..        /
de90: 2f 2f 20 54 68 65 20 61 72 72 61 79 20 6f 66 20  // The array of 
dea0: 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 73 20  native pointers 
deb0: 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  to sqlite3_value
dec0: 20 73 74 72 75 63 74 75 72 65 73 20 63 6f 6e 74   structures cont
ded0: 61 69 6e 69 6e 67 0d 0a 20 20 20 20 20 20 20 20  aining..        
dee0: 2f 2f 2f 20 74 68 65 20 6e 65 77 20 6f 72 20 6d  /// the new or m
def0: 6f 64 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 76  odified column v
df00: 61 6c 75 65 73 2c 20 69 66 20 61 6e 79 2e 0d 0a  alues, if any...
df10: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
df20: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ram>..        //
df30: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 72  / <param name="r
df40: 6f 77 49 64 22 3e 0d 0a 20 20 20 20 20 20 20 20  owId">..        
df50: 2f 2f 2f 20 55 70 6f 6e 20 73 75 63 63 65 73 73  /// Upon success
df60: 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  , this parameter
df70: 20 6d 75 73 74 20 62 65 20 6d 6f 64 69 66 69 65   must be modifie
df80: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
df90: 20 75 6e 69 71 75 65 0d 0a 20 20 20 20 20 20 20   unique..       
dfa0: 20 2f 2f 2f 20 69 6e 74 65 67 65 72 20 72 6f 77   /// integer row
dfb0: 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20   identifier for 
dfc0: 74 68 65 20 72 6f 77 20 74 68 61 74 20 77 61 73  the row that was
dfd0: 20 69 6e 73 65 72 74 65 64 2c 20 69 66 20 61 6e   inserted, if an
dfe0: 79 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  y...        /// 
dff0: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
e000: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d    /// <returns>.
e010: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73  .        /// A s
e020: 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72  tandard SQLite r
e030: 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20  eturn code...   
e040: 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72       /// </retur
e050: 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c  ns>..        SQL
e060: 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78 55 70  iteErrorCode xUp
e070: 64 61 74 65 28 0d 0a 20 20 20 20 20 20 20 20 20  date(..         
e080: 20 20 20 49 6e 74 50 74 72 20 70 56 74 61 62 2c     IntPtr pVtab,
e090: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ..            in
e0a0: 74 20 61 72 67 63 2c 0d 0a 20 20 20 20 20 20 20  t argc,..       
e0b0: 20 20 20 20 20 49 6e 74 50 74 72 20 61 72 67 76       IntPtr argv
e0c0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ,..            r
e0d0: 65 66 20 6c 6f 6e 67 20 72 6f 77 49 64 0d 0a 20  ef long rowId.. 
e0e0: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d             );...
e0f0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
e100: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e120: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e130: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e140: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ....        /// 
e150: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  <summary>..     
e160: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f     /// <para><co
e170: 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  de>..        ///
e180: 20 69 6e 74 20 28 2a 78 42 65 67 69 6e 29 28 73   int (*xBegin)(s
e190: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
e1a0: 61 62 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ab);..        //
e1b0: 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e  / </code></para>
e1c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
e1d0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
e1e0: 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20 62 65  / This method be
e1f0: 67 69 6e 73 20 61 20 74 72 61 6e 73 61 63 74 69  gins a transacti
e200: 6f 6e 20 6f 6e 20 61 20 76 69 72 74 75 61 6c 20  on on a virtual 
e210: 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  table...        
e220: 2f 2f 2f 20 54 68 69 73 20 69 73 20 6d 65 74 68  /// This is meth
e230: 6f 64 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20  od is optional. 
e240: 20 54 68 65 20 78 42 65 67 69 6e 20 70 6f 69 6e   The xBegin poin
e250: 74 65 72 20 6f 66 20 73 71 6c 69 74 65 33 5f 6d  ter of sqlite3_m
e260: 6f 64 75 6c 65 0d 0a 20 20 20 20 20 20 20 20 2f  odule..        /
e270: 2f 2f 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 0d  // may be NULL..
e280: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
e290: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
e2a0: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
e2b0: 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f    /// This metho
e2c0: 64 20 69 73 20 61 6c 77 61 79 73 20 66 6f 6c 6c  d is always foll
e2d0: 6f 77 65 64 20 62 79 20 6f 6e 65 20 63 61 6c 6c  owed by one call
e2e0: 20 74 6f 20 65 69 74 68 65 72 20 74 68 65 0d 0a   to either the..
e2f0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 78 43 6f 6d          /// xCom
e300: 6d 69 74 20 6f 72 20 78 52 6f 6c 6c 62 61 63 6b  mit or xRollback
e310: 20 6d 65 74 68 6f 64 2e 20 20 56 69 72 74 75 61   method.  Virtua
e320: 6c 20 74 61 62 6c 65 20 74 72 61 6e 73 61 63 74  l table transact
e330: 69 6f 6e 73 20 64 6f 0d 0a 20 20 20 20 20 20 20  ions do..       
e340: 20 2f 2f 2f 20 6e 6f 74 20 6e 65 73 74 2c 20 73   /// not nest, s
e350: 6f 20 74 68 65 20 78 42 65 67 69 6e 20 6d 65 74  o the xBegin met
e360: 68 6f 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hod will not be 
e370: 69 6e 76 6f 6b 65 64 20 6d 6f 72 65 20 74 68 61  invoked more tha
e380: 6e 20 6f 6e 63 65 0d 0a 20 20 20 20 20 20 20 20  n once..        
e390: 2f 2f 2f 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  /// on a single 
e3a0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0d 0a 20  virtual table.. 
e3b0: 20 20 20 20 20 20 20 2f 2f 2f 20 77 69 74 68 6f         /// witho
e3c0: 75 74 20 61 6e 20 69 6e 74 65 72 76 65 6e 69 6e  ut an intervenin
e3d0: 67 20 63 61 6c 6c 20 74 6f 20 65 69 74 68 65 72  g call to either
e3e0: 20 78 43 6f 6d 6d 69 74 20 6f 72 20 78 52 6f 6c   xCommit or xRol
e3f0: 6c 62 61 63 6b 2e 0d 0a 20 20 20 20 20 20 20 20  lback...        
e400: 2f 2f 2f 20 4d 75 6c 74 69 70 6c 65 20 63 61 6c  /// Multiple cal
e410: 6c 73 20 74 6f 20 6f 74 68 65 72 20 6d 65 74 68  ls to other meth
e420: 6f 64 73 20 63 61 6e 20 61 6e 64 20 6c 69 6b 65  ods can and like
e430: 6c 79 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 6e  ly will occur in
e440: 20 62 65 74 77 65 65 6e 0d 0a 20 20 20 20 20 20   between..      
e450: 20 20 2f 2f 2f 20 74 68 65 20 78 42 65 67 69 6e    /// the xBegin
e460: 20 61 6e 64 20 74 68 65 20 63 6f 72 72 65 73 70   and the corresp
e470: 6f 6e 64 69 6e 67 20 78 43 6f 6d 6d 69 74 20 6f  onding xCommit o
e480: 72 20 78 52 6f 6c 6c 62 61 63 6b 2e 0d 0a 20 20  r xRollback...  
e490: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
e4a0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
e4b0: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  /summary>..     
e4c0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
e4d0: 6d 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20 20 20  me="pVtab">..   
e4e0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74       /// The nat
e4f0: 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ive pointer to t
e500: 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  he sqlite3_vtab 
e510: 64 65 72 69 76 65 64 20 73 74 72 75 63 74 75 72  derived structur
e520: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
e530: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
e540: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d    /// <returns>.
e550: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73  .        /// A s
e560: 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72  tandard SQLite r
e570: 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20  eturn code...   
e580: 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72       /// </retur
e590: 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c  ns>..        SQL
e5a0: 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78 42 65  iteErrorCode xBe
e5b0: 67 69 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20  gin(..          
e5c0: 20 20 49 6e 74 50 74 72 20 70 56 74 61 62 0d 0a    IntPtr pVtab..
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a              );..
e5e0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
e5f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e630: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  /....        ///
e640: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
e650: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63      /// <para><c
e660: 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ode>..        //
e670: 2f 20 69 6e 74 20 28 2a 78 53 79 6e 63 29 28 73  / int (*xSync)(s
e680: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
e690: 61 62 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ab);..        //
e6a0: 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e  / </code></para>
e6b0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
e6c0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
e6d0: 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20 73 69  / This method si
e6e0: 67 6e 61 6c 73 20 74 68 65 20 73 74 61 72 74 20  gnals the start 
e6f0: 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
e700: 6f 6d 6d 69 74 20 6f 6e 20 61 20 76 69 72 74 75  ommit on a virtu
e710: 61 6c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  al..        /// 
e720: 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  table...        
e730: 2f 2f 2f 20 54 68 69 73 20 69 73 20 6d 65 74 68  /// This is meth
e740: 6f 64 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20  od is optional. 
e750: 20 54 68 65 20 78 53 79 6e 63 20 70 6f 69 6e 74   The xSync point
e760: 65 72 20 6f 66 20 73 71 6c 69 74 65 33 5f 6d 6f  er of sqlite3_mo
e770: 64 75 6c 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f  dule..        //
e780: 2f 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 0d 0a  / may be NULL...
e790: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
e7a0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
e7b0: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
e7c0: 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f 64   /// This method
e7d0: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
e7e0: 20 61 66 74 65 72 20 63 61 6c 6c 20 74 6f 20 74   after call to t
e7f0: 68 65 20 78 42 65 67 69 6e 20 6d 65 74 68 6f 64  he xBegin method
e800: 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 2f 2f   and..        //
e810: 2f 20 70 72 69 6f 72 20 74 6f 20 61 6e 20 78 43  / prior to an xC
e820: 6f 6d 6d 69 74 20 6f 72 20 78 52 6f 6c 6c 62 61  ommit or xRollba
e830: 63 6b 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  ck.  In order to
e840: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 77 6f 2d 70   implement two-p
e850: 68 61 73 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f  hase..        //
e860: 2f 20 63 6f 6d 6d 69 74 2c 20 74 68 65 20 78 53  / commit, the xS
e870: 79 6e 63 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6c  ync method on al
e880: 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  l virtual tables
e890: 20 69 73 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   is invoked prio
e8a0: 72 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 2f 2f  r to..        //
e8b0: 2f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 78  / invoking the x
e8c0: 43 6f 6d 6d 69 74 20 6d 65 74 68 6f 64 20 6f 6e  Commit method on
e8d0: 20 61 6e 79 20 76 69 72 74 75 61 6c 20 74 61 62   any virtual tab
e8e0: 6c 65 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74  le.  If any of t
e8f0: 68 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  he ..        ///
e900: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 73 20 66   xSync methods f
e910: 61 69 6c 2c 20 74 68 65 20 65 6e 74 69 72 65 20  ail, the entire 
e920: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
e930: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0d 0a 20 20 20  olled back...   
e940: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
e950: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
e960: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
e970: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
e980: 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20 20 20 20  e="pVtab">..    
e990: 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69      /// The nati
e9a0: 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ve pointer to th
e9b0: 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 64  e sqlite3_vtab d
e9c0: 65 72 69 76 65 64 20 73 74 72 75 63 74 75 72 65  erived structure
e9d0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
e9e0: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
e9f0: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a   /// <returns>..
ea00: 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74          /// A st
ea10: 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72 65  andard SQLite re
ea20: 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20  turn code...    
ea30: 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e      /// </return
ea40: 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69  s>..        SQLi
ea50: 74 65 45 72 72 6f 72 43 6f 64 65 20 78 53 79 6e  teErrorCode xSyn
ea60: 63 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  c(..            
ea70: 49 6e 74 50 74 72 20 70 56 74 61 62 0d 0a 20 20  IntPtr pVtab..  
ea80: 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a            );....
ea90: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
eaa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
eab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
eac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ead0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
eae0: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
eaf0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
eb00: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64    /// <para><cod
eb10: 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e>..        /// 
eb20: 69 6e 74 20 28 2a 78 43 6f 6d 6d 69 74 29 28 73  int (*xCommit)(s
eb30: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
eb40: 61 62 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ab);..        //
eb50: 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e  / </code></para>
eb60: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
eb70: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
eb80: 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20 63 61  / This method ca
eb90: 75 73 65 73 20 61 20 76 69 72 74 75 61 6c 20 74  uses a virtual t
eba0: 61 62 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  able transaction
ebb0: 20 74 6f 20 63 6f 6d 6d 69 74 2e 0d 0a 20 20 20   to commit...   
ebc0: 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 69 73       /// This is
ebd0: 20 6d 65 74 68 6f 64 20 69 73 20 6f 70 74 69 6f   method is optio
ebe0: 6e 61 6c 2e 20 20 54 68 65 20 78 43 6f 6d 6d 69  nal.  The xCommi
ebf0: 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 73 71 6c  t pointer of sql
ec00: 69 74 65 33 5f 6d 6f 64 75 6c 65 0d 0a 20 20 20  ite3_module..   
ec10: 20 20 20 20 20 2f 2f 2f 20 6d 61 79 20 62 65 20       /// may be 
ec20: 4e 55 4c 4c 2e 0d 0a 20 20 20 20 20 20 20 20 2f  NULL...        /
ec30: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
ec40: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
ec50: 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 63 61          /// A ca
ec60: 6c 6c 20 74 6f 20 74 68 69 73 20 6d 65 74 68 6f  ll to this metho
ec70: 64 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 73  d always follows
ec80: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
ec90: 20 78 42 65 67 69 6e 20 61 6e 64 0d 0a 20 20 20   xBegin and..   
eca0: 20 20 20 20 20 2f 2f 2f 20 78 53 79 6e 63 2e 0d       /// xSync..
ecb0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
ecc0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
ecd0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
ece0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
ecf0: 20 6e 61 6d 65 3d 22 70 56 74 61 62 22 3e 0d 0a   name="pVtab">..
ed00: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
ed10: 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74  native pointer t
ed20: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74  o the sqlite3_vt
ed30: 61 62 20 64 65 72 69 76 65 64 20 73 74 72 75 63  ab derived struc
ed40: 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f  ture...        /
ed50: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
ed60: 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e       /// <return
ed70: 73 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  s>..        /// 
ed80: 41 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74  A standard SQLit
ed90: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a  e return code...
eda0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65          /// </re
edb0: 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20  turns>..        
edc0: 53 51 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20  SQLiteErrorCode 
edd0: 78 43 6f 6d 6d 69 74 28 0d 0a 20 20 20 20 20 20  xCommit(..      
ede0: 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 56 74        IntPtr pVt
edf0: 61 62 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab..            
ee00: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  );....        //
ee10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ee20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ee30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ee40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ee50: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
ee60: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
ee70: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
ee80: 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20  a><code>..      
ee90: 20 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 52 6f 6c    /// int (*xRol
eea0: 6c 62 61 63 6b 29 28 73 71 6c 69 74 65 33 5f 76  lback)(sqlite3_v
eeb0: 74 61 62 20 2a 70 56 54 61 62 29 3b 0d 0a 20 20  tab *pVTab);..  
eec0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65        /// </code
eed0: 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  ></para>..      
eee0: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
eef0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d        /// This m
ef00: 65 74 68 6f 64 20 63 61 75 73 65 73 20 61 20 76  ethod causes a v
ef10: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 72 61  irtual table tra
ef20: 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c  nsaction to roll
ef30: 62 61 63 6b 2e 0d 0a 20 20 20 20 20 20 20 20 2f  back...        /
ef40: 2f 2f 20 54 68 69 73 20 69 73 20 6d 65 74 68 6f  // This is metho
ef50: 64 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  d is optional.  
ef60: 54 68 65 20 78 52 6f 6c 6c 62 61 63 6b 20 70 6f  The xRollback po
ef70: 69 6e 74 65 72 20 6f 66 20 73 71 6c 69 74 65 33  inter of sqlite3
ef80: 5f 6d 6f 64 75 6c 65 0d 0a 20 20 20 20 20 20 20  _module..       
ef90: 20 2f 2f 2f 20 6d 61 79 20 62 65 20 4e 55 4c 4c   /// may be NULL
efa0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
efb0: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
efc0: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
efd0: 20 20 20 20 2f 2f 2f 20 41 20 63 61 6c 6c 20 74      /// A call t
efe0: 6f 20 74 68 69 73 20 6d 65 74 68 6f 64 20 61 6c  o this method al
eff0: 77 61 79 73 20 66 6f 6c 6c 6f 77 73 20 61 20 70  ways follows a p
f000: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 78 42 65  rior call to xBe
f010: 67 69 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  gin...        //
f020: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
f030: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
f040: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
f050: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74 61  param name="pVta
f060: 62 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  b">..        ///
f070: 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f 69 6e   The native poin
f080: 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ter to the sqlit
f090: 65 33 5f 76 74 61 62 20 64 65 72 69 76 65 64 20  e3_vtab derived 
f0a0: 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20 20  structure...    
f0b0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
f0c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72  ..        /// <r
f0d0: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20  eturns>..       
f0e0: 20 2f 2f 2f 20 41 20 73 74 61 6e 64 61 72 64 20   /// A standard 
f0f0: 53 51 4c 69 74 65 20 72 65 74 75 72 6e 20 63 6f  SQLite return co
f100: 64 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  de...        ///
f110: 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20   </returns>..   
f120: 20 20 20 20 20 53 51 4c 69 74 65 45 72 72 6f 72       SQLiteError
f130: 43 6f 64 65 20 78 52 6f 6c 6c 62 61 63 6b 28 0d  Code xRollback(.
f140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  .            Int
f150: 50 74 72 20 70 56 74 61 62 0d 0a 20 20 20 20 20  Ptr pVtab..     
f160: 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20         );....   
f170: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
f180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f190: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f1a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f1b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
f1c0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d          /// <sum
f1d0: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f  mary>..        /
f1e0: 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d  // <para><code>.
f1f0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74  .        /// int
f200: 20 28 2a 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e   (*xFindFunction
f210: 29 28 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  )(..        /// 
f220: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
f230: 70 56 74 61 62 2c 0d 0a 20 20 20 20 20 20 20 20  pVtab,..        
f240: 2f 2f 2f 20 20 20 69 6e 74 20 6e 41 72 67 2c 0d  ///   int nArg,.
f250: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 63  .        ///   c
f260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
f270: 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20  ,..        ///  
f280: 20 76 6f 69 64 20 28 2a 2a 70 78 46 75 6e 63 29   void (**pxFunc)
f290: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
f2a0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
f2b0: 6c 75 65 2a 2a 29 2c 0d 0a 20 20 20 20 20 20 20  lue**),..       
f2c0: 20 2f 2f 2f 20 20 20 76 6f 69 64 20 2a 2a 70 70   ///   void **pp
f2d0: 41 72 67 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  Arg..        ///
f2e0: 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   );..        ///
f2f0: 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d   </code></para>.
f300: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
f310: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
f320: 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20   This method is 
f330: 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 73 71  called during sq
f340: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
f350: 74 6f 20 67 69 76 65 20 74 68 65 20 76 69 72 74  to give the virt
f360: 75 61 6c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ual..        ///
f370: 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74   table implement
f380: 61 74 69 6f 6e 20 61 6e 20 6f 70 70 6f 72 74 75  ation an opportu
f390: 6e 69 74 79 20 74 6f 20 6f 76 65 72 6c 6f 61 64  nity to overload
f3a0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 0d 0a 20 20   functions. ..  
f3b0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d        /// This m
f3c0: 65 74 68 6f 64 20 6d 61 79 20 62 65 20 73 65 74  ethod may be set
f3d0: 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 77 68 69 63   to NULL in whic
f3e0: 68 20 63 61 73 65 20 6e 6f 20 6f 76 65 72 6c 6f  h case no overlo
f3f0: 61 64 69 6e 67 20 6f 63 63 75 72 73 2e 0d 0a 20  ading occurs... 
f400: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
f410: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
f420: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
f430: 2f 2f 2f 20 57 68 65 6e 20 61 20 66 75 6e 63 74  /// When a funct
f440: 69 6f 6e 20 75 73 65 73 20 61 20 63 6f 6c 75 6d  ion uses a colum
f450: 6e 20 66 72 6f 6d 20 61 20 76 69 72 74 75 61 6c  n from a virtual
f460: 20 74 61 62 6c 65 20 61 73 20 69 74 73 20 66 69   table as its fi
f470: 72 73 74 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  rst ..        //
f480: 2f 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73  / argument, this
f490: 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c 65   method is calle
f4a0: 64 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  d to see if the 
f4b0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 6f  virtual table wo
f4c0: 75 6c 64 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  uld ..        //
f4d0: 2f 20 6c 69 6b 65 20 74 6f 20 6f 76 65 72 6c 6f  / like to overlo
f4e0: 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  ad the function.
f4f0: 20 54 68 65 20 66 69 72 73 74 20 74 68 72 65 65   The first three
f500: 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
f510: 69 6e 70 75 74 73 3a 20 0d 0a 20 20 20 20 20 20  inputs: ..      
f520: 20 20 2f 2f 2f 20 74 68 65 20 76 69 72 74 75 61    /// the virtua
f530: 6c 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 75 6d  l table, the num
f540: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
f550: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
f560: 2c 20 61 6e 64 20 74 68 65 20 0d 0a 20 20 20 20  , and the ..    
f570: 20 20 20 20 2f 2f 2f 20 6e 61 6d 65 20 6f 66 20      /// name of 
f580: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  the function. If
f590: 20 6e 6f 20 6f 76 65 72 6c 6f 61 64 69 6e 67 20   no overloading 
f5a0: 69 73 20 64 65 73 69 72 65 64 2c 20 74 68 69 73  is desired, this
f5b0: 20 6d 65 74 68 6f 64 0d 0a 20 20 20 20 20 20 20   method..       
f5c0: 20 2f 2f 2f 20 72 65 74 75 72 6e 73 20 30 2e 20   /// returns 0. 
f5d0: 54 6f 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20  To overload the 
f5e0: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 69 73 20 6d  function, this m
f5f0: 65 74 68 6f 64 20 77 72 69 74 65 73 20 74 68 65  ethod writes the
f600: 20 6e 65 77 20 0d 0a 20 20 20 20 20 20 20 20 2f   new ..        /
f610: 2f 2f 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  // function impl
f620: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 6f 20  ementation into 
f630: 2a 70 78 46 75 6e 63 20 61 6e 64 20 77 72 69 74  *pxFunc and writ
f640: 65 73 20 75 73 65 72 20 64 61 74 61 20 69 6e 74  es user data int
f650: 6f 20 2a 70 70 41 72 67 20 0d 0a 20 20 20 20 20  o *ppArg ..     
f660: 20 20 20 2f 2f 2f 20 61 6e 64 20 72 65 74 75 72     /// and retur
f670: 6e 73 20 31 2e 0d 0a 20 20 20 20 20 20 20 20 2f  ns 1...        /
f680: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
f690: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
f6a0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 4e 6f 74 65          /// Note
f6b0: 20 74 68 61 74 20 69 6e 66 69 78 20 66 75 6e 63   that infix func
f6c0: 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
f6d0: 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
f6e0: 41 54 43 48 29 20 72 65 76 65 72 73 65 20 0d 0a  ATCH) reverse ..
f6f0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20          /// the 
f700: 6f 72 64 65 72 20 6f 66 20 74 68 65 69 72 20 61  order of their a
f710: 72 67 75 6d 65 6e 74 73 2e 20 53 6f 20 22 6c 69  rguments. So "li
f720: 6b 65 28 41 2c 42 29 22 20 69 73 20 65 71 75 69  ke(A,B)" is equi
f730: 76 61 6c 65 6e 74 20 74 6f 20 22 42 20 6c 69 6b  valent to "B lik
f740: 65 20 41 22 2e 20 0d 0a 20 20 20 20 20 20 20 20  e A". ..        
f750: 2f 2f 2f 20 46 6f 72 20 74 68 65 20 66 6f 72 6d  /// For the form
f760: 20 22 42 20 6c 69 6b 65 20 41 22 20 74 68 65 20   "B like A" the 
f770: 42 20 74 65 72 6d 20 69 73 20 63 6f 6e 73 69 64  B term is consid
f780: 65 72 65 64 20 74 68 65 20 66 69 72 73 74 20 61  ered the first a
f790: 72 67 75 6d 65 6e 74 20 0d 0a 20 20 20 20 20 20  rgument ..      
f7a0: 20 20 2f 2f 2f 20 74 6f 20 74 68 65 20 66 75 6e    /// to the fun
f7b0: 63 74 69 6f 6e 2e 20 42 75 74 20 66 6f 72 20 22  ction. But for "
f7c0: 6c 69 6b 65 28 41 2c 42 29 22 20 74 68 65 20 41  like(A,B)" the A
f7d0: 20 74 65 72 6d 20 69 73 20 63 6f 6e 73 69 64 65   term is conside
f7e0: 72 65 64 20 74 68 65 20 0d 0a 20 20 20 20 20 20  red the ..      
f7f0: 20 20 2f 2f 2f 20 66 69 72 73 74 20 61 72 67 75    /// first argu
f800: 6d 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 2f  ment...        /
f810: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
f820: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
f830: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
f840: 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
f850: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
f860: 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
f870: 65 20 76 61 6c 69 64 20 66 6f 72 0d 0a 20 20 20  e valid for..   
f880: 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 6c 69 66       /// the lif
f890: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 73 71 6c  etime of the sql
f8a0: 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74  ite3_vtab object
f8b0: 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 66 69   given in the fi
f8c0: 72 73 74 20 70 61 72 61 6d 65 74 65 72 2e 0d 0a  rst parameter...
f8d0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
f8e0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
f8f0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
f900: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
f910: 6e 61 6d 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20  name="pVtab">.. 
f920: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
f930: 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f  ative pointer to
f940: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
f950: 62 20 64 65 72 69 76 65 64 20 73 74 72 75 63 74  b derived struct
f960: 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ure...        //
f970: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
f980: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
f990: 61 6d 65 3d 22 6e 41 72 67 22 3e 0d 0a 20 20 20  ame="nArg">..   
f9a0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 75 6d       /// The num
f9b0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
f9c0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
f9d0: 20 62 65 69 6e 67 20 73 6f 75 67 68 74 2e 0d 0a   being sought...
f9e0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
f9f0: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ram>..        //
fa00: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 7a  / <param name="z
fa10: 4e 61 6d 65 22 3e 0d 0a 20 20 20 20 20 20 20 20  Name">..        
fa20: 2f 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66 20  /// The name of 
fa30: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 62 65 69  the function bei
fa40: 6e 67 20 73 6f 75 67 68 74 2e 0d 0a 20 20 20 20  ng sought...    
fa50: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
fa60: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
fa70: 61 72 61 6d 20 6e 61 6d 65 3d 22 63 61 6c 6c 62  aram name="callb
fa80: 61 63 6b 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f  ack">..        /
fa90: 2f 2f 20 55 70 6f 6e 20 73 75 63 63 65 73 73 2c  // Upon success,
faa0: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
fab0: 6d 75 73 74 20 62 65 20 6d 6f 64 69 66 69 65 64  must be modified
fac0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d   to contain the.
fad0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 64 65 6c  .        /// del
fae0: 65 67 61 74 65 20 72 65 73 70 6f 6e 73 69 62 6c  egate responsibl
faf0: 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69  e for implementi
fb00: 6e 67 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ng the specified
fb10: 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20   function...    
fb20: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
fb30: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
fb40: 61 72 61 6d 20 6e 61 6d 65 3d 22 70 43 6c 69 65  aram name="pClie
fb50: 6e 74 44 61 74 61 22 3e 0d 0a 20 20 20 20 20 20  ntData">..      
fb60: 20 20 2f 2f 2f 20 55 70 6f 6e 20 73 75 63 63 65    /// Upon succe
fb70: 73 73 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74  ss, this paramet
fb80: 65 72 20 6d 75 73 74 20 62 65 20 6d 6f 64 69 66  er must be modif
fb90: 69 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ied to contain t
fba0: 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  he..        /// 
fbb0: 6e 61 74 69 76 65 20 75 73 65 72 2d 64 61 74 61  native user-data
fbc0: 20 70 6f 69 6e 74 65 72 20 61 73 73 6f 63 69 61   pointer associa
fbd0: 74 65 64 20 77 69 74 68 0d 0a 20 20 20 20 20 20  ted with..      
fbe0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 72 65 66 20    /// <paramref 
fbf0: 6e 61 6d 65 3d 22 63 61 6c 6c 62 61 63 6b 22 20  name="callback" 
fc00: 2f 3e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  />...        ///
fc10: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
fc20: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
fc30: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 4e 6f  ..        /// No
fc40: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
fc50: 65 63 69 66 69 65 64 20 66 75 6e 63 74 69 6f 6e  ecified function
fc60: 20 77 61 73 20 66 6f 75 6e 64 3b 20 7a 65 72 6f   was found; zero
fc70: 20 6f 74 68 65 72 77 69 73 65 2e 0d 0a 20 20 20   otherwise...   
fc80: 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72       /// </retur
fc90: 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 69 6e 74  ns>..        int
fca0: 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0d   xFindFunction(.
fcb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  .            Int
fcc0: 50 74 72 20 70 56 74 61 62 2c 0d 0a 20 20 20 20  Ptr pVtab,..    
fcd0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 41 72 67          int nArg
fce0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  ,..            I
fcf0: 6e 74 50 74 72 20 7a 4e 61 6d 65 2c 0d 0a 20 20  ntPtr zName,..  
fd00: 20 20 20 20 20 20 20 20 20 20 72 65 66 20 53 51            ref SQ
fd10: 4c 69 74 65 43 61 6c 6c 62 61 63 6b 20 63 61 6c  LiteCallback cal
fd20: 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20  lback,..        
fd30: 20 20 20 20 72 65 66 20 49 6e 74 50 74 72 20 70      ref IntPtr p
fd40: 43 6c 69 65 6e 74 44 61 74 61 0d 0a 20 20 20 20  ClientData..    
fd50: 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20          );....  
fd60: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
fd70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fd80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fd90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fda0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
fdb0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75  .        /// <su
fdc0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20  mmary>..        
fdd0: 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e  /// <para><code>
fde0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e  ..        /// in
fdf0: 74 20 28 2a 78 52 65 6e 61 6d 65 29 28 73 71 6c  t (*xRename)(sql
fe00: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
fe10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
fe20: 65 77 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ew);..        //
fe30: 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e  / </code></para>
fe40: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
fe50: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
fe60: 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20 70 72  / This method pr
fe70: 6f 76 69 64 65 73 20 6e 6f 74 69 66 69 63 61 74  ovides notificat
fe80: 69 6f 6e 20 74 68 61 74 20 74 68 65 20 76 69 72  ion that the vir
fe90: 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65  tual table imple
fea0: 6d 65 6e 74 61 74 69 6f 6e 0d 0a 20 20 20 20 20  mentation..     
feb0: 20 20 20 2f 2f 2f 20 74 68 61 74 20 74 68 65 20     /// that the 
fec0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
fed0: 6c 6c 20 62 65 20 67 69 76 65 6e 20 61 20 6e 65  ll be given a ne
fee0: 77 20 6e 61 6d 65 2e 20 0d 0a 20 20 20 20 20 20  w name. ..      
fef0: 20 20 2f 2f 2f 20 49 66 20 74 68 69 73 20 6d 65    /// If this me
ff00: 74 68 6f 64 20 72 65 74 75 72 6e 73 20 53 51 4c  thod returns SQL
ff10: 49 54 45 5f 4f 4b 20 74 68 65 6e 20 53 51 4c 69  ITE_OK then SQLi
ff20: 74 65 20 72 65 6e 61 6d 65 73 20 74 68 65 20 74  te renames the t
ff30: 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f  able...        /
ff40: 2f 2f 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f  // If this metho
ff50: 64 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  d returns an err
ff60: 6f 72 20 63 6f 64 65 20 74 68 65 6e 20 74 68 65  or code then the
ff70: 20 72 65 6e 61 6d 69 6e 67 20 69 73 20 70 72 65   renaming is pre
ff80: 76 65 6e 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  vented...       
ff90: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
ffa0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
ffb0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
ffc0: 65 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64  e xRename method
ffd0: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
ffe0: 20 65 76 65 72 79 20 76 69 72 74 75 61 6c 20 74   every virtual t
fff0: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
10000 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ion...        //
10010 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
10020 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
10030 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
10040 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74 61  param name="pVta
10050 62 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  b">..        ///
10060 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f 69 6e   The native poin
10070 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ter to the sqlit
10080 65 33 5f 76 74 61 62 20 64 65 72 69 76 65 64 20  e3_vtab derived 
10090 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20 20  structure...    
100a0 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
100b0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
100c0 61 72 61 6d 20 6e 61 6d 65 3d 22 7a 4e 65 77 22  aram name="zNew"
100d0 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
100e0 68 65 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65  he native pointe
100f0 72 20 74 6f 20 74 68 65 20 55 54 46 2d 38 20 65  r to the UTF-8 e
10100 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 20 63 6f  ncoded string co
10110 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 65 77  ntaining the new
10120 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6e 61  ..        /// na
10130 6d 65 20 66 6f 72 20 74 68 65 20 76 69 72 74 75  me for the virtu
10140 61 6c 20 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20  al table...     
10150 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d     /// </param>.
10160 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65  .        /// <re
10170 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20  turns>..        
10180 2f 2f 2f 20 41 20 73 74 61 6e 64 61 72 64 20 53  /// A standard S
10190 51 4c 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  QLite return cod
101a0 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
101b0 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
101c0 20 20 20 20 53 51 4c 69 74 65 45 72 72 6f 72 43      SQLiteErrorC
101d0 6f 64 65 20 78 52 65 6e 61 6d 65 28 0d 0a 20 20  ode xRename(..  
101e0 20 20 20 20 20 20 20 20 20 20 49 6e 74 50 74 72            IntPtr
101f0 20 70 56 74 61 62 2c 0d 0a 20 20 20 20 20 20 20   pVtab,..       
10200 20 20 20 20 20 49 6e 74 50 74 72 20 7a 4e 65 77       IntPtr zNew
10210 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  ..            );
10220 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
10230 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10240 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10250 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10260 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10270 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  ///....        /
10280 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
10290 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
102a0 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20  <code>..        
102b0 2f 2f 2f 20 69 6e 74 20 28 2a 78 53 61 76 65 70  /// int (*xSavep
102c0 6f 69 6e 74 29 28 73 71 6c 69 74 65 33 5f 76 74  oint)(sqlite3_vt
102d0 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 29 3b  ab *pVtab, int);
102e0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e  ..        /// in
102f0 74 20 28 2a 78 52 65 6c 65 61 73 65 29 28 73 71  t (*xRelease)(sq
10300 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
10310 62 2c 20 69 6e 74 29 3b 0d 0a 20 20 20 20 20 20  b, int);..      
10320 20 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 52 6f 6c    /// int (*xRol
10330 6c 62 61 63 6b 54 6f 29 28 73 71 6c 69 74 65 33  lbackTo)(sqlite3
10340 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 69 6e  _vtab *pVtab, in
10350 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  t);..        ///
10360 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d   </code></para>.
10370 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
10380 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
10390 20 54 68 65 73 65 20 6d 65 74 68 6f 64 73 20 70   These methods p
103a0 72 6f 76 69 64 65 20 74 68 65 20 76 69 72 74 75  rovide the virtu
103b0 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65  al table impleme
103c0 6e 74 61 74 69 6f 6e 20 61 6e 20 6f 70 70 6f 72  ntation an oppor
103d0 74 75 6e 69 74 79 20 74 6f 0d 0a 20 20 20 20 20  tunity to..     
103e0 20 20 20 2f 2f 2f 20 69 6d 70 6c 65 6d 65 6e 74     /// implement
103f0 20 6e 65 73 74 65 64 20 74 72 61 6e 73 61 63 74   nested transact
10400 69 6f 6e 73 2e 20 20 54 68 65 79 20 61 72 65 20  ions.  They are 
10410 61 6c 77 61 79 73 20 6f 70 74 69 6f 6e 61 6c 20  always optional 
10420 61 6e 64 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65  and will only be
10430 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 63 61  ..        /// ca
10440 6c 6c 65 64 20 69 6e 20 53 51 4c 69 74 65 20 76  lled in SQLite v
10450 65 72 73 69 6f 6e 20 33 2e 37 2e 37 20 61 6e 64  ersion 3.7.7 and
10460 20 6c 61 74 65 72 2e 0d 0a 20 20 20 20 20 20 20   later...       
10470 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
10480 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
10490 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 57 68  ..        /// Wh
104a0 65 6e 20 78 53 61 76 65 70 6f 69 6e 74 28 58 2c  en xSavepoint(X,
104b0 4e 29 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  N) is invoked, t
104c0 68 61 74 20 69 73 20 61 20 73 69 67 6e 61 6c 20  hat is a signal 
104d0 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  to the virtual t
104e0 61 62 6c 65 20 58 0d 0a 20 20 20 20 20 20 20 20  able X..        
104f0 2f 2f 2f 20 74 68 61 74 20 69 74 20 73 68 6f 75  /// that it shou
10500 6c 64 20 73 61 76 65 20 69 74 73 20 63 75 72 72  ld save its curr
10510 65 6e 74 20 73 74 61 74 65 20 61 73 20 73 61 76  ent state as sav
10520 65 70 6f 69 6e 74 20 4e 2e 20 20 0d 0a 20 20 20  epoint N.  ..   
10530 20 20 20 20 20 2f 2f 2f 20 41 20 73 75 62 73 65       /// A subse
10540 71 75 65 6e 74 20 63 61 6c 6c 0d 0a 20 20 20 20  quent call..    
10550 20 20 20 20 2f 2f 2f 20 74 6f 20 78 52 6f 6c 6c      /// to xRoll
10560 62 61 63 6b 54 6f 28 58 2c 52 29 20 6d 65 61 6e  backTo(X,R) mean
10570 73 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  s that the state
10580 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
10590 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 72 65 74  table should ret
105a0 75 72 6e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  urn..        ///
105b0 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20   to what it was 
105c0 77 68 65 6e 20 78 53 61 76 65 70 6f 69 6e 74 28  when xSavepoint(
105d0 58 2c 52 29 20 77 61 73 20 6c 61 73 74 20 63 61  X,R) was last ca
105e0 6c 6c 65 64 2e 20 20 0d 0a 20 20 20 20 20 20 20  lled.  ..       
105f0 20 2f 2f 2f 20 54 68 65 20 63 61 6c 6c 0d 0a 20   /// The call.. 
10600 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20 78 52         /// to xR
10610 6f 6c 6c 62 61 63 6b 54 6f 28 58 2c 52 29 20 77  ollbackTo(X,R) w
10620 69 6c 6c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  ill invalidate a
10630 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ll savepoints wi
10640 74 68 20 4e 3e 52 3b 20 6e 6f 6e 65 20 6f 66 20  th N>R; none of 
10650 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  the..        ///
10660 20 69 6e 76 61 6c 69 64 65 64 20 73 61 76 65 70   invalided savep
10670 6f 69 6e 74 73 20 77 69 6c 6c 20 62 65 20 72 6f  oints will be ro
10680 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 72 65 6c  lled back or rel
10690 65 61 73 65 64 20 77 69 74 68 6f 75 74 20 66 69  eased without fi
106a0 72 73 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  rst..        ///
106b0 20 62 65 69 6e 67 20 72 65 69 6e 69 74 69 61 6c   being reinitial
106c0 69 7a 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  ized by a call t
106d0 6f 20 78 53 61 76 65 70 6f 69 6e 74 28 29 2e 20  o xSavepoint(). 
106e0 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41   ..        /// A
106f0 20 63 61 6c 6c 20 74 6f 20 78 52 65 6c 65 61 73   call to xReleas
10700 65 28 58 2c 4d 29 20 69 6e 76 61 6c 69 64 61 74  e(X,M) invalidat
10710 65 73 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74  es all savepoint
10720 73 20 77 68 65 72 65 20 4e 3e 3d 4d 2e 0d 0a 20  s where N>=M... 
10730 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
10740 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
10750 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
10760 2f 2f 2f 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  /// None of the 
10770 78 53 61 76 65 70 6f 69 6e 74 28 29 2c 20 78 52  xSavepoint(), xR
10780 65 6c 65 61 73 65 28 29 2c 20 6f 72 20 78 52 6f  elease(), or xRo
10790 6c 6c 62 61 63 6b 54 6f 28 29 20 6d 65 74 68 6f  llbackTo() metho
107a0 64 73 20 77 69 6c 6c 20 65 76 65 72 0d 0a 20 20  ds will ever..  
107b0 20 20 20 20 20 20 2f 2f 2f 20 62 65 20 63 61 6c        /// be cal
107c0 6c 65 64 20 65 78 63 65 70 74 20 69 6e 20 62 65  led except in be
107d0 74 77 65 65 6e 20 63 61 6c 6c 73 20 74 6f 20 78  tween calls to x
107e0 42 65 67 69 6e 28 29 20 61 6e 64 20 0d 0a 20 20  Begin() and ..  
107f0 20 20 20 20 20 20 2f 2f 2f 20 65 69 74 68 65 72        /// either
10800 20 78 43 6f 6d 6d 69 74 28 29 20 6f 72 20 78 52   xCommit() or xR
10810 6f 6c 6c 62 61 63 6b 28 29 2e 0d 0a 20 20 20 20  ollback()...    
10820 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
10830 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73  .        /// </s
10840 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20  ummary>..       
10850 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
10860 3d 22 70 56 74 61 62 22 3e 0d 0a 20 20 20 20 20  ="pVtab">..     
10870 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69 76     /// The nativ
10880 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
10890 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 64 65   sqlite3_vtab de
108a0 72 69 76 65 64 20 73 74 72 75 63 74 75 72 65 2e  rived structure.
108b0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
108c0 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20  param>..        
108d0 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
108e0 22 69 53 61 76 65 70 6f 69 6e 74 22 3e 0d 0a 20  "iSavepoint">.. 
108f0 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20         /// This 
10900 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 69 64  is an integer id
10910 65 6e 74 69 66 69 65 72 20 75 6e 64 65 72 20 77  entifier under w
10920 68 69 63 68 20 74 68 65 20 74 68 65 20 63 75 72  hich the the cur
10930 72 65 6e 74 20 73 74 61 74 65 20 6f 66 0d 0a 20  rent state of.. 
10940 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 76         /// the v
10950 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 68 6f  irtual table sho
10960 75 6c 64 20 62 65 20 73 61 76 65 64 2e 0d 0a 20  uld be saved... 
10970 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
10980 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  am>..        ///
10990 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20   <returns>..    
109a0 20 20 20 20 2f 2f 2f 20 41 20 73 74 61 6e 64 61      /// A standa
109b0 72 64 20 53 51 4c 69 74 65 20 72 65 74 75 72 6e  rd SQLite return
109c0 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20   code...        
109d0 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a  /// </returns>..
109e0 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 45 72          SQLiteEr
109f0 72 6f 72 43 6f 64 65 20 78 53 61 76 65 70 6f 69  rorCode xSavepoi
10a00 6e 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nt(..           
10a10 20 49 6e 74 50 74 72 20 70 56 74 61 62 2c 0d 0a   IntPtr pVtab,..
10a20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
10a30 69 53 61 76 65 70 6f 69 6e 74 0d 0a 20 20 20 20  iSavepoint..    
10a40 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20          );....  
10a50 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
10a60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10a70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10a80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10a90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
10aa0 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75  .        /// <su
10ab0 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20  mmary>..        
10ac0 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e  /// <para><code>
10ad0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e  ..        /// in
10ae0 74 20 28 2a 78 53 61 76 65 70 6f 69 6e 74 29 28  t (*xSavepoint)(
10af0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
10b00 74 61 62 2c 20 69 6e 74 29 3b 0d 0a 20 20 20 20  tab, int);..    
10b10 20 20 20 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 52      /// int (*xR
10b20 65 6c 65 61 73 65 29 28 73 71 6c 69 74 65 33 5f  elease)(sqlite3_
10b30 76 74 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74  vtab *pVtab, int
10b40 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  );..        /// 
10b50 69 6e 74 20 28 2a 78 52 6f 6c 6c 62 61 63 6b 54  int (*xRollbackT
10b60 6f 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  o)(sqlite3_vtab 
10b70 2a 70 56 74 61 62 2c 20 69 6e 74 29 3b 0d 0a 20  *pVtab, int);.. 
10b80 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64         /// </cod
10b90 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  e></para>..     
10ba0 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
10bb0 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 73 65         /// These
10bc0 20 6d 65 74 68 6f 64 73 20 70 72 6f 76 69 64 65   methods provide
10bd0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
10be0 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
10bf0 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
10c00 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   to..        ///
10c10 20 69 6d 70 6c 65 6d 65 6e 74 20 6e 65 73 74 65   implement neste
10c20 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  d transactions. 
10c30 20 54 68 65 79 20 61 72 65 20 61 6c 77 61 79 73   They are always
10c40 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64 20 77 69   optional and wi
10c50 6c 6c 20 6f 6e 6c 79 20 62 65 0d 0a 20 20 20 20  ll only be..    
10c60 20 20 20 20 2f 2f 2f 20 63 61 6c 6c 65 64 20 69      /// called i
10c70 6e 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  n SQLite version
10c80 20 33 2e 37 2e 37 20 61 6e 64 20 6c 61 74 65 72   3.7.7 and later
10c90 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
10ca0 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
10cb0 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
10cc0 20 20 20 20 2f 2f 2f 20 57 68 65 6e 20 78 53 61      /// When xSa
10cd0 76 65 70 6f 69 6e 74 28 58 2c 4e 29 20 69 73 20  vepoint(X,N) is 
10ce0 69 6e 76 6f 6b 65 64 2c 20 74 68 61 74 20 69 73  invoked, that is
10cf0 20 61 20 73 69 67 6e 61 6c 20 74 6f 20 74 68 65   a signal to the
10d00 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 58   virtual table X
10d10 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
10d20 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 61 76  at it should sav
10d30 65 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 74  e its current st
10d40 61 74 65 20 61 73 20 73 61 76 65 70 6f 69 6e 74  ate as savepoint
10d50 20 4e 2e 20 20 0d 0a 20 20 20 20 20 20 20 20 2f   N.  ..        /
10d60 2f 2f 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  // A subsequent 
10d70 63 61 6c 6c 0d 0a 20 20 20 20 20 20 20 20 2f 2f  call..        //
10d80 2f 20 74 6f 20 78 52 6f 6c 6c 62 61 63 6b 54 6f  / to xRollbackTo
10d90 28 58 2c 52 29 20 6d 65 61 6e 73 20 74 68 61 74  (X,R) means that
10da0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
10db0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
10dc0 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0d 0a 20  should return.. 
10dd0 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20 77 68         /// to wh
10de0 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 78  at it was when x
10df0 53 61 76 65 70 6f 69 6e 74 28 58 2c 52 29 20 77  Savepoint(X,R) w
10e00 61 73 20 6c 61 73 74 20 63 61 6c 6c 65 64 2e 20  as last called. 
10e10 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54   ..        /// T
10e20 68 65 20 63 61 6c 6c 0d 0a 20 20 20 20 20 20 20  he call..       
10e30 20 2f 2f 2f 20 74 6f 20 78 52 6f 6c 6c 62 61 63   /// to xRollbac
10e40 6b 54 6f 28 58 2c 52 29 20 77 69 6c 6c 20 69 6e  kTo(X,R) will in
10e50 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 73 61 76  validate all sav
10e60 65 70 6f 69 6e 74 73 20 77 69 74 68 20 4e 3e 52  epoints with N>R
10e70 3b 20 6e 6f 6e 65 20 6f 66 20 74 68 65 0d 0a 20  ; none of the.. 
10e80 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 76 61 6c         /// inval
10e90 69 64 65 64 20 73 61 76 65 70 6f 69 6e 74 73 20  ided savepoints 
10ea0 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
10eb0 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 64 20  ack or released 
10ec0 77 69 74 68 6f 75 74 20 66 69 72 73 74 0d 0a 20  without first.. 
10ed0 20 20 20 20 20 20 20 2f 2f 2f 20 62 65 69 6e 67         /// being
10ee0 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62   reinitialized b
10ef0 79 20 61 20 63 61 6c 6c 20 74 6f 20 78 53 61 76  y a call to xSav
10f00 65 70 6f 69 6e 74 28 29 2e 20 20 0d 0a 20 20 20  epoint().  ..   
10f10 20 20 20 20 20 2f 2f 2f 20 41 20 63 61 6c 6c 20       /// A call 
10f20 74 6f 20 78 52 65 6c 65 61 73 65 28 58 2c 4d 29  to xRelease(X,M)
10f30 20 69 6e 76 61 6c 69 64 61 74 65 73 20 61 6c 6c   invalidates all
10f40 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 65 72   savepoints wher
10f50 65 20 4e 3e 3d 4d 2e 0d 0a 20 20 20 20 20 20 20  e N>=M...       
10f60 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
10f70 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
10f80 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 4e 6f  ..        /// No
10f90 6e 65 20 6f 66 20 74 68 65 20 78 53 61 76 65 70  ne of the xSavep
10fa0 6f 69 6e 74 28 29 2c 20 78 52 65 6c 65 61 73 65  oint(), xRelease
10fb0 28 29 2c 20 6f 72 20 78 52 6f 6c 6c 62 61 63 6b  (), or xRollback
10fc0 54 6f 28 29 20 6d 65 74 68 6f 64 73 20 77 69 6c  To() methods wil
10fd0 6c 20 65 76 65 72 0d 0a 20 20 20 20 20 20 20 20  l ever..        
10fe0 2f 2f 2f 20 62 65 20 63 61 6c 6c 65 64 20 65 78  /// be called ex
10ff0 63 65 70 74 20 69 6e 20 62 65 74 77 65 65 6e 20  cept in between 
11000 63 61 6c 6c 73 20 74 6f 20 78 42 65 67 69 6e 28  calls to xBegin(
11010 29 20 61 6e 64 20 0d 0a 20 20 20 20 20 20 20 20  ) and ..        
11020 2f 2f 2f 20 65 69 74 68 65 72 20 78 43 6f 6d 6d  /// either xComm
11030 69 74 28 29 20 6f 72 20 78 52 6f 6c 6c 62 61 63  it() or xRollbac
11040 6b 28 29 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  k()...        //
11050 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
11060 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
11070 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
11080 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74 61  param name="pVta
11090 62 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  b">..        ///
110a0 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f 69 6e   The native poin
110b0 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ter to the sqlit
110c0 65 33 5f 76 74 61 62 20 64 65 72 69 76 65 64 20  e3_vtab derived 
110d0 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20 20  structure...    
110e0 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
110f0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
11100 61 72 61 6d 20 6e 61 6d 65 3d 22 69 53 61 76 65  aram name="iSave
11110 70 6f 69 6e 74 22 3e 0d 0a 20 20 20 20 20 20 20  point">..       
11120 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 61 6e 20   /// This is an 
11130 69 6e 74 65 67 65 72 20 75 73 65 64 20 74 6f 20  integer used to 
11140 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6e  indicate that an
11150 79 20 73 61 76 65 64 20 73 74 61 74 65 73 20 77  y saved states w
11160 69 74 68 20 61 6e 0d 0a 20 20 20 20 20 20 20 20  ith an..        
11170 2f 2f 2f 20 69 64 65 6e 74 69 66 69 65 72 20 67  /// identifier g
11180 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
11190 71 75 61 6c 20 74 6f 20 74 68 69 73 20 73 68 6f  qual to this sho
111a0 75 6c 64 20 62 65 20 64 65 6c 65 74 65 64 20 62  uld be deleted b
111b0 79 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f  y the..        /
111c0 2f 2f 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  // virtual table
111d0 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
111e0 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
111f0 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a   /// <returns>..
11200 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74          /// A st
11210 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72 65  andard SQLite re
11220 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20  turn code...    
11230 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e      /// </return
11240 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69  s>..        SQLi
11250 74 65 45 72 72 6f 72 43 6f 64 65 20 78 52 65 6c  teErrorCode xRel
11260 65 61 73 65 28 0d 0a 20 20 20 20 20 20 20 20 20  ease(..         
11270 20 20 20 49 6e 74 50 74 72 20 70 56 74 61 62 2c     IntPtr pVtab,
11280 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ..            in
11290 74 20 69 53 61 76 65 70 6f 69 6e 74 0d 0a 20 20  t iSavepoint..  
112a0 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a            );....
112b0 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
112c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
112d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
112e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
112f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
11300 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
11310 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
11320 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64    /// <para><cod
11330 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e>..        /// 
11340 69 6e 74 20 28 2a 78 53 61 76 65 70 6f 69 6e 74  int (*xSavepoint
11350 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  )(sqlite3_vtab *
11360 70 56 74 61 62 2c 20 69 6e 74 29 3b 0d 0a 20 20  pVtab, int);..  
11370 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74 20 28 2a        /// int (*
11380 78 52 65 6c 65 61 73 65 29 28 73 71 6c 69 74 65  xRelease)(sqlite
11390 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 69  3_vtab *pVtab, i
113a0 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  nt);..        //
113b0 2f 20 69 6e 74 20 28 2a 78 52 6f 6c 6c 62 61 63  / int (*xRollbac
113c0 6b 54 6f 29 28 73 71 6c 69 74 65 33 5f 76 74 61  kTo)(sqlite3_vta
113d0 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 29 3b 0d  b *pVtab, int);.
113e0 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63  .        /// </c
113f0 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  ode></para>..   
11400 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
11410 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
11420 73 65 20 6d 65 74 68 6f 64 73 20 70 72 6f 76 69  se methods provi
11430 64 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  de the virtual t
11440 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
11450 69 6f 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  ion an opportuni
11460 74 79 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 2f  ty to..        /
11470 2f 2f 20 69 6d 70 6c 65 6d 65 6e 74 20 6e 65 73  // implement nes
11480 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
11490 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c 77 61  .  They are alwa
114a0 79 73 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64 20  ys optional and 
114b0 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 0d 0a 20 20  will only be..  
114c0 20 20 20 20 20 20 2f 2f 2f 20 63 61 6c 6c 65 64        /// called
114d0 20 69 6e 20 53 51 4c 69 74 65 20 76 65 72 73 69   in SQLite versi
114e0 6f 6e 20 33 2e 37 2e 37 20 61 6e 64 20 6c 61 74  on 3.7.7 and lat
114f0 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  er...        ///
11500 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
11510 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
11520 20 20 20 20 20 20 2f 2f 2f 20 57 68 65 6e 20 78        /// When x
11530 53 61 76 65 70 6f 69 6e 74 28 58 2c 4e 29 20 69  Savepoint(X,N) i
11540 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 61 74 20  s invoked, that 
11550 69 73 20 61 20 73 69 67 6e 61 6c 20 74 6f 20 74  is a signal to t
11560 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
11570 20 58 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20   X..        /// 
11580 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73  that it should s
11590 61 76 65 20 69 74 73 20 63 75 72 72 65 6e 74 20  ave its current 
115a0 73 74 61 74 65 20 61 73 20 73 61 76 65 70 6f 69  state as savepoi
115b0 6e 74 20 4e 2e 20 20 0d 0a 20 20 20 20 20 20 20  nt N.  ..       
115c0 20 2f 2f 2f 20 41 20 73 75 62 73 65 71 75 65 6e   /// A subsequen
115d0 74 20 63 61 6c 6c 0d 0a 20 20 20 20 20 20 20 20  t call..        
115e0 2f 2f 2f 20 74 6f 20 78 52 6f 6c 6c 62 61 63 6b  /// to xRollback
115f0 54 6f 28 58 2c 52 29 20 6d 65 61 6e 73 20 74 68  To(X,R) means th
11600 61 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  at the state of 
11610 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
11620 65 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0d  e should return.
11630 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20  .        /// to 
11640 77 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e  what it was when
11650 20 78 53 61 76 65 70 6f 69 6e 74 28 58 2c 52 29   xSavepoint(X,R)
11660 20 77 61 73 20 6c 61 73 74 20 63 61 6c 6c 65 64   was last called
11670 2e 20 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  .  ..        ///
11680 20 54 68 65 20 63 61 6c 6c 0d 0a 20 20 20 20 20   The call..     
11690 20 20 20 2f 2f 2f 20 74 6f 20 78 52 6f 6c 6c 62     /// to xRollb
116a0 61 63 6b 54 6f 28 58 2c 52 29 20 77 69 6c 6c 20  ackTo(X,R) will 
116b0 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 73  invalidate all s
116c0 61 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20 4e  avepoints with N
116d0 3e 52 3b 20 6e 6f 6e 65 20 6f 66 20 74 68 65 0d  >R; none of the.
116e0 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 76  .        /// inv
116f0 61 6c 69 64 65 64 20 73 61 76 65 70 6f 69 6e 74  alided savepoint
11700 73 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64  s will be rolled
11710 20 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65   back or release
11720 64 20 77 69 74 68 6f 75 74 20 66 69 72 73 74 0d  d without first.
11730 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 62 65 69  .        /// bei
11740 6e 67 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  ng reinitialized
11750 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 78 53   by a call to xS
11760 61 76 65 70 6f 69 6e 74 28 29 2e 20 20 0d 0a 20  avepoint().  .. 
11770 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 63 61 6c         /// A cal
11780 6c 20 74 6f 20 78 52 65 6c 65 61 73 65 28 58 2c  l to xRelease(X,
11790 4d 29 20 69 6e 76 61 6c 69 64 61 74 65 73 20 61  M) invalidates a
117a0 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ll savepoints wh
117b0 65 72 65 20 4e 3e 3d 4d 2e 0d 0a 20 20 20 20 20  ere N>=M...     
117c0 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
117d0 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
117e0 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
117f0 4e 6f 6e 65 20 6f 66 20 74 68 65 20 78 53 61 76  None of the xSav
11800 65 70 6f 69 6e 74 28 29 2c 20 78 52 65 6c 65 61  epoint(), xRelea
11810 73 65 28 29 2c 20 6f 72 20 78 52 6f 6c 6c 62 61  se(), or xRollba
11820 63 6b 54 6f 28 29 20 6d 65 74 68 6f 64 73 20 77  ckTo() methods w
11830 69 6c 6c 20 65 76 65 72 0d 0a 20 20 20 20 20 20  ill ever..      
11840 20 20 2f 2f 2f 20 62 65 20 63 61 6c 6c 65 64 20    /// be called 
11850 65 78 63 65 70 74 20 69 6e 20 62 65 74 77 65 65  except in betwee
11860 6e 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 67 69  n calls to xBegi
11870 6e 28 29 20 61 6e 64 20 0d 0a 20 20 20 20 20 20  n() and ..      
11880 20 20 2f 2f 2f 20 65 69 74 68 65 72 20 78 43 6f    /// either xCo
11890 6d 6d 69 74 28 29 20 6f 72 20 78 52 6f 6c 6c 62  mmit() or xRollb
118a0 61 63 6b 28 29 2e 0d 0a 20 20 20 20 20 20 20 20  ack()...        
118b0 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
118c0 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61       /// </summa
118d0 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ry>..        ///
118e0 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56   <param name="pV
118f0 74 61 62 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f  tab">..        /
11900 2f 2f 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f  // The native po
11910 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c  inter to the sql
11920 69 74 65 33 5f 76 74 61 62 20 64 65 72 69 76 65  ite3_vtab derive
11930 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20  d structure...  
11940 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
11950 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  m>..        /// 
11960 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69 53 61  <param name="iSa
11970 76 65 70 6f 69 6e 74 22 3e 0d 0a 20 20 20 20 20  vepoint">..     
11980 20 20 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 61     /// This is a
11990 6e 20 69 6e 74 65 67 65 72 20 69 64 65 6e 74 69  n integer identi
119a0 66 69 65 72 20 75 73 65 64 20 74 6f 20 73 70 65  fier used to spe
119b0 63 69 66 79 20 61 20 73 70 65 63 69 66 69 63 20  cify a specific 
119c0 73 61 76 65 64 0d 0a 20 20 20 20 20 20 20 20 2f  saved..        /
119d0 2f 2f 20 73 74 61 74 65 20 66 6f 72 20 74 68 65  // state for the
119e0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66   virtual table f
119f0 6f 72 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  or it to restore
11a00 20 69 74 73 65 6c 66 20 62 61 63 6b 20 74 6f 2c   itself back to,
11a10 20 77 68 69 63 68 0d 0a 20 20 20 20 20 20 20 20   which..        
11a20 2f 2f 2f 20 73 68 6f 75 6c 64 20 61 6c 73 6f 20  /// should also 
11a30 68 61 76 65 20 74 68 65 20 65 66 66 65 63 74 20  have the effect 
11a40 6f 66 20 64 65 6c 65 74 69 6e 67 20 61 6c 6c 20  of deleting all 
11a50 73 61 76 65 64 20 73 74 61 74 65 73 20 77 69 74  saved states wit
11a60 68 20 61 6e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  h an..        //
11a70 2f 20 69 6e 74 65 67 65 72 20 69 64 65 6e 74 69  / integer identi
11a80 66 69 65 72 20 67 72 65 61 74 65 72 20 74 68 61  fier greater tha
11a90 6e 20 74 68 69 73 20 6f 6e 65 2e 0d 0a 20 20 20  n this one...   
11aa0 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d       /// </param
11ab0 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
11ac0 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20  returns>..      
11ad0 20 20 2f 2f 2f 20 41 20 73 74 61 6e 64 61 72 64    /// A standard
11ae0 20 53 51 4c 69 74 65 20 72 65 74 75 72 6e 20 63   SQLite return c
11af0 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ode...        //
11b00 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  / </returns>..  
11b10 20 20 20 20 20 20 53 51 4c 69 74 65 45 72 72 6f        SQLiteErro
11b20 72 43 6f 64 65 20 78 52 6f 6c 6c 62 61 63 6b 54  rCode xRollbackT
11b30 6f 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  o(..            
11b40 49 6e 74 50 74 72 20 70 56 74 61 62 2c 0d 0a 20  IntPtr pVtab,.. 
11b50 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
11b60 53 61 76 65 70 6f 69 6e 74 0d 0a 20 20 20 20 20  Savepoint..     
11b70 20 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 7d         );..    }
11b80 0d 0a 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e  ..    #endregion
11b90 0d 0a 7d 0d 0a                                   ..}..