System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 4dbfd26569f5df58c04e9514c9d175d041f94480:


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 20 20 69 6e 74 20 28 2a 78 43 72 65 61 74  /   int (*xCreat
0270: 65 29 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  e)(sqlite3 *db, 
0280: 76 6f 69 64 20 2a 70 41 75 78 2c 0d 0a 20 20 20  void *pAux,..   
0290: 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 20 20       ///        
02a0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 72 67 63          int argc
02b0: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 0d 0a  , char **argv,..
02c0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20          ///     
02d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
02e0: 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 54 61 62  e3_vtab **ppVTab
02f0: 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20  ,..        ///  
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
0310: 61 72 20 2a 2a 70 7a 45 72 72 29 3b 0d 0a 20 20  ar **pzErr);..  
0320: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65        /// </code
0330: 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  ></para>..      
0340: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
0350: 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d        /// This m
0360: 65 74 68 6f 64 20 69 73 20 63 61 6c 6c 65 64 20  ethod is called 
0370: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
0380: 69 6e 73 74 61 6e 63 65 20 6f 66 20 61 20 76 69  instance of a vi
0390: 72 74 75 61 6c 20 74 61 62 6c 65 20 0d 0a 20 20  rtual table ..  
03a0: 20 20 20 20 20 20 2f 2f 2f 20 69 6e 20 72 65 73        /// in res
03b0: 70 6f 6e 73 65 20 74 6f 20 61 20 43 52 45 41 54  ponse to a CREAT
03c0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
03d0: 73 74 61 74 65 6d 65 6e 74 2e 20 0d 0a 20 20 20  statement. ..   
03e0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 64 62 20       /// The db 
03f0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
0400: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 51  ointer to the SQ
0410: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  Lite database co
0420: 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 0d 0a  nnection that ..
0430: 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 73 20 65          /// is e
0440: 78 65 63 75 74 69 6e 67 20 74 68 65 20 43 52 45  xecuting the CRE
0450: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
0460: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 0d 0a 20  E statement. .. 
0470: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 70         /// The p
0480: 41 75 78 20 61 72 67 75 6d 65 6e 74 20 69 73 20  Aux argument is 
0490: 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
04a0: 63 6c 69 65 6e 74 20 64 61 74 61 20 70 6f 69 6e  client data poin
04b0: 74 65 72 20 74 68 61 74 20 77 61 73 20 74 68 65  ter that was the
04c0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 66   ..        /// f
04d0: 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 74  ourth argument t
04e0: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72  o the sqlite3_cr
04f0: 65 61 74 65 5f 6d 6f 64 75 6c 65 28 29 20 6f 72  eate_module() or
0500: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 71  ..        /// sq
0510: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64  lite3_create_mod
0520: 75 6c 65 5f 76 32 28 29 20 63 61 6c 6c 20 74 68  ule_v2() call th
0530: 61 74 20 72 65 67 69 73 74 65 72 65 64 20 74 68  at registered th
0540: 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e ..        /// 
0550: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
0560: 64 75 6c 65 2e 20 0d 0a 20 20 20 20 20 20 20 20  dule. ..        
0570: 2f 2f 2f 20 54 68 65 20 61 72 67 76 20 70 61 72  /// The argv par
0580: 61 6d 65 74 65 72 20 69 73 20 61 6e 20 61 72 72  ameter is an arr
0590: 61 79 20 6f 66 20 61 72 67 63 20 70 6f 69 6e 74  ay of argc point
05a0: 65 72 73 20 74 6f 20 6e 75 6c 6c 20 74 65 72 6d  ers to null term
05b0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 73 2e 20  inated strings. 
05c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
05d0: 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 2c 20  e first string, 
05e0: 61 72 67 76 5b 30 5d 2c 20 69 73 20 74 68 65 20  argv[0], is the 
05f0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6f 64 75  name of the modu
0600: 6c 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64  le being invoked
0610: 2e 20 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20  .   The..       
0620: 20 2f 2f 2f 20 6d 6f 64 75 6c 65 20 6e 61 6d 65   /// module name
0630: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 70 72 6f   is the name pro
0640: 76 69 64 65 64 20 61 73 20 74 68 65 20 73 65 63  vided as the sec
0650: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
0660: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 71  ..        /// sq
0670: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64  lite3_create_mod
0680: 75 6c 65 28 29 20 61 6e 64 20 61 73 20 74 68 65  ule() and as the
0690: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
06a0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
06b0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f   the..        //
06c0: 2f 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  / CREATE VIRTUAL
06d0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
06e0: 20 74 68 61 74 20 69 73 20 72 75 6e 6e 69 6e 67   that is running
06f0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  ...        /// T
0700: 68 65 20 73 65 63 6f 6e 64 2c 20 61 72 67 76 5b  he second, argv[
0710: 31 5d 2c 20 69 73 20 74 68 65 20 6e 61 6d 65 20  1], is the name 
0720: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
0730: 69 6e 20 77 68 69 63 68 20 74 68 65 20 6e 65 77  in which the new
0740: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
0750: 73 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 2e  s being created.
0760: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   The database na
0770: 6d 65 20 69 73 20 22 6d 61 69 6e 22 20 66 6f 72  me is "main" for
0780: 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74   the primary dat
0790: 61 62 61 73 65 2c 20 6f 72 0d 0a 20 20 20 20 20  abase, or..     
07a0: 20 20 20 2f 2f 2f 20 22 74 65 6d 70 22 20 66 6f     /// "temp" fo
07b0: 72 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 2c  r TEMP database,
07c0: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 67 69 76   or the name giv
07d0: 65 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  en at the end of
07e0: 20 74 68 65 20 41 54 54 41 43 48 0d 0a 20 20 20   the ATTACH..   
07f0: 20 20 20 20 20 2f 2f 2f 20 73 74 61 74 65 6d 65       /// stateme
0800: 6e 74 20 66 6f 72 20 61 74 74 61 63 68 65 64 20  nt for attached 
0810: 64 61 74 61 62 61 73 65 73 2e 20 20 54 68 65 20  databases.  The 
0820: 74 68 69 72 64 20 65 6c 65 6d 65 6e 74 20 6f 66  third element of
0830: 20 74 68 65 20 61 72 72 61 79 2c 20 61 72 67 76   the array, argv
0840: 5b 32 5d 2c 20 0d 0a 20 20 20 20 20 20 20 20 2f  [2], ..        /
0850: 2f 2f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  // is the name o
0860: 66 20 74 68 65 20 6e 65 77 20 76 69 72 74 75 61  f the new virtua
0870: 6c 20 74 61 62 6c 65 2c 20 61 73 20 73 70 65 63  l table, as spec
0880: 69 66 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ified following 
0890: 74 68 65 20 54 41 42 4c 45 0d 0a 20 20 20 20 20  the TABLE..     
08a0: 20 20 20 2f 2f 2f 20 6b 65 79 77 6f 72 64 20 69     /// keyword i
08b0: 6e 20 74 68 65 20 43 52 45 41 54 45 20 56 49 52  n the CREATE VIR
08c0: 54 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65  TUAL TABLE state
08d0: 6d 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 2f  ment...        /
08e0: 2f 2f 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74  // If present, t
08f0: 68 65 20 66 6f 75 72 74 68 20 61 6e 64 20 73 75  he fourth and su
0900: 62 73 65 71 75 65 6e 74 20 73 74 72 69 6e 67 73  bsequent strings
0910: 20 69 6e 20 74 68 65 20 61 72 67 76 5b 5d 20 61   in the argv[] a
0920: 72 72 61 79 20 72 65 70 6f 72 74 20 0d 0a 20 20  rray report ..  
0930: 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 61 72        /// the ar
0940: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6d  guments to the m
0950: 6f 64 75 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  odule name in th
0960: 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  e CREATE VIRTUAL
0970: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
0980: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
0990: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
09a0: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
09b0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 6a 6f 62 20      /// The job 
09c0: 6f 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69  of this method i
09d0: 73 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  s to construct t
09e0: 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  he new virtual t
09f0: 61 62 6c 65 20 6f 62 6a 65 63 74 0d 0a 20 20 20  able object..   
0a00: 20 20 20 20 20 2f 2f 2f 20 28 61 6e 20 73 71 6c       /// (an sql
0a10: 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74  ite3_vtab object
0a20: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  ) and return a p
0a30: 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 69 6e 20  ointer to it in 
0a40: 2a 70 70 56 54 61 62 2e 0d 0a 20 20 20 20 20 20  *ppVTab...      
0a50: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
0a60: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
0a70: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41  >..        /// A
0a80: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 61  s part of the ta
0a90: 73 6b 20 6f 66 20 63 72 65 61 74 69 6e 67 20 61  sk of creating a
0aa0: 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 76 74 61   new sqlite3_vta
0ab0: 62 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 69  b structure, thi
0ac0: 73 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  s ..        /// 
0ad0: 6d 65 74 68 6f 64 20 3c 75 3e 6d 75 73 74 3c 2f  method <u>must</
0ae0: 75 3e 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  u> invoke sqlite
0af0: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
0b00: 20 74 6f 20 74 65 6c 6c 20 74 68 65 20 53 51 4c   to tell the SQL
0b10: 69 74 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ite ..        //
0b20: 2f 20 63 6f 72 65 20 61 62 6f 75 74 20 74 68 65  / core about the
0b30: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 64 61 74   columns and dat
0b40: 61 74 79 70 65 73 20 69 6e 20 74 68 65 20 76 69  atypes in the vi
0b50: 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 0d 0a 20  rtual table. .. 
0b60: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 73         /// The s
0b70: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
0b80: 74 61 62 28 29 20 41 50 49 20 68 61 73 20 74 68  tab() API has th
0b90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 74  e following prot
0ba0: 6f 74 79 70 65 3a 0d 0a 20 20 20 20 20 20 20 20  otype:..        
0bb0: 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
0bc0: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c       /// <para><
0bd0: 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f  code>..        /
0be0: 2f 2f 20 20 20 20 20 69 6e 74 20 73 71 6c 69 74  //     int sqlit
0bf0: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
0c00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
0c10: 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65  st char *zCreate
0c20: 54 61 62 6c 65 29 0d 0a 20 20 20 20 20 20 20 20  Table)..        
0c30: 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72  /// </code></par
0c40: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
0c50: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
0c60: 2f 2f 2f 20 54 68 65 20 66 69 72 73 74 20 61 72  /// The first ar
0c70: 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65  gument to sqlite
0c80: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
0c90: 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
0ca0: 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e ..        /// 
0cb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0cc0: 69 6f 6e 20 70 6f 69 6e 74 65 72 20 61 73 20 74  ion pointer as t
0cd0: 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
0ce0: 65 72 20 74 6f 20 74 68 69 73 20 6d 65 74 68 6f  er to this metho
0cf0: 64 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  d...        /// 
0d00: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
0d10: 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 5f 64  ent to sqlite3_d
0d20: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 6d 75  eclare_vtab() mu
0d30: 73 74 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  st a zero-termin
0d40: 61 74 65 64 20 0d 0a 20 20 20 20 20 20 20 20 2f  ated ..        /
0d50: 2f 2f 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  // UTF-8 string 
0d60: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
0d70: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 43 52 45 41  well-formed CREA
0d80: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
0d90: 6e 74 20 74 68 61 74 20 0d 0a 20 20 20 20 20 20  nt that ..      
0da0: 20 20 2f 2f 2f 20 64 65 66 69 6e 65 73 20 74 68    /// defines th
0db0: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
0dc0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61   virtual table a
0dd0: 6e 64 20 74 68 65 69 72 20 64 61 74 61 20 74 79  nd their data ty
0de0: 70 65 73 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f  pes. ..        /
0df0: 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  // The name of t
0e00: 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73  he table in this
0e10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
0e20: 61 74 65 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72  atement is ignor
0e30: 65 64 2c 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ed, ..        //
0e40: 2f 20 61 73 20 61 72 65 20 61 6c 6c 20 63 6f 6e  / as are all con
0e50: 73 74 72 61 69 6e 74 73 2e 20 4f 6e 6c 79 20 74  straints. Only t
0e60: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
0e70: 61 6e 64 20 64 61 74 61 74 79 70 65 73 20 6d 61  and datatypes ma
0e80: 74 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 2f  tter...        /
0e90: 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 54 41  // The CREATE TA
0ea0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 73 74  BLE statement st
0eb0: 72 69 6e 67 20 6e 65 65 64 20 6e 6f 74 20 74 6f  ring need not to
0ec0: 20 62 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f   be ..        //
0ed0: 2f 20 68 65 6c 64 20 69 6e 20 70 65 72 73 69 73  / held in persis
0ee0: 74 65 6e 74 20 6d 65 6d 6f 72 79 2e 20 20 54 68  tent memory.  Th
0ef0: 65 20 73 74 72 69 6e 67 20 63 61 6e 20 62 65 0d  e string can be.
0f00: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 64 65 61  .        /// dea
0f10: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 2f 6f 72 20  llocated and/or 
0f20: 72 65 75 73 65 64 20 61 73 20 73 6f 6f 6e 20 61  reused as soon a
0f30: 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 64 65  s the sqlite3_de
0f40: 63 6c 61 72 65 5f 76 74 61 62 28 29 0d 0a 20 20  clare_vtab()..  
0f50: 20 20 20 20 20 20 2f 2f 2f 20 72 6f 75 74 69 6e        /// routin
0f60: 65 20 72 65 74 75 72 6e 73 2e 0d 0a 20 20 20 20  e returns...    
0f70: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
0f80: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
0f90: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
0fa0: 20 54 68 65 20 78 43 72 65 61 74 65 20 6d 65 74   The xCreate met
0fb0: 68 6f 64 20 6e 65 65 64 20 6e 6f 74 20 69 6e 69  hod need not ini
0fc0: 74 69 61 6c 69 7a 65 20 74 68 65 20 70 4d 6f 64  tialize the pMod
0fd0: 75 6c 65 2c 20 6e 52 65 66 2c 20 61 6e 64 20 7a  ule, nRef, and z
0fe0: 45 72 72 4d 73 67 0d 0a 20 20 20 20 20 20 20 20  ErrMsg..        
0ff0: 2f 2f 2f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  /// fields of th
1000: 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f  e sqlite3_vtab o
1010: 62 6a 65 63 74 2e 20 20 54 68 65 20 53 51 4c 69  bject.  The SQLi
1020: 74 65 20 63 6f 72 65 20 77 69 6c 6c 20 74 61 6b  te core will tak
1030: 65 20 63 61 72 65 20 6f 66 20 0d 0a 20 20 20 20  e care of ..    
1040: 20 20 20 20 2f 2f 2f 20 74 68 61 74 20 63 68 6f      /// that cho
1050: 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  re...        ///
1060: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
1070: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
1080: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 43        /// The xC
1090: 72 65 61 74 65 20 73 68 6f 75 6c 64 20 72 65 74  reate should ret
10a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
10b0: 20 69 74 20 69 73 20 73 75 63 63 65 73 73 66 75   it is successfu
10c0: 6c 20 69 6e 20 0d 0a 20 20 20 20 20 20 20 20 2f  l in ..        /
10d0: 2f 2f 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  // creating the 
10e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c  new virtual tabl
10f0: 65 2c 20 6f 72 20 53 51 4c 49 54 45 5f 45 52 52  e, or SQLITE_ERR
1100: 4f 52 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  OR if it is not 
1110: 73 75 63 63 65 73 73 66 75 6c 2e 0d 0a 20 20 20  successful...   
1120: 20 20 20 20 20 2f 2f 2f 20 49 66 20 6e 6f 74 20       /// If not 
1130: 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20  successful, the 
1140: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
1150: 75 63 74 75 72 65 20 6d 75 73 74 20 6e 6f 74 20  ucture must not 
1160: 62 65 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0d 0a  be allocated. ..
1170: 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 6e 20 65          /// An e
1180: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 61 79  rror message may
1190: 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 72   optionally be r
11a0: 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 7a 45 72  eturned in *pzEr
11b0: 72 20 69 66 20 75 6e 73 75 63 63 65 73 73 66 75  r if unsuccessfu
11c0: 6c 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  l...        /// 
11d0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
11e0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
11f0: 73 74 72 69 6e 67 20 6d 75 73 74 20 62 65 20 61  string must be a
1200: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0d 0a  llocated using..
1210: 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 6e 20 53          /// an S
1220: 51 4c 69 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  QLite memory all
1230: 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ocation function
1240: 20 6c 69 6b 65 20 0d 0a 20 20 20 20 20 20 20 20   like ..        
1250: 2f 2f 2f 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  /// sqlite3_mall
1260: 6f 63 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  oc() or sqlite3_
1270: 6d 70 72 69 6e 74 66 28 29 20 61 73 20 74 68 65  mprintf() as the
1280: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 69 6c   SQLite core wil
1290: 6c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61  l..        /// a
12a0: 74 74 65 6d 70 74 20 74 6f 20 66 72 65 65 20 74  ttempt to free t
12b0: 68 65 20 73 70 61 63 65 20 75 73 69 6e 67 20 73  he space using s
12c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 61 66  qlite3_free() af
12d0: 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 68 61  ter the error ha
12e0: 73 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 62  s..        /// b
12f0: 65 65 6e 20 72 65 70 6f 72 74 65 64 20 75 70 20  een reported up 
1300: 74 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  to the applicati
1310: 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  on...        ///
1320: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
1330: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
1340: 20 20 20 20 20 20 2f 2f 2f 20 49 66 20 74 68 65        /// If the
1350: 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64 20   xCreate method 
1360: 69 73 20 6f 6d 69 74 74 65 64 20 28 6c 65 66 74  is omitted (left
1370: 20 61 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   as a NULL point
1380: 65 72 29 20 74 68 65 6e 20 74 68 65 0d 0a 20 20  er) then the..  
1390: 20 20 20 20 20 20 2f 2f 2f 20 76 69 72 74 75 61        /// virtua
13a0: 6c 20 74 61 62 6c 65 20 69 73 20 61 6e 20 65 70  l table is an ep
13b0: 6f 6e 79 6d 6f 75 73 2d 6f 6e 6c 79 20 76 69 72  onymous-only vir
13c0: 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 4e 65 77  tual table.  New
13d0: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 0d 0a 20   instances of.. 
13e0: 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 76         /// the v
13f0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 61 6e  irtual table can
1400: 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 20 75  not be created u
1410: 73 69 6e 67 20 43 52 45 41 54 45 20 56 49 52 54  sing CREATE VIRT
1420: 55 41 4c 20 54 41 42 4c 45 20 61 6e 64 20 74 68  UAL TABLE and th
1430: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 76  e..        /// v
1440: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 61 6e  irtual table can
1450: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 76 69   only be used vi
1460: 61 20 69 74 73 20 6d 6f 64 75 6c 65 20 6e 61 6d  a its module nam
1470: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
1480: 4e 6f 74 65 20 74 68 61 74 20 53 51 4c 69 74 65  Note that SQLite
1490: 20 76 65 72 73 69 6f 6e 73 20 70 72 69 6f 72 20   versions prior 
14a0: 74 6f 20 33 2e 39 2e 30 20 64 6f 20 6e 6f 74 20  to 3.9.0 do not 
14b0: 75 6e 64 65 72 73 74 61 6e 64 0d 0a 20 20 20 20  understand..    
14c0: 20 20 20 20 2f 2f 2f 20 65 70 6f 6e 79 6d 6f 75      /// eponymou
14d0: 73 2d 6f 6e 6c 79 20 76 69 72 74 75 61 6c 20 74  s-only virtual t
14e0: 61 62 6c 65 73 20 61 6e 64 20 77 69 6c 6c 20 73  ables and will s
14f0: 65 67 66 61 75 6c 74 20 69 66 20 61 6e 20 61 74  egfault if an at
1500: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0d 0a 20  tempt is made.. 
1510: 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20 43 52         /// to CR
1520: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
1530: 4c 45 20 6f 6e 20 61 6e 20 65 70 6f 6e 79 6d 6f  LE on an eponymo
1540: 75 73 2d 6f 6e 6c 79 20 76 69 72 74 75 61 6c 20  us-only virtual 
1550: 74 61 62 6c 65 20 62 65 63 61 75 73 65 0d 0a 20  table because.. 
1560: 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 78         /// the x
1570: 43 72 65 61 74 65 20 6d 65 74 68 6f 64 20 77 61  Create method wa
1580: 73 20 6e 6f 74 20 63 68 65 63 6b 65 64 20 66 6f  s not checked fo
1590: 72 20 6e 75 6c 6c 2e 0d 0a 20 20 20 20 20 20 20  r null...       
15a0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
15b0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
15c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 49 66  ..        /// If
15d0: 20 74 68 65 20 78 43 72 65 61 74 65 20 6d 65 74   the xCreate met
15e0: 68 6f 64 20 69 73 20 74 68 65 20 65 78 61 63 74  hod is the exact
15f0: 20 73 61 6d 65 20 70 6f 69 6e 74 65 72 20 61 73   same pointer as
1600: 20 74 68 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65   the xConnect me
1610: 74 68 6f 64 2c 0d 0a 20 20 20 20 20 20 20 20 2f  thod,..        /
1620: 2f 2f 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  // that indicate
1630: 73 20 74 68 61 74 20 74 68 65 20 76 69 72 74 75  s that the virtu
1640: 61 6c 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  al table does no
1650: 74 20 6e 65 65 64 20 74 6f 20 69 6e 69 74 69 61  t need to initia
1660: 6c 69 7a 65 20 62 61 63 6b 69 6e 67 0d 0a 20 20  lize backing..  
1670: 20 20 20 20 20 20 2f 2f 2f 20 73 74 6f 72 65 2e        /// store.
1680: 20 20 53 75 63 68 20 61 20 76 69 72 74 75 61 6c    Such a virtual
1690: 20 74 61 62 6c 65 20 63 61 6e 20 62 65 20 75 73   table can be us
16a0: 65 64 20 61 73 20 61 6e 20 65 70 6f 6e 79 6d 6f  ed as an eponymo
16b0: 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
16c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6f 72  ..        /// or
16d0: 20 61 73 20 61 20 6e 61 6d 65 64 20 76 69 72 74   as a named virt
16e0: 75 61 6c 20 74 61 62 6c 65 20 75 73 69 6e 67 20  ual table using 
16f0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
1700: 41 42 4c 45 20 6f 72 20 62 6f 74 68 2e 0d 0a 20  ABLE or both... 
1710: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
1720: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
1730: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
1740: 2f 2f 2f 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20  /// If a column 
1750: 64 61 74 61 74 79 70 65 20 63 6f 6e 74 61 69 6e  datatype contain
1760: 73 20 74 68 65 20 73 70 65 63 69 61 6c 20 6b 65  s the special ke
1770: 79 77 6f 72 64 20 22 48 49 44 44 45 4e 22 0d 0a  yword "HIDDEN"..
1780: 20 20 20 20 20 20 20 20 2f 2f 2f 20 28 69 6e 20          /// (in 
1790: 61 6e 79 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  any combination 
17a0: 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  of upper and low
17b0: 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73 29  er case letters)
17c0: 20 74 68 65 6e 20 74 68 61 74 20 6b 65 79 77 6f   then that keywo
17d0: 72 64 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  rd..        /// 
17e0: 69 74 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  it is omitted fr
17f0: 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 61  om the column da
1800: 74 61 74 79 70 65 20 6e 61 6d 65 20 61 6e 64 20  tatype name and 
1810: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61  the column is ma
1820: 72 6b 65 64 20 0d 0a 20 20 20 20 20 20 20 20 2f  rked ..        /
1830: 2f 2f 20 61 73 20 61 20 68 69 64 64 65 6e 20 63  // as a hidden c
1840: 6f 6c 75 6d 6e 20 69 6e 74 65 72 6e 61 6c 6c 79  olumn internally
1850: 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  . ..        /// 
1860: 41 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20  A hidden column 
1870: 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
1880: 6f 72 6d 61 6c 20 63 6f 6c 75 6d 6e 20 69 6e 20  ormal column in 
1890: 74 68 72 65 65 20 72 65 73 70 65 63 74 73 3a 0d  three respects:.
18a0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
18b0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
18c0: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
18d0: 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c    /// <![CDATA[<
18e0: 75 6c 3e 5d 5d 3e 0d 0a 20 20 20 20 20 20 20 20  ul>]]>..        
18f0: 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 6c 69  /// <![CDATA[<li
1900: 3e 5d 5d 3e 20 48 69 64 64 65 6e 20 63 6f 6c 75  >]]> Hidden colu
1910: 6d 6e 73 20 61 72 65 20 6e 6f 74 20 6c 69 73 74  mns are not list
1920: 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 73 65  ed in the datase
1930: 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 0d 0a  t returned by ..
1940: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20          ///     
1950: 20 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69   "PRAGMA table_i
1960: 6e 66 6f 22 2c 0d 0a 20 20 20 20 20 20 20 20 2f  nfo",..        /
1970: 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 6c 69 3e  // <![CDATA[<li>
1980: 5d 5d 3e 20 48 69 64 64 65 6e 20 63 6f 6c 75 6d  ]]> Hidden colum
1990: 6e 73 20 61 72 65 20 6e 6f 74 20 69 6e 63 6c 75  ns are not inclu
19a0: 64 65 64 20 69 6e 20 74 68 65 20 65 78 70 61 6e  ded in the expan
19b0: 73 69 6f 6e 20 6f 66 20 61 20 22 2a 22 0d 0a 20  sion of a "*".. 
19c0: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 20         ///      
19d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
19e0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
19f0: 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 0d 0a 20  a SELECT, and.. 
1a00: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44         /// <![CD
1a10: 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 48 69 64 64  ATA[<li>]]> Hidd
1a20: 65 6e 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e  en columns are n
1a30: 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  ot included in t
1a40: 68 65 20 69 6d 70 6c 69 63 69 74 20 63 6f 6c 75  he implicit colu
1a50: 6d 6e 2d 6c 69 73 74 20 0d 0a 20 20 20 20 20 20  mn-list ..      
1a60: 20 20 2f 2f 2f 20 20 20 20 20 20 75 73 65 64 20    ///      used 
1a70: 62 79 20 61 6e 20 49 4e 53 45 52 54 20 73 74 61  by an INSERT sta
1a80: 74 65 6d 65 6e 74 20 74 68 61 74 20 6c 61 63 6b  tement that lack
1a90: 73 20 61 6e 20 65 78 70 6c 69 63 69 74 20 63 6f  s an explicit co
1aa0: 6c 75 6d 6e 2d 6c 69 73 74 2e 20 0d 0a 20 20 20  lumn-list. ..   
1ab0: 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54       /// <![CDAT
1ac0: 41 5b 3c 2f 75 6c 3e 5d 5d 3e 0d 0a 20 20 20 20  A[</ul>]]>..    
1ad0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
1ae0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
1af0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
1b00: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1b10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
1b20: 51 4c 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  QL is passed to 
1b30: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
1b40: 76 74 61 62 28 29 3a 0d 0a 20 20 20 20 20 20 20  vtab():..       
1b50: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
1b60: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
1b70: 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20  <code>..        
1b80: 2f 2f 2f 20 20 20 20 43 52 45 41 54 45 20 54 41  ///    CREATE TA
1b90: 42 4c 45 20 78 28 61 20 48 49 44 44 45 4e 20 56  BLE x(a HIDDEN V
1ba0: 41 52 43 48 41 52 28 31 32 29 2c 20 62 20 49 4e  ARCHAR(12), b IN
1bb0: 54 45 47 45 52 2c 20 63 20 49 4e 54 45 47 45 52  TEGER, c INTEGER
1bc0: 20 48 69 64 64 65 6e 29 3b 0d 0a 20 20 20 20 20   Hidden);..     
1bd0: 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f     /// </code></
1be0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
1bf0: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
1c00: 20 20 20 2f 2f 2f 20 54 68 65 6e 20 74 68 65 20     /// Then the 
1c10: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 6f  virtual table wo
1c20: 75 6c 64 20 62 65 20 63 72 65 61 74 65 64 20 77  uld be created w
1c30: 69 74 68 20 74 77 6f 20 68 69 64 64 65 6e 20 63  ith two hidden c
1c40: 6f 6c 75 6d 6e 73 2c 0d 0a 20 20 20 20 20 20 20  olumns,..       
1c50: 20 2f 2f 2f 20 61 6e 64 20 77 69 74 68 20 64 61   /// and with da
1c60: 74 61 74 79 70 65 73 20 6f 66 20 22 56 41 52 43  tatypes of "VARC
1c70: 48 41 52 28 31 32 29 22 20 61 6e 64 20 22 49 4e  HAR(12)" and "IN
1c80: 54 45 47 45 52 22 2e 0d 0a 20 20 20 20 20 20 20  TEGER"...       
1c90: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
1ca0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
1cb0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 6e  ..        /// An
1cc0: 20 65 78 61 6d 70 6c 65 20 75 73 65 20 6f 66 20   example use of 
1cd0: 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 63  hidden columns c
1ce0: 61 6e 20 62 65 20 73 65 65 6e 20 69 6e 20 74 68  an be seen in th
1cf0: 65 20 46 54 53 33 20 76 69 72 74 75 61 6c 20 0d  e FTS3 virtual .
1d00: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 61 62  .        /// tab
1d10: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
1d20: 6e 2c 20 77 68 65 72 65 20 65 76 65 72 79 20 46  n, where every F
1d30: 54 53 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  TS virtual table
1d40: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 63 6f  ..        /// co
1d50: 6e 74 61 69 6e 73 20 61 6e 20 46 54 53 20 68 69  ntains an FTS hi
1d60: 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 74 68 61 74  dden column that
1d70: 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 73 73   is used to pass
1d80: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
1d90: 6d 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f  m the..        /
1da0: 2f 2f 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  // virtual table
1db0: 20 69 6e 74 6f 20 46 54 53 20 61 75 78 69 6c 69   into FTS auxili
1dc0: 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ary functions an
1dd0: 64 20 74 6f 20 74 68 65 20 46 54 53 20 4d 41 54  d to the FTS MAT
1de0: 43 48 20 6f 70 65 72 61 74 6f 72 2e 0d 0a 20 20  CH operator...  
1df0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
1e00: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
1e10: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
1e20: 2f 2f 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  // A virtual tab
1e30: 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  le that contains
1e40: 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 20   hidden columns 
1e50: 63 61 6e 20 62 65 20 75 73 65 64 20 6c 69 6b 65  can be used like
1e60: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 20  ..        /// a 
1e70: 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e  table-valued fun
1e80: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 46 52 4f  ction in the FRO
1e90: 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1ea0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0d  LECT statement..
1eb0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
1ec0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
1ed0: 65 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66  e table-valued f
1ee0: 75 6e 63 74 69 6f 6e 20 62 65 63 6f 6d 65 20 63  unction become c
1ef0: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 0d 0a  onstraints on ..
1f00: 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20          /// the 
1f10: 48 49 44 44 45 4e 20 63 6f 6c 75 6d 6e 73 20 6f  HIDDEN columns o
1f20: 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
1f30: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ble...        //
1f40: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
1f50: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
1f60: 20 20 20 20 20 20 20 2f 2f 2f 20 46 6f 72 20 65         /// For e
1f70: 78 61 6d 70 6c 65 2c 20 74 68 65 20 22 67 65 6e  xample, the "gen
1f80: 65 72 61 74 65 5f 73 65 72 69 65 73 22 20 65 78  erate_series" ex
1f90: 74 65 6e 73 69 6f 6e 20 28 6c 6f 63 61 74 65 64  tension (located
1fa0: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20   in the..       
1fb0: 20 2f 2f 2f 20 65 78 74 2f 6d 69 73 63 2f 73 65   /// ext/misc/se
1fc0: 72 69 65 73 2e 63 0d 0a 20 20 20 20 20 20 20 20  ries.c..        
1fd0: 2f 2f 2f 20 66 69 6c 65 20 69 6e 20 74 68 65 20  /// file in the 
1fe0: 73 6f 75 72 63 65 20 74 72 65 65 29 0d 0a 20 20  source tree)..  
1ff0: 20 20 20 20 20 20 2f 2f 2f 20 69 6d 70 6c 65 6d        /// implem
2000: 65 6e 74 73 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  ents an eponymou
2010: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
2020: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
2030: 6e 67 20 73 63 68 65 6d 61 3a 0d 0a 20 20 20 20  ng schema:..    
2040: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
2050: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
2060: 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20  ra><code>..     
2070: 20 20 20 2f 2f 2f 20 43 52 45 41 54 45 20 54 41     /// CREATE TA
2080: 42 4c 45 20 67 65 6e 65 72 61 74 65 5f 73 65 72  BLE generate_ser
2090: 69 65 73 28 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ies(..        //
20a0: 2f 20 20 20 76 61 6c 75 65 2c 0d 0a 20 20 20 20  /   value,..    
20b0: 20 20 20 20 2f 2f 2f 20 20 20 73 74 61 72 74 20      ///   start 
20c0: 48 49 44 44 45 4e 2c 0d 0a 20 20 20 20 20 20 20  HIDDEN,..       
20d0: 20 2f 2f 2f 20 20 20 73 74 6f 70 20 48 49 44 44   ///   stop HIDD
20e0: 45 4e 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  EN,..        ///
20f0: 20 20 20 73 74 65 70 20 48 49 44 44 45 4e 0d 0a     step HIDDEN..
2100: 20 20 20 20 20 20 20 20 2f 2f 2f 20 29 3b 0d 0a          /// );..
2110: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f          /// </co
2120: 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  de></para>..    
2130: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
2140: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
2150: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 2e 78  sqlite3_module.x
2160: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
2170: 20 69 6e 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   in the implemen
2180: 74 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 0d 0a  tation of this..
2190: 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 61 62 6c          /// tabl
21a0: 65 20 63 68 65 63 6b 73 20 66 6f 72 20 65 71 75  e checks for equ
21b0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
21c0: 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 48 49  s against the HI
21d0: 44 44 45 4e 20 63 6f 6c 75 6d 6e 73 2c 20 61 6e  DDEN columns, an
21e0: 64 20 75 73 65 73 0d 0a 20 20 20 20 20 20 20 20  d uses..        
21f0: 2f 2f 2f 20 74 68 6f 73 65 20 61 73 20 69 6e 70  /// those as inp
2200: 75 74 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  ut parameters to
2210: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 72   determine the r
2220: 61 6e 67 65 20 6f 66 20 69 6e 74 65 67 65 72 20  ange of integer 
2230: 22 76 61 6c 75 65 22 20 6f 75 74 70 75 74 73 0d  "value" outputs.
2240: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20  .        /// to 
2250: 67 65 6e 65 72 61 74 65 2e 20 20 52 65 61 73 6f  generate.  Reaso
2260: 6e 61 62 6c 65 20 64 65 66 61 75 6c 74 73 20 61  nable defaults a
2270: 72 65 20 75 73 65 64 20 66 6f 72 20 61 6e 79 20  re used for any 
2280: 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f  unconstrained co
2290: 6c 75 6d 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20  lumns...        
22a0: 2f 2f 2f 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  /// For example,
22b0: 20 74 6f 20 6c 69 73 74 20 61 6c 6c 20 69 6e 74   to list all int
22c0: 65 67 65 72 73 20 62 65 74 77 65 65 6e 20 35 20  egers between 5 
22d0: 61 6e 64 20 35 30 3a 0d 0a 20 20 20 20 20 20 20  and 50:..       
22e0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
22f0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
2300: 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20  <code>..        
2310: 2f 2f 2f 20 53 45 4c 45 43 54 20 76 61 6c 75 65  /// SELECT value
2320: 20 46 52 4f 4d 20 67 65 6e 65 72 61 74 65 5f 73   FROM generate_s
2330: 65 72 69 65 73 28 35 2c 35 30 29 3b 0d 0a 20 20  eries(5,50);..  
2340: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65        /// </code
2350: 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  ></para>..      
2360: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
2370: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 70 72        /// The pr
2380: 65 76 69 6f 75 73 20 71 75 65 72 79 20 69 73 20  evious query is 
2390: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
23a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0d 0a 20 20  e following:..  
23b0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
23c0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
23d0: 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20  para><code>..   
23e0: 20 20 20 20 20 2f 2f 2f 20 53 45 4c 45 43 54 20       /// SELECT 
23f0: 76 61 6c 75 65 20 46 52 4f 4d 20 67 65 6e 65 72  value FROM gener
2400: 61 74 65 5f 73 65 72 69 65 73 20 57 48 45 52 45  ate_series WHERE
2410: 20 73 74 61 72 74 3d 35 20 41 4e 44 20 73 74 6f   start=5 AND sto
2420: 70 3d 35 30 3b 0d 0a 20 20 20 20 20 20 20 20 2f  p=50;..        /
2430: 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61  // </code></para
2440: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
2450: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
2460: 2f 2f 20 41 72 67 75 6d 65 6e 74 73 20 6f 6e 20  // Arguments on 
2470: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
2480: 65 20 6e 61 6d 65 20 61 72 65 20 6d 61 74 63 68  e name are match
2490: 65 64 20 74 6f 20 68 69 64 64 65 6e 20 63 6f 6c  ed to hidden col
24a0: 75 6d 6e 73 0d 0a 20 20 20 20 20 20 20 20 2f 2f  umns..        //
24b0: 2f 20 69 6e 20 6f 72 64 65 72 2e 20 20 54 68 65  / in order.  The
24c0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
24d0: 65 6e 74 73 20 63 61 6e 20 62 65 20 6c 65 73 73  ents can be less
24e0: 20 74 68 61 6e 20 74 68 65 0d 0a 20 20 20 20 20   than the..     
24f0: 20 20 20 2f 2f 2f 20 6e 75 6d 62 65 72 20 6f 66     /// number of
2500: 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 2c   hidden columns,
2510: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
2520: 68 65 20 6c 61 74 74 65 72 20 68 69 64 64 65 6e  he latter hidden
2530: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 0d 0a 20 20   columns are..  
2540: 20 20 20 20 20 20 2f 2f 2f 20 75 6e 63 6f 6e 73        /// uncons
2550: 74 72 61 69 6e 65 64 2e 20 20 48 6f 77 65 76 65  trained.  Howeve
2560: 72 2c 20 61 6e 20 65 72 72 6f 72 20 72 65 73 75  r, an error resu
2570: 6c 74 73 20 69 66 20 74 68 65 72 65 20 61 72 65  lts if there are
2580: 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 0d   more arguments.
2590: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 61  .        /// tha
25a0: 6e 20 74 68 65 72 65 20 61 72 65 20 68 69 64 64  n there are hidd
25b0: 65 6e 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  en columns in th
25c0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
25d0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
25e0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
25f0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
2600: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
2610: 6d 20 6e 61 6d 65 3d 22 70 44 62 22 3e 0d 0a 20  m name="pDb">.. 
2620: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
2630: 61 74 69 76 65 20 64 61 74 61 62 61 73 65 20 63  ative database c
2640: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
2650: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
2660: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
2670: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
2680: 3d 22 70 41 75 78 22 3e 0d 0a 20 20 20 20 20 20  ="pAux">..      
2690: 20 20 2f 2f 2f 20 54 68 65 20 6f 72 69 67 69 6e    /// The origin
26a0: 61 6c 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65  al native pointe
26b0: 72 20 76 61 6c 75 65 20 74 68 61 74 20 77 61 73  r value that was
26c0: 20 70 72 6f 76 69 64 65 64 20 74 6f 20 74 68 65   provided to the
26d0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 71  ..        /// sq
26e0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64  lite3_create_mod
26f0: 75 6c 65 28 29 2c 20 73 71 6c 69 74 65 33 5f 63  ule(), sqlite3_c
2700: 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28  reate_module_v2(
2710: 29 20 6f 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ) or..        //
2720: 2f 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  / sqlite3_create
2730: 5f 64 69 73 70 6f 73 61 62 6c 65 5f 6d 6f 64 75  _disposable_modu
2740: 6c 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0d  le() functions..
2750: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
2760: 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f  aram>..        /
2770: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
2780: 61 72 67 63 22 3e 0d 0a 20 20 20 20 20 20 20 20  argc">..        
2790: 2f 2f 2f 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  /// The number o
27a0: 66 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  f arguments from
27b0: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 52 54   the CREATE VIRT
27c0: 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d  UAL TABLE statem
27d0: 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ent...        //
27e0: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
27f0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
2800: 61 6d 65 3d 22 61 72 67 76 22 3e 0d 0a 20 20 20  ame="argv">..   
2810: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 61 72 72       /// The arr
2820: 61 79 20 6f 66 20 73 74 72 69 6e 67 20 61 72 67  ay of string arg
2830: 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  uments from the 
2840: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
2850: 41 42 4c 45 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ABLE..        //
2860: 2f 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20  / statement...  
2870: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
2880: 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  m>..        /// 
2890: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74  <param name="pVt
28a0: 61 62 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ab">..        //
28b0: 2f 20 55 70 6f 6e 20 73 75 63 63 65 73 73 2c 20  / Upon success, 
28c0: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 6d  this parameter m
28d0: 75 73 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20  ust be modified 
28e0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
28f0: 6e 65 77 6c 79 0d 0a 20 20 20 20 20 20 20 20 2f  newly..        /
2900: 2f 2f 20 63 72 65 61 74 65 64 20 6e 61 74 69 76  // created nativ
2910: 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 64  e sqlite3_vtab d
2920: 65 72 69 76 65 64 20 73 74 72 75 63 74 75 72 65  erived structure
2930: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
2940: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
2950: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
2960: 3d 22 70 45 72 72 6f 72 22 3e 0d 0a 20 20 20 20  ="pError">..    
2970: 20 20 20 20 2f 2f 2f 20 55 70 6f 6e 20 66 61 69      /// Upon fai
2980: 6c 75 72 65 2c 20 74 68 69 73 20 70 61 72 61 6d  lure, this param
2990: 65 74 65 72 20 6d 75 73 74 20 62 65 20 6d 6f 64  eter must be mod
29a0: 69 66 69 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  ified to point t
29b0: 6f 20 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20  o the error..   
29c0: 20 20 20 20 20 2f 2f 2f 20 6d 65 73 73 61 67 65       /// message
29d0: 2c 20 77 69 74 68 20 74 68 65 20 75 6e 64 65 72  , with the under
29e0: 6c 79 69 6e 67 20 6d 65 6d 6f 72 79 20 68 61 76  lying memory hav
29f0: 69 6e 67 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ing been obtaine
2a00: 64 20 66 72 6f 6d 20 74 68 65 0d 0a 20 20 20 20  d from the..    
2a10: 20 20 20 20 2f 2f 2f 20 73 71 6c 69 74 65 33 5f      /// sqlite3_
2a20: 6d 61 6c 6c 6f 63 28 29 20 66 75 6e 63 74 69 6f  malloc() functio
2a30: 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  n...        /// 
2a40: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
2a50: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d    /// <returns>.
2a60: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73  .        /// A s
2a70: 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72  tandard SQLite r
2a80: 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20  eturn code...   
2a90: 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72       /// </retur
2aa0: 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c  ns>..        SQL
2ab0: 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78 43 72  iteErrorCode xCr
2ac0: 65 61 74 65 28 0d 0a 20 20 20 20 20 20 20 20 20  eate(..         
2ad0: 20 20 20 49 6e 74 50 74 72 20 70 44 62 2c 0d 0a     IntPtr pDb,..
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 50              IntP
2af0: 74 72 20 70 41 75 78 2c 0d 0a 20 20 20 20 20 20  tr pAux,..      
2b00: 20 20 20 20 20 20 69 6e 74 20 61 72 67 63 2c 0d        int argc,.
2b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  .            Int
2b20: 50 74 72 20 61 72 67 76 2c 0d 0a 20 20 20 20 20  Ptr argv,..     
2b30: 20 20 20 20 20 20 20 72 65 66 20 49 6e 74 50 74         ref IntPt
2b40: 72 20 70 56 74 61 62 2c 0d 0a 20 20 20 20 20 20  r pVtab,..      
2b50: 20 20 20 20 20 20 72 65 66 20 49 6e 74 50 74 72        ref IntPtr
2b60: 20 70 45 72 72 6f 72 0d 0a 20 20 20 20 20 20 20   pError..       
2b70: 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 20       );....     
2b80: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
2b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2bc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
2bd0: 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61        /// <summa
2be0: 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ry>..        ///
2bf0: 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20   <para><code>.. 
2c00: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 69 6e 74         ///   int
2c10: 20 28 2a 78 43 6f 6e 6e 65 63 74 29 28 73 71 6c   (*xConnect)(sql
2c20: 69 74 65 33 2a 2c 20 76 6f 69 64 20 2a 70 41 75  ite3*, void *pAu
2c30: 78 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  x,..        /// 
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2c50: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
2c60: 61 72 67 76 2c 0d 0a 20 20 20 20 20 20 20 20 2f  argv,..        /
2c70: 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  //              
2c80: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
2c90: 2a 70 70 56 54 61 62 2c 0d 0a 20 20 20 20 20 20  *ppVTab,..      
2ca0: 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20 20 20    ///           
2cb0: 20 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 45 72       char **pzEr
2cc0: 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  r);..        ///
2cd0: 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d   </code></para>.
2ce0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
2cf0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
2d00: 20 54 68 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65   The xConnect me
2d10: 74 68 6f 64 20 69 73 20 76 65 72 79 20 73 69 6d  thod is very sim
2d20: 69 6c 61 72 20 74 6f 20 78 43 72 65 61 74 65 2e  ilar to xCreate.
2d30: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 49   ..        /// I
2d40: 74 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 70  t has the same p
2d50: 61 72 61 6d 65 74 65 72 73 20 61 6e 64 20 63 6f  arameters and co
2d60: 6e 73 74 72 75 63 74 73 20 61 20 6e 65 77 20 73  nstructs a new s
2d70: 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
2d80: 63 74 75 72 65 20 0d 0a 20 20 20 20 20 20 20 20  cture ..        
2d90: 2f 2f 2f 20 6a 75 73 74 20 6c 69 6b 65 20 78 43  /// just like xC
2da0: 72 65 61 74 65 2e 20 0d 0a 20 20 20 20 20 20 20  reate. ..       
2db0: 20 2f 2f 2f 20 41 6e 64 20 69 74 20 6d 75 73 74   /// And it must
2dc0: 20 61 6c 73 6f 20 63 61 6c 6c 20 73 71 6c 69 74   also call sqlit
2dd0: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
2de0: 29 20 6c 69 6b 65 20 78 43 72 65 61 74 65 2e 0d  ) like xCreate..
2df0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
2e00: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
2e10: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
2e20: 20 20 2f 2f 2f 20 54 68 65 20 64 69 66 66 65 72    /// The differ
2e30: 65 6e 63 65 20 69 73 20 74 68 61 74 20 78 43 6f  ence is that xCo
2e40: 6e 6e 65 63 74 20 69 73 20 63 61 6c 6c 65 64 20  nnect is called 
2e50: 74 6f 20 65 73 74 61 62 6c 69 73 68 20 61 20 6e  to establish a n
2e60: 65 77 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ew ..        ///
2e70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
2e80: 6e 20 65 78 69 73 74 69 6e 67 20 76 69 72 74 75  n existing virtu
2e90: 61 6c 20 74 61 62 6c 65 20 77 68 65 72 65 61 73  al table whereas
2ea0: 20 78 43 72 65 61 74 65 20 69 73 20 63 61 6c 6c   xCreate is call
2eb0: 65 64 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ed ..        ///
2ec0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
2ed0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66   virtual table f
2ee0: 72 6f 6d 20 73 63 72 61 74 63 68 2e 0d 0a 20 20  rom scratch...  
2ef0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
2f00: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
2f10: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
2f20: 2f 2f 20 54 68 65 20 78 43 72 65 61 74 65 20 61  // The xCreate a
2f30: 6e 64 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68  nd xConnect meth
2f40: 6f 64 73 20 61 72 65 20 6f 6e 6c 79 20 64 69 66  ods are only dif
2f50: 66 65 72 65 6e 74 20 77 68 65 6e 20 74 68 65 0d  ferent when the.
2f60: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 76 69 72  .        /// vir
2f70: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 73 20 73  tual table has s
2f80: 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 62 61 63 6b  ome kind of back
2f90: 69 6e 67 20 73 74 6f 72 65 20 74 68 61 74 20 6d  ing store that m
2fa0: 75 73 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ust be initializ
2fb0: 65 64 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ed ..        ///
2fc0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
2fd0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
2fe0: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 54 68  e is created. Th
2ff0: 65 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64  e xCreate method
3000: 20 63 72 65 61 74 65 73 20 0d 0a 20 20 20 20 20   creates ..     
3010: 20 20 20 2f 2f 2f 20 61 6e 64 20 69 6e 69 74 69     /// and initi
3020: 61 6c 69 7a 65 73 20 74 68 65 20 62 61 63 6b 69  alizes the backi
3030: 6e 67 20 73 74 6f 72 65 2e 20 54 68 65 20 78 43  ng store. The xC
3040: 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 20 6a 75  onnect method ju
3050: 73 74 20 63 6f 6e 6e 65 63 74 73 20 0d 0a 20 20  st connects ..  
3060: 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20 61 6e 20        /// to an 
3070: 65 78 69 73 74 69 6e 67 20 62 61 63 6b 69 6e 67  existing backing
3080: 20 73 74 6f 72 65 2e 20 20 57 68 65 6e 20 78 43   store.  When xC
3090: 72 65 61 74 65 20 61 6e 64 20 78 43 6f 6e 6e 65  reate and xConne
30a0: 63 74 20 61 72 65 20 74 68 65 20 73 61 6d 65 2c  ct are the same,
30b0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
30c0: 65 20 74 61 62 6c 65 20 69 73 20 61 6e 20 65 70  e table is an ep
30d0: 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20  onymous virtual 
30e0: 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  table...        
30f0: 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
3100: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
3110: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 73 20  .        /// As 
3120: 61 6e 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73  an example, cons
3130: 69 64 65 72 20 61 20 76 69 72 74 75 61 6c 20 74  ider a virtual t
3140: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
3150: 69 6f 6e 20 74 68 61 74 20 0d 0a 20 20 20 20 20  ion that ..     
3160: 20 20 20 2f 2f 2f 20 70 72 6f 76 69 64 65 73 20     /// provides 
3170: 72 65 61 64 2d 6f 6e 6c 79 20 61 63 63 65 73 73  read-only access
3180: 20 74 6f 20 65 78 69 73 74 69 6e 67 20 63 6f 6d   to existing com
3190: 6d 61 2d 73 65 70 61 72 61 74 65 64 2d 76 61 6c  ma-separated-val
31a0: 75 65 20 28 43 53 56 29 0d 0a 20 20 20 20 20 20  ue (CSV)..      
31b0: 20 20 2f 2f 2f 20 66 69 6c 65 73 20 6f 6e 20 64    /// files on d
31c0: 69 73 6b 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  isk. There is no
31d0: 20 62 61 63 6b 69 6e 67 20 73 74 6f 72 65 20 74   backing store t
31e0: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
31f0: 63 72 65 61 74 65 64 20 0d 0a 20 20 20 20 20 20  created ..      
3200: 20 20 2f 2f 2f 20 6f 72 20 69 6e 69 74 69 61 6c    /// or initial
3210: 69 7a 65 64 20 66 6f 72 20 73 75 63 68 20 61 20  ized for such a 
3220: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 28 73  virtual table (s
3230: 69 6e 63 65 20 74 68 65 20 43 53 56 20 66 69 6c  ince the CSV fil
3240: 65 73 20 61 6c 72 65 61 64 79 20 0d 0a 20 20 20  es already ..   
3250: 20 20 20 20 20 2f 2f 2f 20 65 78 69 73 74 20 6f       /// exist o
3260: 6e 20 64 69 73 6b 29 20 73 6f 20 74 68 65 20 78  n disk) so the x
3270: 43 72 65 61 74 65 20 61 6e 64 20 78 43 6f 6e 6e  Create and xConn
3280: 65 63 74 20 6d 65 74 68 6f 64 73 20 77 69 6c 6c  ect methods will
3290: 20 62 65 20 69 64 65 6e 74 69 63 61 6c 20 0d 0a   be identical ..
32a0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 66 6f 72 20          /// for 
32b0: 74 68 61 74 20 6d 6f 64 75 6c 65 2e 0d 0a 20 20  that module...  
32c0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
32d0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
32e0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
32f0: 2f 2f 20 41 6e 6f 74 68 65 72 20 65 78 61 6d 70  // Another examp
3300: 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  le is a virtual 
3310: 74 61 62 6c 65 20 74 68 61 74 20 69 6d 70 6c 65  table that imple
3320: 6d 65 6e 74 73 20 61 20 66 75 6c 6c 2d 74 65 78  ments a full-tex
3330: 74 20 69 6e 64 65 78 2e 20 0d 0a 20 20 20 20 20  t index. ..     
3340: 20 20 20 2f 2f 2f 20 54 68 65 20 78 43 72 65 61     /// The xCrea
3350: 74 65 20 6d 65 74 68 6f 64 20 6d 75 73 74 20 63  te method must c
3360: 72 65 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  reate and initia
3370: 6c 69 7a 65 20 64 61 74 61 20 73 74 72 75 63 74  lize data struct
3380: 75 72 65 73 20 74 6f 20 68 6f 6c 64 20 0d 0a 20  ures to hold .. 
3390: 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 64         /// the d
33a0: 69 63 74 69 6f 6e 61 72 79 20 61 6e 64 20 70 6f  ictionary and po
33b0: 73 74 69 6e 67 20 6c 69 73 74 73 20 66 6f 72 20  sting lists for 
33c0: 74 68 61 74 20 69 6e 64 65 78 2e 20 54 68 65 20  that index. The 
33d0: 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2c  xConnect method,
33e0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6f 6e  ..        /// on
33f0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
3400: 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 6c 6f 63   only has to loc
3410: 61 74 65 20 61 6e 64 20 75 73 65 20 61 6e 20 65  ate and use an e
3420: 78 69 73 74 69 6e 67 20 64 69 63 74 69 6f 6e 61  xisting dictiona
3430: 72 79 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ry ..        ///
3440: 20 61 6e 64 20 70 6f 73 74 69 6e 67 20 6c 69 73   and posting lis
3450: 74 73 20 74 68 61 74 20 77 65 72 65 20 63 72 65  ts that were cre
3460: 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
3470: 78 43 72 65 61 74 65 20 63 61 6c 6c 2e 0d 0a 20  xCreate call... 
3480: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
3490: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
34a0: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
34b0: 2f 2f 2f 20 54 68 65 20 78 43 6f 6e 6e 65 63 74  /// The xConnect
34c0: 20 6d 65 74 68 6f 64 20 6d 75 73 74 20 72 65 74   method must ret
34d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
34e0: 20 69 74 20 69 73 20 73 75 63 63 65 73 73 66 75   it is successfu
34f0: 6c 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  l ..        /// 
3500: 69 6e 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  in creating the 
3510: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c  new virtual tabl
3520: 65 2c 20 6f 72 20 53 51 4c 49 54 45 5f 45 52 52  e, or SQLITE_ERR
3530: 4f 52 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  OR if it is not 
3540: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 75  ..        /// su
3550: 63 63 65 73 73 66 75 6c 2e 20 49 66 20 6e 6f 74  ccessful. If not
3560: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
3570: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74   sqlite3_vtab st
3580: 72 75 63 74 75 72 65 20 6d 75 73 74 20 6e 6f 74  ructure must not
3590: 20 62 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f   be ..        //
35a0: 2f 20 61 6c 6c 6f 63 61 74 65 64 2e 20 41 6e 20  / allocated. An 
35b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 61  error message ma
35c0: 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20  y optionally be 
35d0: 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 7a 45  returned in *pzE
35e0: 72 72 20 69 66 20 0d 0a 20 20 20 20 20 20 20 20  rr if ..        
35f0: 2f 2f 2f 20 75 6e 73 75 63 63 65 73 73 66 75 6c  /// unsuccessful
3600: 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  . ..        /// 
3610: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
3620: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
3630: 73 74 72 69 6e 67 20 6d 75 73 74 20 62 65 20 61  string must be a
3640: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0d 0a  llocated using..
3650: 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 6e 20 53          /// an S
3660: 51 4c 69 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  QLite memory all
3670: 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ocation function
3680: 20 6c 69 6b 65 20 0d 0a 20 20 20 20 20 20 20 20   like ..        
3690: 2f 2f 2f 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  /// sqlite3_mall
36a0: 6f 63 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  oc() or sqlite3_
36b0: 6d 70 72 69 6e 74 66 28 29 20 61 73 20 74 68 65  mprintf() as the
36c0: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 69 6c   SQLite core wil
36d0: 6c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61  l..        /// a
36e0: 74 74 65 6d 70 74 20 74 6f 20 66 72 65 65 20 74  ttempt to free t
36f0: 68 65 20 73 70 61 63 65 20 75 73 69 6e 67 20 73  he space using s
3700: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 61 66  qlite3_free() af
3710: 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 68 61  ter the error ha
3720: 73 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 62  s..        /// b
3730: 65 65 6e 20 72 65 70 6f 72 74 65 64 20 75 70 20  een reported up 
3740: 74 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  to the applicati
3750: 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  on...        ///
3760: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
3770: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
3780: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 43        /// The xC
3790: 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 20 69 73  onnect method is
37a0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 76   required for ev
37b0: 65 72 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ery virtual tabl
37c0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
37d0: 2c 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  , ..        /// 
37e0: 74 68 6f 75 67 68 20 74 68 65 20 78 43 72 65 61  though the xCrea
37f0: 74 65 20 61 6e 64 20 78 43 6f 6e 6e 65 63 74 20  te and xConnect 
3800: 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 20  pointers of the 
3810: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 6f  sqlite3_module o
3820: 62 6a 65 63 74 0d 0a 20 20 20 20 20 20 20 20 2f  bject..        /
3830: 2f 2f 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  // may point to 
3840: 74 68 65 20 73 61 6d 65 20 66 75 6e 63 74 69 6f  the same functio
3850: 6e 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  n if the virtual
3860: 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
3870: 6e 65 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20  need to..       
3880: 20 2f 2f 2f 20 69 6e 69 74 69 61 6c 69 7a 65 20   /// initialize 
3890: 62 61 63 6b 69 6e 67 20 73 74 6f 72 65 2e 0d 0a  backing store...
38a0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
38b0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
38c0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
38d0: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
38e0: 6e 61 6d 65 3d 22 70 44 62 22 3e 0d 0a 20 20 20  name="pDb">..   
38f0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74       /// The nat
3900: 69 76 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ive database con
3910: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 2e 0d  nection handle..
3920: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
3930: 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f  aram>..        /
3940: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
3950: 70 41 75 78 22 3e 0d 0a 20 20 20 20 20 20 20 20  pAux">..        
3960: 2f 2f 2f 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  /// The original
3970: 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20   native pointer 
3980: 76 61 6c 75 65 20 74 68 61 74 20 77 61 73 20 70  value that was p
3990: 72 6f 76 69 64 65 64 20 74 6f 20 74 68 65 0d 0a  rovided to the..
39a0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 71 6c 69          /// sqli
39b0: 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
39c0: 65 28 29 2c 20 73 71 6c 69 74 65 33 5f 63 72 65  e(), sqlite3_cre
39d0: 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 29 20  ate_module_v2() 
39e0: 6f 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  or..        /// 
39f0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 64  sqlite3_create_d
3a00: 69 73 70 6f 73 61 62 6c 65 5f 6d 6f 64 75 6c 65  isposable_module
3a10: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0d 0a 20  () functions... 
3a20: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
3a30: 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  am>..        ///
3a40: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72   <param name="ar
3a50: 67 63 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  gc">..        //
3a60: 2f 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  / The number of 
3a70: 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74  arguments from t
3a80: 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
3a90: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
3aa0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  t...        /// 
3ab0: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
3ac0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
3ad0: 65 3d 22 61 72 67 76 22 3e 0d 0a 20 20 20 20 20  e="argv">..     
3ae0: 20 20 20 2f 2f 2f 20 54 68 65 20 61 72 72 61 79     /// The array
3af0: 20 6f 66 20 73 74 72 69 6e 67 20 61 72 67 75 6d   of string argum
3b00: 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 43 52  ents from the CR
3b10: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
3b20: 4c 45 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  LE..        /// 
3b30: 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20  statement...    
3b40: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
3b50: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
3b60: 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74 61 62  aram name="pVtab
3b70: 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ">..        /// 
3b80: 55 70 6f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  Upon success, th
3b90: 69 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  is parameter mus
3ba0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 74 6f  t be modified to
3bb0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
3bc0: 77 6c 79 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  wly..        ///
3bd0: 20 63 72 65 61 74 65 64 20 6e 61 74 69 76 65 20   created native 
3be0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 64 65 72  sqlite3_vtab der
3bf0: 69 76 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d  ived structure..
3c00: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
3c10: 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f  aram>..        /
3c20: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
3c30: 70 45 72 72 6f 72 22 3e 0d 0a 20 20 20 20 20 20  pError">..      
3c40: 20 20 2f 2f 2f 20 55 70 6f 6e 20 66 61 69 6c 75    /// Upon failu
3c50: 72 65 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74  re, this paramet
3c60: 65 72 20 6d 75 73 74 20 62 65 20 6d 6f 64 69 66  er must be modif
3c70: 69 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ied to point to 
3c80: 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20  the error..     
3c90: 20 20 20 2f 2f 2f 20 6d 65 73 73 61 67 65 2c 20     /// message, 
3ca0: 77 69 74 68 20 74 68 65 20 75 6e 64 65 72 6c 79  with the underly
3cb0: 69 6e 67 20 6d 65 6d 6f 72 79 20 68 61 76 69 6e  ing memory havin
3cc0: 67 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  g been obtained 
3cd0: 66 72 6f 6d 20 74 68 65 0d 0a 20 20 20 20 20 20  from the..      
3ce0: 20 20 2f 2f 2f 20 73 71 6c 69 74 65 33 5f 6d 61    /// sqlite3_ma
3cf0: 6c 6c 6f 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e  lloc() function.
3d00: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
3d10: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20  param>..        
3d20: 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20  /// <returns>.. 
3d30: 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74 61         /// A sta
3d40: 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72 65 74  ndard SQLite ret
3d50: 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20  urn code...     
3d60: 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73     /// </returns
3d70: 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74  >..        SQLit
3d80: 65 45 72 72 6f 72 43 6f 64 65 20 78 43 6f 6e 6e  eErrorCode xConn
3d90: 65 63 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ect(..          
3da0: 20 20 49 6e 74 50 74 72 20 70 44 62 2c 0d 0a 20    IntPtr pDb,.. 
3db0: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 50 74             IntPt
3dc0: 72 20 70 41 75 78 2c 0d 0a 20 20 20 20 20 20 20  r pAux,..       
3dd0: 20 20 20 20 20 69 6e 74 20 61 72 67 63 2c 0d 0a       int argc,..
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 50              IntP
3df0: 74 72 20 61 72 67 76 2c 0d 0a 20 20 20 20 20 20  tr argv,..      
3e00: 20 20 20 20 20 20 72 65 66 20 49 6e 74 50 74 72        ref IntPtr
3e10: 20 70 56 74 61 62 2c 0d 0a 20 20 20 20 20 20 20   pVtab,..       
3e20: 20 20 20 20 20 72 65 66 20 49 6e 74 50 74 72 20       ref IntPtr 
3e30: 70 45 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  pError..        
3e40: 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20      );....      
3e50: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
3e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3e70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3e80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3e90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
3ea0: 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72       /// <summar
3eb0: 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  y>..        /// 
3ec0: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
3ed0: 2f 2f 2f 20 53 51 4c 69 74 65 20 75 73 65 73 20  /// SQLite uses 
3ee0: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
3ef0: 65 74 68 6f 64 20 6f 66 20 61 20 76 69 72 74 75  ethod of a virtu
3f00: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
3f10: 74 6f 20 64 65 74 65 72 6d 69 6e 65 0d 0a 20 20  to determine..  
3f20: 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 62 65        /// the be
3f30: 73 74 20 77 61 79 20 74 6f 20 61 63 63 65 73 73  st way to access
3f40: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
3f50: 6c 65 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  le. ..        //
3f60: 2f 20 54 68 65 20 78 42 65 73 74 49 6e 64 65 78  / The xBestIndex
3f70: 20 6d 65 74 68 6f 64 20 68 61 73 20 61 20 70 72   method has a pr
3f80: 6f 74 6f 74 79 70 65 20 6c 69 6b 65 20 74 68 69  ototype like thi
3f90: 73 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  s:..        /// 
3fa0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
3fb0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65   /// <para><code
3fc0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20  >..        ///  
3fd0: 20 69 6e 74 20 28 2a 78 42 65 73 74 49 6e 64 65   int (*xBestInde
3fe0: 78 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  x)(sqlite3_vtab 
3ff0: 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f  *pVTab, sqlite3_
4000: 69 6e 64 65 78 5f 69 6e 66 6f 2a 29 3b 0d 0a 20  index_info*);.. 
4010: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64         /// </cod
4020: 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  e></para>..     
4030: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
4040: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 53         /// The S
4050: 51 4c 69 74 65 20 63 6f 72 65 20 63 6f 6d 6d 75  QLite core commu
4060: 6e 69 63 61 74 65 73 20 77 69 74 68 20 74 68 65  nicates with the
4070: 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
4080: 6f 64 20 62 79 20 66 69 6c 6c 69 6e 67 20 0d 0a  od by filling ..
4090: 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 20 63          /// in c
40a0: 65 72 74 61 69 6e 20 66 69 65 6c 64 73 20 6f 66  ertain fields of
40b0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
40c0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
40d0: 65 20 61 6e 64 20 70 61 73 73 69 6e 67 20 61 20  e and passing a 
40e0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 70 6f  ..        /// po
40f0: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73 74  inter to that st
4100: 72 75 63 74 75 72 65 20 69 6e 74 6f 20 78 42 65  ructure into xBe
4110: 73 74 49 6e 64 65 78 20 61 73 20 74 68 65 20 73  stIndex as the s
4120: 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2e  econd parameter.
4130: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54   ..        /// T
4140: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
4150: 74 68 6f 64 20 66 69 6c 6c 73 20 6f 75 74 20 6f  thod fills out o
4160: 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74  ther fields of t
4170: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 77 68  his structure wh
4180: 69 63 68 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ich..        ///
4190: 20 66 6f 72 6d 73 20 74 68 65 20 72 65 70 6c 79   forms the reply
41a0: 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  . The sqlite3_in
41b0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
41c0: 72 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  re looks like th
41d0: 69 73 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  is:..        ///
41e0: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
41f0: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64    /// <para><cod
4200: 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e>..        /// 
4210: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
4220: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 7b 0d 0a 20  _index_info {.. 
4230: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 2f         ///     /
4240: 2a 20 49 6e 70 75 74 73 20 2a 2f 0d 0a 20 20 20  * Inputs */..   
4250: 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 63 6f 6e       ///     con
4260: 73 74 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69  st int nConstrai
4270: 6e 74 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  nt;     /* Numbe
4280: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
4290: 61 43 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0d 0a  aConstraint */..
42a0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20          ///     
42b0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
42c0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
42d0: 72 61 69 6e 74 20 7b 0d 0a 20 20 20 20 20 20 20  raint {..       
42e0: 20 2f 2f 2f 20 20 20 20 20 20 20 20 69 6e 74 20   ///        int 
42f0: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
4300: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
4310: 6f 6e 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  on left-hand sid
4320: 65 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20  e of constraint 
4330: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  */..        /// 
4340: 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
4350: 63 68 61 72 20 6f 70 3b 20 20 20 20 20 20 20 20  char op;        
4360: 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 6f   /* Constraint o
4370: 70 65 72 61 74 6f 72 20 2a 2f 0d 0a 20 20 20 20  perator */..    
4380: 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 75      ///        u
4390: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 73 61  nsigned char usa
43a0: 62 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  ble;     /* True
43b0: 20 69 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61   if this constra
43c0: 69 6e 74 20 69 73 20 75 73 61 62 6c 65 20 2a 2f  int is usable */
43d0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
43e0: 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66       int iTermOf
43f0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  fset;          /
4400: 2a 20 55 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  * Used internall
4410: 79 20 2d 20 78 42 65 73 74 49 6e 64 65 78 20 73  y - xBestIndex s
4420: 68 6f 75 6c 64 20 69 67 6e 6f 72 65 20 2a 2f 0d  hould ignore */.
4430: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20  .        ///    
4440: 20 7d 20 2a 63 6f 6e 73 74 20 61 43 6f 6e 73 74   } *const aConst
4450: 72 61 69 6e 74 3b 20 20 20 20 20 20 2f 2a 20 54  raint;      /* T
4460: 61 62 6c 65 20 6f 66 20 57 48 45 52 45 20 63 6c  able of WHERE cl
4470: 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
4480: 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   */..        ///
4490: 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e       const int n
44a0: 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
44b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
44c0: 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
44d0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0d 0a 20 20  BY clause */..  
44e0: 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 63 6f        ///     co
44f0: 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74  nst struct sqlit
4500: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
4510: 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20   {..        /// 
4520: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 75         int iColu
4530: 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mn;             
4540: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
4550: 72 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f  r */..        //
4560: 2f 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  /        unsigne
4570: 64 20 63 68 61 72 20 64 65 73 63 3b 20 20 20 20  d char desc;    
4580: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 44     /* True for D
4590: 45 53 43 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ESC.  False for 
45a0: 41 53 43 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 20  ASC. */..       
45b0: 20 2f 2f 2f 20 20 20 20 20 7d 20 2a 63 6f 6e 73   ///     } *cons
45c0: 74 20 61 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t aOrderBy;     
45d0: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
45e0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0d 0a 20   BY clause */.. 
45f0: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 2f         ///     /
4600: 2a 20 4f 75 74 70 75 74 73 20 2a 2f 0d 0a 20 20  * Outputs */..  
4610: 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 73 74        ///     st
4620: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
4630: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
4640: 61 67 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f  age {..        /
4650: 2f 2f 20 20 20 20 20 20 20 69 6e 74 20 61 72 67  //       int arg
4660: 76 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  vIndex;         
4670: 20 20 2f 2a 20 69 66 20 26 67 74 3b 30 2c 20 63    /* if &gt;0, c
4680: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 70 61 72  onstraint is par
4690: 74 20 6f 66 20 61 72 67 76 20 74 6f 20 78 46 69  t of argv to xFi
46a0: 6c 74 65 72 20 2a 2f 0d 0a 20 20 20 20 20 20 20  lter */..       
46b0: 20 2f 2f 2f 20 20 20 20 20 20 20 75 6e 73 69 67   ///       unsig
46c0: 6e 65 64 20 63 68 61 72 20 6f 6d 69 74 3b 20 20  ned char omit;  
46d0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 63 6f      /* Do not co
46e0: 64 65 20 61 20 74 65 73 74 20 66 6f 72 20 74 68  de a test for th
46f0: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  is constraint */
4700: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
4710: 20 20 7d 20 2a 63 6f 6e 73 74 20 61 43 6f 6e 73    } *const aCons
4720: 74 72 61 69 6e 74 55 73 61 67 65 3b 0d 0a 20 20  traintUsage;..  
4730: 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 69 6e        ///     in
4740: 74 20 69 64 78 4e 75 6d 3b 20 20 20 20 20 20 20  t idxNum;       
4750: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4760: 65 72 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74  er used to ident
4770: 69 66 79 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  ify the index */
4780: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
4790: 20 20 63 68 61 72 20 2a 69 64 78 53 74 72 3b 20    char *idxStr; 
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47b0: 53 74 72 69 6e 67 2c 20 70 6f 73 73 69 62 6c 79  String, possibly
47c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
47d0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 2a 2f  qlite3_malloc */
47e0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
47f0: 20 20 69 6e 74 20 6e 65 65 64 54 6f 46 72 65 65    int needToFree
4800: 49 64 78 53 74 72 3b 20 20 20 20 20 20 2f 2a 20  IdxStr;      /* 
4810: 46 72 65 65 20 69 64 78 53 74 72 20 75 73 69 6e  Free idxStr usin
4820: 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
4830: 20 69 66 20 74 72 75 65 20 2a 2f 0d 0a 20 20 20   if true */..   
4840: 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 69 6e 74       ///     int
4850: 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64   orderByConsumed
4860: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
4870: 69 66 20 6f 75 74 70 75 74 20 69 73 20 61 6c 72  if output is alr
4880: 65 61 64 79 20 6f 72 64 65 72 65 64 20 2a 2f 0d  eady ordered */.
4890: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20  .        ///    
48a0: 20 64 6f 75 62 6c 65 20 65 73 74 69 6d 61 74 65   double estimate
48b0: 64 43 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20 45  dCost;      /* E
48c0: 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66  stimated cost of
48d0: 20 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64 65   using this inde
48e0: 78 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f  x */..        //
48f0: 2f 20 20 20 20 20 3c 21 5b 43 44 41 54 41 5b 3c  /     <![CDATA[<
4900: 62 3e 5d 5d 3e 2f 2a 20 46 69 65 6c 64 73 20 62  b>]]>/* Fields b
4910: 65 6c 6f 77 20 61 72 65 20 6f 6e 6c 79 20 61 76  elow are only av
4920: 61 69 6c 61 62 6c 65 20 69 6e 20 53 51 4c 69 74  ailable in SQLit
4930: 65 20 33 2e 38 2e 32 20 61 6e 64 20 6c 61 74 65  e 3.8.2 and late
4940: 72 20 2a 2f 3c 21 5b 43 44 41 54 41 5b 3c 2f 62  r */<![CDATA[</b
4950: 3e 5d 5d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  >]]>..        //
4960: 2f 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /     sqlite3_in
4970: 74 36 34 20 65 73 74 69 6d 61 74 65 64 52 6f 77  t64 estimatedRow
4980: 73 3b 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74  s;    /* Estimat
4990: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
49a0: 73 20 72 65 74 75 72 6e 65 64 20 2a 2f 0d 0a 20  s returned */.. 
49b0: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 3c         ///     <
49c0: 21 5b 43 44 41 54 41 5b 3c 62 3e 5d 5d 3e 2f 2a  ![CDATA[<b>]]>/*
49d0: 20 46 69 65 6c 64 73 20 62 65 6c 6f 77 20 61 72   Fields below ar
49e0: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
49f0: 20 69 6e 20 53 51 4c 69 74 65 20 33 2e 39 2e 30   in SQLite 3.9.0
4a00: 20 61 6e 64 20 6c 61 74 65 72 20 2a 2f 3c 21 5b   and later */<![
4a10: 43 44 41 54 41 5b 3c 2f 62 3e 5d 5d 3e 0d 0a 20  CDATA[</b>]]>.. 
4a20: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 69         ///     i
4a30: 6e 74 20 69 64 78 46 6c 61 67 73 3b 20 20 20 20  nt idxFlags;    
4a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
4a50: 6b 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e 44 45  k of SQLITE_INDE
4a60: 58 5f 53 43 41 4e 5f 2a 20 66 6c 61 67 73 20 2a  X_SCAN_* flags *
4a70: 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20  /..        ///  
4a80: 20 7d 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   };..        ///
4a90: 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d   </code></para>.
4aa0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
4ab0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
4ac0: 20 50 6c 65 61 73 65 20 6e 6f 74 65 20 74 68 65   Please note the
4ad0: 20 77 61 72 6e 69 6e 67 73 20 6f 6e 20 74 68 65   warnings on the
4ae0: 20 22 65 73 74 69 6d 61 74 65 64 52 6f 77 73 22   "estimatedRows"
4af0: 20 61 6e 64 20 22 69 64 78 46 6c 61 67 73 22 20   and "idxFlags" 
4b00: 66 69 65 6c 64 2e 0d 0a 20 20 20 20 20 20 20 20  field...        
4b10: 2f 2f 2f 20 54 68 65 73 65 20 66 69 65 6c 64 73  /// These fields
4b20: 20 77 65 72 65 20 61 64 64 65 64 20 77 69 74 68   were added with
4b30: 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 73   SQLite versions
4b40: 20 33 2e 38 2e 32 20 61 6e 64 20 33 2e 39 2e 30   3.8.2 and 3.9.0
4b50: 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
4b60: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 6e  ..        /// An
4b70: 79 20 65 78 74 65 6e 73 69 6f 6e 20 74 68 61 74  y extension that
4b80: 20 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73   reads or writes
4b90: 20 74 68 65 73 65 20 66 69 65 6c 64 73 20 6d 75   these fields mu
4ba0: 73 74 20 66 69 72 73 74 20 63 68 65 63 6b 20 74  st first check t
4bb0: 68 61 74 20 74 68 65 20 0d 0a 20 20 20 20 20 20  hat the ..      
4bc0: 20 20 2f 2f 2f 20 76 65 72 73 69 6f 6e 20 6f 66    /// version of
4bd0: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
4be0: 61 72 79 20 69 6e 20 75 73 65 20 69 73 20 67 72  ary in use is gr
4bf0: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
4c00: 75 61 6c 20 74 6f 20 33 2e 38 2e 32 20 6f 72 0d  ual to 3.8.2 or.
4c10: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 33 2e 39  .        /// 3.9
4c20: 2e 30 20 2d 20 70 65 72 68 61 70 73 20 75 73 69  .0 - perhaps usi
4c30: 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
4c40: 69 74 65 33 5f 76 65 72 73 69 6f 6e 28 29 2e 20  ite3_version(). 
4c50: 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 74  The result of at
4c60: 74 65 6d 70 74 69 6e 67 20 0d 0a 20 20 20 20 20  tempting ..     
4c70: 20 20 20 2f 2f 2f 20 74 6f 20 61 63 63 65 73 73     /// to access
4c80: 20 74 68 65 73 65 20 66 69 65 6c 64 73 20 69 6e   these fields in
4c90: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
4ca0: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
4cb0: 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 0d   created by an .
4cc0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6f 6c 64  .        /// old
4cd0: 65 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51  er version of SQ
4ce0: 4c 69 74 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Lite are undefin
4cf0: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ed...        ///
4d00: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
4d10: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
4d20: 20 20 20 20 20 20 2f 2f 2f 20 49 6e 20 61 64 64        /// In add
4d30: 69 74 69 6f 6e 2c 20 74 68 65 72 65 20 61 72 65  ition, there are
4d40: 20 73 6f 6d 65 20 64 65 66 69 6e 65 64 20 63 6f   some defined co
4d50: 6e 73 74 61 6e 74 73 3a 0d 0a 20 20 20 20 20 20  nstants:..      
4d60: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
4d70: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
4d80: 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20  ><code>..       
4d90: 20 2f 2f 2f 20 20 20 23 64 65 66 69 6e 65 20 53   ///   #define S
4da0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
4db0: 54 52 41 49 4e 54 5f 45 51 20 20 20 20 32 0d 0a  TRAINT_EQ    2..
4dc0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 23 64          ///   #d
4dd0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 44  efine SQLITE_IND
4de0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
4df0: 20 20 20 20 34 0d 0a 20 20 20 20 20 20 20 20 2f      4..        /
4e00: 2f 2f 20 20 20 23 64 65 66 69 6e 65 20 53 51 4c  //   #define SQL
4e10: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
4e20: 41 49 4e 54 5f 4c 45 20 20 20 20 38 0d 0a 20 20  AINT_LE    8..  
4e30: 20 20 20 20 20 20 2f 2f 2f 20 20 20 23 64 65 66        ///   #def
4e40: 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ine SQLITE_INDEX
4e50: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 20  _CONSTRAINT_LT  
4e60: 20 20 31 36 0d 0a 20 20 20 20 20 20 20 20 2f 2f    16..        //
4e70: 2f 20 20 20 23 64 65 66 69 6e 65 20 53 51 4c 49  /   #define SQLI
4e80: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
4e90: 49 4e 54 5f 47 45 20 20 20 20 33 32 0d 0a 20 20  INT_GE    32..  
4ea0: 20 20 20 20 20 20 2f 2f 2f 20 20 20 23 64 65 66        ///   #def
4eb0: 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ine SQLITE_INDEX
4ec0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
4ed0: 48 20 36 34 0d 0a 20 20 20 20 20 20 20 20 2f 2f  H 64..        //
4ee0: 2f 20 20 20 23 64 65 66 69 6e 65 20 53 51 4c 49  /   #define SQLI
4ef0: 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e  TE_INDEX_SCAN_UN
4f00: 49 51 55 45 20 20 20 20 20 20 31 20 20 20 20 20  IQUE      1     
4f10: 2f 2a 20 53 63 61 6e 20 76 69 73 69 74 73 20 61  /* Scan visits a
4f20: 74 20 6d 6f 73 74 20 31 20 72 6f 77 20 2a 2f 0d  t most 1 row */.
4f30: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63  .        /// </c
4f40: 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  ode></para>..   
4f50: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
4f60: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
4f70: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 63 61 6c   SQLite core cal
4f80: 6c 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  ls the xBestInde
4f90: 78 20 6d 65 74 68 6f 64 20 77 68 65 6e 20 69 74  x method when it
4fa0: 20 69 73 20 63 6f 6d 70 69 6c 69 6e 67 20 61 20   is compiling a 
4fb0: 71 75 65 72 79 0d 0a 20 20 20 20 20 20 20 20 2f  query..        /
4fc0: 2f 2f 20 74 68 61 74 20 69 6e 76 6f 6c 76 65 73  // that involves
4fd0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
4fe0: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
4ff0: 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  , SQLite calls t
5000: 68 69 73 20 6d 65 74 68 6f 64 20 0d 0a 20 20 20  his method ..   
5010: 20 20 20 20 20 2f 2f 2f 20 77 68 65 6e 20 69 74       /// when it
5020: 20 69 73 20 72 75 6e 6e 69 6e 67 20 73 71 6c 69   is running sqli
5030: 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 6f 72  te3_prepare() or
5040: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   the equivalent.
5050: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 42   ..        /// B
5060: 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 6d  y calling this m
5070: 65 74 68 6f 64 2c 20 74 68 65 20 0d 0a 20 20 20  ethod, the ..   
5080: 20 20 20 20 20 2f 2f 2f 20 53 51 4c 69 74 65 20       /// SQLite 
5090: 63 6f 72 65 20 69 73 20 73 61 79 69 6e 67 20 74  core is saying t
50a0: 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  o the virtual ta
50b0: 62 6c 65 20 74 68 61 74 20 69 74 20 6e 65 65 64  ble that it need
50c0: 73 20 74 6f 20 61 63 63 65 73 73 20 0d 0a 20 20  s to access ..  
50d0: 20 20 20 20 20 20 2f 2f 2f 20 73 6f 6d 65 20 73        /// some s
50e0: 75 62 73 65 74 20 6f 66 20 74 68 65 20 72 6f 77  ubset of the row
50f0: 73 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  s in the virtual
5100: 20 74 61 62 6c 65 20 61 6e 64 20 69 74 20 77 61   table and it wa
5110: 6e 74 73 20 74 6f 20 6b 6e 6f 77 20 74 68 65 0d  nts to know the.
5120: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d 6f 73  .        /// mos
5130: 74 20 65 66 66 69 63 69 65 6e 74 20 77 61 79 20  t efficient way 
5140: 74 6f 20 64 6f 20 74 68 61 74 20 61 63 63 65 73  to do that acces
5150: 73 2e 20 54 68 65 20 78 42 65 73 74 49 6e 64 65  s. The xBestInde
5160: 78 20 6d 65 74 68 6f 64 20 72 65 70 6c 69 65 73  x method replies
5170: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 77   ..        /// w
5180: 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ith information 
5190: 74 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20  that the SQLite 
51a0: 63 6f 72 65 20 63 61 6e 20 74 68 65 6e 20 75 73  core can then us
51b0: 65 20 74 6f 20 63 6f 6e 64 75 63 74 20 61 6e 20  e to conduct an 
51c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 65 66  ..        /// ef
51d0: 66 69 63 69 65 6e 74 20 73 65 61 72 63 68 20 6f  ficient search o
51e0: 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
51f0: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ble...        //
5200: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
5210: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
5220: 20 20 20 20 20 20 20 2f 2f 2f 20 57 68 69 6c 65         /// While
5230: 20 63 6f 6d 70 69 6c 69 6e 67 20 61 20 73 69 6e   compiling a sin
5240: 67 6c 65 20 53 51 4c 20 71 75 65 72 79 2c 20 74  gle SQL query, t
5250: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6d  he SQLite core m
5260: 69 67 68 74 20 63 61 6c 6c 20 0d 0a 20 20 20 20  ight call ..    
5270: 20 20 20 20 2f 2f 2f 20 78 42 65 73 74 49 6e 64      /// xBestInd
5280: 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ex multiple time
5290: 73 20 77 69 74 68 20 64 69 66 66 65 72 65 6e 74  s with different
52a0: 20 73 65 74 74 69 6e 67 73 20 69 6e 20 73 71 6c   settings in sql
52b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2e  ite3_index_info.
52c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
52d0: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 69  e SQLite core wi
52e0: 6c 6c 20 74 68 65 6e 20 73 65 6c 65 63 74 20 74  ll then select t
52f0: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74  he combination t
5300: 68 61 74 20 61 70 70 65 61 72 73 20 74 6f 20 0d  hat appears to .
5310: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 67 69 76  .        /// giv
5320: 65 20 74 68 65 20 62 65 73 74 20 70 65 72 66 6f  e the best perfo
5330: 72 6d 61 6e 63 65 2e 0d 0a 20 20 20 20 20 20 20  rmance...       
5340: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
5350: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
5360: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 42 65  ..        /// Be
5370: 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
5380: 73 20 6d 65 74 68 6f 64 2c 20 74 68 65 20 53 51  s method, the SQ
5390: 4c 69 74 65 20 63 6f 72 65 20 69 6e 69 74 69 61  Lite core initia
53a0: 6c 69 7a 65 73 20 61 6e 20 69 6e 73 74 61 6e 63  lizes an instanc
53b0: 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e ..        /// 
53c0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
53d0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
53e0: 75 72 65 20 77 69 74 68 20 69 6e 66 6f 72 6d 61  ure with informa
53f0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 0d 0a  tion about the..
5400: 20 20 20 20 20 20 20 20 2f 2f 2f 20 71 75 65 72          /// quer
5410: 79 20 74 68 61 74 20 69 74 20 69 73 20 63 75 72  y that it is cur
5420: 72 65 6e 74 6c 79 20 74 72 79 69 6e 67 20 74 6f  rently trying to
5430: 20 70 72 6f 63 65 73 73 2e 20 54 68 69 73 20 69   process. This i
5440: 6e 66 6f 72 6d 61 74 69 6f 6e 20 0d 0a 20 20 20  nformation ..   
5450: 20 20 20 20 20 2f 2f 2f 20 64 65 72 69 76 65 73       /// derives
5460: 20 6d 61 69 6e 6c 79 20 66 72 6f 6d 20 74 68 65   mainly from the
5470: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e   WHERE clause an
5480: 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  d ORDER BY or GR
5490: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 0d  OUP BY clauses .
54a0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6f 66 20  .        /// of 
54b0: 74 68 65 20 71 75 65 72 79 2c 20 62 75 74 20 61  the query, but a
54c0: 6c 73 6f 20 66 72 6f 6d 20 61 6e 79 20 4f 4e 20  lso from any ON 
54d0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
54e0: 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
54f0: 20 61 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   a ..        ///
5500: 20 6a 6f 69 6e 2e 20 54 68 65 20 69 6e 66 6f 72   join. The infor
5510: 6d 61 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  mation that the 
5520: 53 51 4c 69 74 65 20 63 6f 72 65 20 70 72 6f 76  SQLite core prov
5530: 69 64 65 73 20 74 6f 20 74 68 65 20 78 42 65 73  ides to the xBes
5540: 74 49 6e 64 65 78 20 0d 0a 20 20 20 20 20 20 20  tIndex ..       
5550: 20 2f 2f 2f 20 6d 65 74 68 6f 64 20 69 73 20 68   /// method is h
5560: 65 6c 64 20 69 6e 20 74 68 65 20 70 61 72 74 20  eld in the part 
5570: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
5580: 20 74 68 61 74 20 69 73 20 6d 61 72 6b 65 64 20   that is marked 
5590: 61 73 20 22 49 6e 70 75 74 73 22 2e 20 0d 0a 20  as "Inputs". .. 
55a0: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 22         /// The "
55b0: 4f 75 74 70 75 74 73 22 20 73 65 63 74 69 6f 6e  Outputs" section
55c0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
55d0: 74 6f 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20  to zero...      
55e0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
55f0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
5600: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
5610: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
5620: 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  n the sqlite3_in
5630: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
5640: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 0d  re is ephemeral.
5650: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 6e 64  .        /// and
5660: 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74   may be overwrit
5670: 74 65 6e 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ten or deallocat
5680: 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  ed as soon as th
5690: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
56a0: 68 6f 64 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  hod..        ///
56b0: 20 72 65 74 75 72 6e 73 2e 20 20 49 66 20 74 68   returns.  If th
56c0: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
56d0: 68 6f 64 20 6e 65 65 64 73 20 74 6f 20 72 65 6d  hod needs to rem
56e0: 65 6d 62 65 72 20 61 6e 79 20 70 61 72 74 20 6f  ember any part o
56f0: 66 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f  f the..        /
5700: 2f 2f 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  // sqlite3_index
5710: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2c  _info structure,
5720: 20 69 74 20 73 68 6f 75 6c 64 20 6d 61 6b 65 20   it should make 
5730: 61 20 63 6f 70 79 2e 20 20 43 61 72 65 20 6d 75  a copy.  Care mu
5740: 73 74 20 62 65 0d 0a 20 20 20 20 20 20 20 20 2f  st be..        /
5750: 2f 2f 20 74 61 6b 65 20 74 6f 20 73 74 6f 72 65  // take to store
5760: 20 74 68 65 20 63 6f 70 79 20 69 6e 20 61 20 70   the copy in a p
5770: 6c 61 63 65 20 77 68 65 72 65 20 69 74 20 77 69  lace where it wi
5780: 6c 6c 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65  ll be deallocate
5790: 64 2c 20 73 75 63 68 0d 0a 20 20 20 20 20 20 20  d, such..       
57a0: 20 2f 2f 2f 20 61 73 20 69 6e 20 74 68 65 20 69   /// as in the i
57b0: 64 78 53 74 72 20 66 69 65 6c 64 20 77 69 74 68  dxStr field with
57c0: 20 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74   needToFreeIdxSt
57d0: 72 20 73 65 74 20 74 6f 20 31 2e 0d 0a 20 20 20  r set to 1...   
57e0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
57f0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
5800: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
5810: 2f 20 4e 6f 74 65 20 74 68 61 74 20 78 42 65 73  / Note that xBes
5820: 74 49 6e 64 65 78 20 77 69 6c 6c 20 61 6c 77 61  tIndex will alwa
5830: 79 73 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  ys be called bef
5840: 6f 72 65 20 78 46 69 6c 74 65 72 2c 20 73 69 6e  ore xFilter, sin
5850: 63 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ce..        /// 
5860: 74 68 65 20 69 64 78 4e 75 6d 20 61 6e 64 20 69  the idxNum and i
5870: 64 78 53 74 72 20 6f 75 74 70 75 74 73 20 66 72  dxStr outputs fr
5880: 6f 6d 20 78 42 65 73 74 49 6e 64 65 78 20 61 72  om xBestIndex ar
5890: 65 20 72 65 71 75 69 72 65 64 20 69 6e 70 75 74  e required input
58a0: 73 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 2f 2f  s to..        //
58b0: 2f 20 78 46 69 6c 74 65 72 2e 20 20 48 6f 77 65  / xFilter.  Howe
58c0: 76 65 72 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ver, there is no
58d0: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
58e0: 78 46 69 6c 74 65 72 20 77 69 6c 6c 20 62 65 20  xFilter will be 
58f0: 63 61 6c 6c 65 64 0d 0a 20 20 20 20 20 20 20 20  called..        
5900: 2f 2f 2f 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20  /// following a 
5910: 73 75 63 63 65 73 73 66 75 6c 20 78 42 65 73 74  successful xBest
5920: 49 6e 64 65 78 2e 20 20 0d 0a 20 20 20 20 20 20  Index.  ..      
5930: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
5940: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
5950: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
5960: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
5970: 74 68 6f 64 20 69 73 20 72 65 71 75 69 72 65 64  thod is required
5980: 20 66 6f 72 20 65 76 65 72 79 20 76 69 72 74 75   for every virtu
5990: 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65  al table impleme
59a0: 6e 74 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  ntation...      
59b0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
59c0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
59d0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
59e0: 68 65 20 6d 61 69 6e 20 74 68 69 6e 67 20 74 68  he main thing th
59f0: 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  at the SQLite co
5a00: 72 65 20 69 73 20 74 72 79 69 6e 67 20 74 6f 20  re is trying to 
5a10: 63 6f 6d 6d 75 6e 69 63 61 74 65 20 74 6f 20 0d  communicate to .
5a20: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65  .        /// the
5a30: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
5a40: 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
5a50: 73 20 74 68 61 74 20 61 72 65 20 61 76 61 69 6c  s that are avail
5a60: 61 62 6c 65 20 74 6f 20 6c 69 6d 69 74 20 0d 0a  able to limit ..
5a70: 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20          /// the 
5a80: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
5a90: 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73  hat need to be s
5aa0: 65 61 72 63 68 65 64 2e 20 54 68 65 20 61 43 6f  earched. The aCo
5ab0: 6e 73 74 72 61 69 6e 74 5b 5d 20 61 72 72 61 79  nstraint[] array
5ac0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 63   ..        /// c
5ad0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 65 6e 74 72  ontains one entr
5ae0: 79 20 66 6f 72 20 65 61 63 68 20 63 6f 6e 73 74  y for each const
5af0: 72 61 69 6e 74 2e 20 54 68 65 72 65 20 77 69 6c  raint. There wil
5b00: 6c 20 62 65 20 65 78 61 63 74 6c 79 20 0d 0a 20  l be exactly .. 
5b10: 20 20 20 20 20 20 20 2f 2f 2f 20 6e 43 6f 6e 73         /// nCons
5b20: 74 72 61 69 6e 74 20 65 6e 74 72 69 65 73 20 69  traint entries i
5b30: 6e 20 74 68 61 74 20 61 72 72 61 79 2e 0d 0a 20  n that array... 
5b40: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
5b50: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
5b60: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
5b70: 2f 2f 2f 20 45 61 63 68 20 63 6f 6e 73 74 72 61  /// Each constra
5b80: 69 6e 74 20 77 69 6c 6c 20 63 6f 72 72 65 73 70  int will corresp
5b90: 6f 6e 64 20 74 6f 20 61 20 74 65 72 6d 20 69 6e  ond to a term in
5ba0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5bb0: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6f  e..        /// o
5bc0: 72 20 69 6e 20 61 20 55 53 49 4e 47 20 6f 72 20  r in a USING or 
5bd0: 4f 4e 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  ON clause that i
5be0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0d 0a 20  s of the form.. 
5bf0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
5c00: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
5c10: 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20  <para><code>..  
5c20: 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 63        ///      c
5c30: 6f 6c 75 6d 6e 20 20 4f 50 20 20 45 58 50 52 0d  olumn  OP  EXPR.
5c40: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63  .        /// </c
5c50: 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  ode></para>..   
5c60: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
5c70: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 57 68 65  .        /// Whe
5c80: 72 65 20 22 63 6f 6c 75 6d 6e 22 20 69 73 20 61  re "column" is a
5c90: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 76   column in the v
5ca0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 4f 50  irtual table, OP
5cb0: 20 69 73 20 61 6e 20 6f 70 65 72 61 74 6f 72 20   is an operator 
5cc0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6c 69  ..        /// li
5cd0: 6b 65 20 22 3d 22 20 6f 72 20 22 26 6c 74 3b 22  ke "=" or "&lt;"
5ce0: 2c 20 61 6e 64 20 45 58 50 52 20 69 73 20 61 6e  , and EXPR is an
5cf0: 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
5d00: 73 73 69 6f 6e 2e 20 53 6f 2c 20 66 6f 72 20 65  ssion. So, for e
5d10: 78 61 6d 70 6c 65 2c 0d 0a 20 20 20 20 20 20 20  xample,..       
5d20: 20 2f 2f 2f 20 69 66 20 74 68 65 20 57 48 45 52   /// if the WHER
5d30: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
5d40: 65 64 20 61 20 74 65 72 6d 20 6c 69 6b 65 20 74  ed a term like t
5d50: 68 69 73 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  his:..        //
5d60: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
5d70: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f     /// <para><co
5d80: 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  de>..        ///
5d90: 20 20 20 20 20 20 61 20 3d 20 35 0d 0a 20 20 20        a = 5..   
5da0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e       /// </code>
5db0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
5dc0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
5dd0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 6e 20 6f 6e       /// Then on
5de0: 65 20 6f 66 20 74 68 65 20 63 6f 6e 73 74 72 61  e of the constra
5df0: 69 6e 74 73 20 77 6f 75 6c 64 20 62 65 20 6f 6e  ints would be on
5e00: 20 74 68 65 20 22 61 22 20 63 6f 6c 75 6d 6e 20   the "a" column 
5e10: 77 69 74 68 20 0d 0a 20 20 20 20 20 20 20 20 2f  with ..        /
5e20: 2f 2f 20 6f 70 65 72 61 74 6f 72 20 22 3d 22 20  // operator "=" 
5e30: 61 6e 64 20 61 6e 20 65 78 70 72 65 73 73 69 6f  and an expressio
5e40: 6e 20 6f 66 20 22 35 22 2e 20 43 6f 6e 73 74 72  n of "5". Constr
5e50: 61 69 6e 74 73 20 6e 65 65 64 20 6e 6f 74 20 68  aints need not h
5e60: 61 76 65 20 61 0d 0a 20 20 20 20 20 20 20 20 2f  ave a..        /
5e70: 2f 2f 20 6c 69 74 65 72 61 6c 20 72 65 70 72 65  // literal repre
5e80: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
5e90: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 54   WHERE clause. T
5ea0: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5eb0: 65 72 20 6d 69 67 68 74 0d 0a 20 20 20 20 20 20  er might..      
5ec0: 20 20 2f 2f 2f 20 6d 61 6b 65 20 74 72 61 6e 73    /// make trans
5ed0: 66 6f 72 6d 61 74 69 6f 6e 73 20 74 6f 20 74 68  formations to th
5ee0: 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e ..        /// 
5ef0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
5f00: 6f 72 64 65 72 20 74 6f 20 65 78 74 72 61 63 74  order to extract
5f10: 20 61 73 20 6d 61 6e 79 20 63 6f 6e 73 74 72 61   as many constra
5f20: 69 6e 74 73 20 0d 0a 20 20 20 20 20 20 20 20 2f  ints ..        /
5f30: 2f 2f 20 61 73 20 69 74 20 63 61 6e 2e 20 53 6f  // as it can. So
5f40: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
5f50: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
5f60: 73 65 20 63 6f 6e 74 61 69 6e 65 64 20 73 6f 6d  se contained som
5f70: 65 74 68 69 6e 67 20 0d 0a 20 20 20 20 20 20 20  ething ..       
5f80: 20 2f 2f 2f 20 6c 69 6b 65 20 74 68 69 73 3a 0d   /// like this:.
5f90: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
5fa0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
5fb0: 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a  / <para><code>..
5fc0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20          ///     
5fd0: 20 78 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e   x BETWEEN 10 AN
5fe0: 44 20 31 30 30 20 41 4e 44 20 39 39 39 26 67 74  D 100 AND 999&gt
5ff0: 3b 79 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ;y..        /// 
6000: 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a  </code></para>..
6010: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
6020: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
6030: 54 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  The query optimi
6040: 7a 65 72 20 6d 69 67 68 74 20 74 72 61 6e 73 6c  zer might transl
6050: 61 74 65 20 74 68 69 73 20 69 6e 74 6f 20 74 68  ate this into th
6060: 72 65 65 20 73 65 70 61 72 61 74 65 20 63 6f 6e  ree separate con
6070: 73 74 72 61 69 6e 74 73 3a 0d 0a 20 20 20 20 20  straints:..     
6080: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
6090: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
60a0: 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20  a><code>..      
60b0: 20 20 2f 2f 2f 20 20 20 20 20 20 78 20 26 67 74    ///      x &gt
60c0: 3b 3d 20 31 30 0d 0a 20 20 20 20 20 20 20 20 2f  ;= 10..        /
60d0: 2f 2f 20 20 20 20 20 20 78 20 26 6c 74 3b 3d 20  //      x &lt;= 
60e0: 31 30 30 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  100..        ///
60f0: 20 20 20 20 20 20 79 20 26 6c 74 3b 20 39 39 39        y &lt; 999
6100: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
6110: 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20  code></para>..  
6120: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
6130: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 46 6f  ..        /// Fo
6140: 72 20 65 61 63 68 20 63 6f 6e 73 74 72 61 69 6e  r each constrain
6150: 74 2c 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69  t, the aConstrai
6160: 6e 74 5b 5d 2e 69 43 6f 6c 75 6d 6e 20 66 69 65  nt[].iColumn fie
6170: 6c 64 20 69 6e 64 69 63 61 74 65 73 20 77 68 69  ld indicates whi
6180: 63 68 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ch ..        ///
6190: 20 63 6f 6c 75 6d 6e 20 61 70 70 65 61 72 73 20   column appears 
61a0: 6f 6e 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  on the left-hand
61b0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6e   side of the con
61c0: 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20  straint...      
61d0: 20 20 2f 2f 2f 20 54 68 65 20 66 69 72 73 74 20    /// The first 
61e0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 69  column of the vi
61f0: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 63  rtual table is c
6200: 6f 6c 75 6d 6e 20 30 2e 20 0d 0a 20 20 20 20 20  olumn 0. ..     
6210: 20 20 20 2f 2f 2f 20 54 68 65 20 72 6f 77 69 64     /// The rowid
6220: 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
6230: 74 61 62 6c 65 20 69 73 20 63 6f 6c 75 6d 6e 20  table is column 
6240: 2d 31 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  -1. ..        //
6250: 2f 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e  / The aConstrain
6260: 74 5b 5d 2e 6f 70 20 66 69 65 6c 64 20 69 6e 64  t[].op field ind
6270: 69 63 61 74 65 73 20 77 68 69 63 68 20 6f 70 65  icates which ope
6280: 72 61 74 6f 72 20 69 73 20 75 73 65 64 2e 20 0d  rator is used. .
6290: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
62a0: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
62b0: 4e 53 54 52 41 49 4e 54 5f 2a 20 63 6f 6e 73 74  NSTRAINT_* const
62c0: 61 6e 74 73 20 6d 61 70 20 69 6e 74 65 67 65 72  ants map integer
62d0: 20 63 6f 6e 73 74 61 6e 74 73 20 0d 0a 20 20 20   constants ..   
62e0: 20 20 20 20 20 2f 2f 2f 20 69 6e 74 6f 20 6f 70       /// into op
62f0: 65 72 61 74 6f 72 20 76 61 6c 75 65 73 2e 0d 0a  erator values...
6300: 20 20 20 20 20 20 20 20 2f 2f 2f 20 43 6f 6c 75          /// Colu
6310: 6d 6e 73 20 6f 63 63 75 72 20 69 6e 20 74 68 65  mns occur in the
6320: 20 6f 72 64 65 72 20 74 68 65 79 20 77 65 72 65   order they were
6330: 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20   defined by the 
6340: 63 61 6c 6c 20 74 6f 0d 0a 20 20 20 20 20 20 20  call to..       
6350: 20 2f 2f 2f 20 73 71 6c 69 74 65 33 5f 64 65 63   /// sqlite3_dec
6360: 6c 61 72 65 5f 76 74 61 62 28 29 20 69 6e 20 74  lare_vtab() in t
6370: 68 65 20 78 43 72 65 61 74 65 20 6f 72 20 78 43  he xCreate or xC
6380: 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0d 0a  onnect method...
6390: 20 20 20 20 20 20 20 20 2f 2f 2f 20 48 69 64 64          /// Hidd
63a0: 65 6e 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63  en columns are c
63b0: 6f 75 6e 74 65 64 20 77 68 65 6e 20 64 65 74 65  ounted when dete
63c0: 72 6d 69 6e 69 6e 67 20 74 68 65 20 63 6f 6c 75  rmining the colu
63d0: 6d 6e 20 69 6e 64 65 78 2e 0d 0a 20 20 20 20 20  mn index...     
63e0: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
63f0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
6400: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
6410: 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  The aConstraint[
6420: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
6430: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
6440: 75 74 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  ut all constrain
6450: 74 73 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ts ..        ///
6460: 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20 74   that apply to t
6470: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
6480: 2e 20 42 75 74 20 73 6f 6d 65 20 6f 66 20 74 68  . But some of th
6490: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6d 69  e constraints mi
64a0: 67 68 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ght..        ///
64b0: 20 6e 6f 74 20 62 65 20 75 73 61 62 6c 65 20 62   not be usable b
64c0: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
64d0: 79 20 74 61 62 6c 65 73 20 61 72 65 20 6f 72 64  y tables are ord
64e0: 65 72 65 64 20 69 6e 20 61 20 6a 6f 69 6e 2e 20  ered in a join. 
64f0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
6500: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
6510: 68 6f 64 20 6d 75 73 74 20 74 68 65 72 65 66 6f  hod must therefo
6520: 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
6530: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 0d 0a 20   constraints .. 
6540: 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 61 74 20         /// that 
6550: 68 61 76 65 20 61 6e 20 61 43 6f 6e 73 74 72 61  have an aConstra
6560: 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66 6c 61  int[].usable fla
6570: 67 20 77 68 69 63 68 20 69 73 20 74 72 75 65 2e  g which is true.
6580: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
6590: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
65a0: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
65b0: 20 20 20 2f 2f 2f 20 49 6e 20 61 64 64 69 74 69     /// In additi
65c0: 6f 6e 20 74 6f 20 57 48 45 52 45 20 63 6c 61 75  on to WHERE clau
65d0: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  se constraints, 
65e0: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
65f0: 61 6c 73 6f 20 0d 0a 20 20 20 20 20 20 20 20 2f  also ..        /
6600: 2f 2f 20 74 65 6c 6c 73 20 74 68 65 20 78 42 65  // tells the xBe
6610: 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 61  stIndex method a
6620: 62 6f 75 74 20 74 68 65 20 4f 52 44 45 52 20 42  bout the ORDER B
6630: 59 20 63 6c 61 75 73 65 2e 20 0d 0a 20 20 20 20  Y clause. ..    
6640: 20 20 20 20 2f 2f 2f 20 28 49 6e 20 61 6e 20 61      /// (In an a
6650: 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2c 20  ggregate query, 
6660: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
6670: 6d 69 67 68 74 20 70 75 74 20 69 6e 20 47 52 4f  might put in GRO
6680: 55 50 20 42 59 20 63 6c 61 75 73 65 20 0d 0a 20  UP BY clause .. 
6690: 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 66 6f 72         /// infor
66a0: 6d 61 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65 20  mation in place 
66b0: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
66c0: 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
66d0: 6f 6e 2c 20 62 75 74 20 74 68 69 73 20 66 61 63  on, but this fac
66e0: 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73  t..        /// s
66f0: 68 6f 75 6c 64 20 6e 6f 74 20 6d 61 6b 65 20 61  hould not make a
6700: 6e 79 20 64 69 66 66 65 72 65 6e 63 65 20 74 6f  ny difference to
6710: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
6720: 6d 65 74 68 6f 64 2e 29 20 0d 0a 20 20 20 20 20  method.) ..     
6730: 20 20 20 2f 2f 2f 20 49 66 20 61 6c 6c 20 74 65     /// If all te
6740: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
6750: 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 63   BY clause are c
6760: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 69  olumns in the vi
6770: 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 0d 0a 20  rtual table, .. 
6780: 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 6e 20         /// then 
6790: 6e 4f 72 64 65 72 42 79 20 77 69 6c 6c 20 62 65  nOrderBy will be
67a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
67b0: 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
67c0: 52 20 42 59 20 63 6c 61 75 73 65 20 0d 0a 20 20  R BY clause ..  
67d0: 20 20 20 20 20 20 2f 2f 2f 20 61 6e 64 20 74 68        /// and th
67e0: 65 20 61 4f 72 64 65 72 42 79 5b 5d 20 61 72 72  e aOrderBy[] arr
67f0: 61 79 20 77 69 6c 6c 20 69 64 65 6e 74 69 66 79  ay will identify
6800: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20   the column for 
6810: 65 61 63 68 20 74 65 72 6d 20 0d 0a 20 20 20 20  each term ..    
6820: 20 20 20 20 2f 2f 2f 20 69 6e 20 74 68 65 20 6f      /// in the o
6830: 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 61  rder by clause a
6840: 6e 64 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  nd whether or no
6850: 74 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73  t that column is
6860: 20 41 53 43 20 6f 72 20 44 45 53 43 2e 0d 0a 20   ASC or DESC... 
6870: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
6880: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
6890: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
68a0: 2f 2f 2f 20 47 69 76 65 6e 20 61 6c 6c 20 6f 66  /// Given all of
68b0: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
68c0: 20 61 62 6f 76 65 2c 20 74 68 65 20 6a 6f 62 20   above, the job 
68d0: 6f 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  of the xBestInde
68e0: 78 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  x ..        /// 
68f0: 6d 65 74 68 6f 64 20 69 74 20 74 6f 20 66 69 67  method it to fig
6900: 75 72 65 20 6f 75 74 20 74 68 65 20 62 65 73 74  ure out the best
6910: 20 77 61 79 20 74 6f 20 73 65 61 72 63 68 20 74   way to search t
6920: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
6930: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
6940: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
6950: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
6960: 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 42 65 73      /// The xBes
6970: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 66 69  tIndex method fi
6980: 6c 6c 73 20 74 68 65 20 69 64 78 4e 75 6d 20 61  lls the idxNum a
6990: 6e 64 20 69 64 78 53 74 72 20 66 69 65 6c 64 73  nd idxStr fields
69a0: 20 77 69 74 68 20 0d 0a 20 20 20 20 20 20 20 20   with ..        
69b0: 2f 2f 2f 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  /// information 
69c0: 74 68 61 74 20 63 6f 6d 6d 75 6e 69 63 61 74 65  that communicate
69d0: 73 20 61 6e 20 69 6e 64 65 78 69 6e 67 20 73 74  s an indexing st
69e0: 72 61 74 65 67 79 20 74 6f 20 74 68 65 20 78 46  rategy to the xF
69f0: 69 6c 74 65 72 20 0d 0a 20 20 20 20 20 20 20 20  ilter ..        
6a00: 2f 2f 2f 20 6d 65 74 68 6f 64 2e 20 54 68 65 20  /// method. The 
6a10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 69  information in i
6a20: 64 78 4e 75 6d 20 61 6e 64 20 69 64 78 53 74 72  dxNum and idxStr
6a30: 20 69 73 20 61 72 62 69 74 72 61 72 79 20 61 73   is arbitrary as
6a40: 20 66 61 72 20 0d 0a 20 20 20 20 20 20 20 20 2f   far ..        /
6a50: 2f 2f 20 61 73 20 74 68 65 20 53 51 4c 69 74 65  // as the SQLite
6a60: 20 63 6f 72 65 20 69 73 20 63 6f 6e 63 65 72 6e   core is concern
6a70: 65 64 2e 20 54 68 65 20 53 51 4c 69 74 65 20 63  ed. The SQLite c
6a80: 6f 72 65 20 6a 75 73 74 20 63 6f 70 69 65 73 20  ore just copies 
6a90: 74 68 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  the ..        //
6aa0: 2f 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  / information th
6ab0: 72 6f 75 67 68 20 74 6f 20 74 68 65 20 78 46 69  rough to the xFi
6ac0: 6c 74 65 72 20 6d 65 74 68 6f 64 2e 20 41 6e 79  lter method. Any
6ad0: 20 64 65 73 69 72 65 64 20 6d 65 61 6e 69 6e 67   desired meaning
6ae0: 20 63 61 6e 20 0d 0a 20 20 20 20 20 20 20 20 2f   can ..        /
6af0: 2f 2f 20 62 65 20 61 73 73 69 67 6e 65 64 20 74  // be assigned t
6b00: 6f 20 69 64 78 4e 75 6d 20 61 6e 64 20 69 64 78  o idxNum and idx
6b10: 53 74 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 78  Str as long as x
6b20: 42 65 73 74 49 6e 64 65 78 20 61 6e 64 20 78 46  BestIndex and xF
6b30: 69 6c 74 65 72 20 0d 0a 20 20 20 20 20 20 20 20  ilter ..        
6b40: 2f 2f 2f 20 61 67 72 65 65 20 6f 6e 20 77 68 61  /// agree on wha
6b50: 74 20 74 68 61 74 20 6d 65 61 6e 69 6e 67 20 69  t that meaning i
6b60: 73 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  s...        /// 
6b70: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
6b80: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
6b90: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 69 64 78       /// The idx
6ba0: 53 74 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65  Str value may be
6bb0: 20 61 20 73 74 72 69 6e 67 20 6f 62 74 61 69 6e   a string obtain
6bc0: 65 64 20 66 72 6f 6d 20 61 6e 20 53 51 4c 69 74  ed from an SQLit
6bd0: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d  e..        /// m
6be0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
6bf0: 20 66 75 6e 63 74 69 6f 6e 20 73 75 63 68 20 61   function such a
6c00: 73 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  s sqlite3_mprint
6c10: 66 28 29 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f  f(). ..        /
6c20: 2f 2f 20 49 66 20 74 68 69 73 20 69 73 20 74 68  // If this is th
6c30: 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
6c40: 20 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74   needToFreeIdxSt
6c50: 72 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 73  r flag must be s
6c60: 65 74 20 74 6f 20 0d 0a 20 20 20 20 20 20 20 20  et to ..        
6c70: 2f 2f 2f 20 74 72 75 65 20 73 6f 20 74 68 61 74  /// true so that
6c80: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
6c90: 20 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f 20 63 61   will know to ca
6ca0: 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ll sqlite3_free(
6cb0: 29 20 6f 6e 20 0d 0a 20 20 20 20 20 20 20 20 2f  ) on ..        /
6cc0: 2f 2f 20 74 68 61 74 20 73 74 72 69 6e 67 20 77  // that string w
6cd0: 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73  hen it has finis
6ce0: 68 65 64 20 77 69 74 68 20 69 74 2c 20 61 6e 64  hed with it, and
6cf0: 20 74 68 75 73 20 61 76 6f 69 64 20 61 20 6d 65   thus avoid a me
6d00: 6d 6f 72 79 20 6c 65 61 6b 2e 0d 0a 20 20 20 20  mory leak...    
6d10: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
6d20: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
6d30: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
6d40: 20 49 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   If the virtual 
6d50: 74 61 62 6c 65 20 77 69 6c 6c 20 6f 75 74 70 75  table will outpu
6d60: 74 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72  t rows in the or
6d70: 64 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79  der specified by
6d80: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74   ..        /// t
6d90: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
6da0: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 64  se, then the ord
6db0: 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 66 6c 61  erByConsumed fla
6dc0: 67 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  g may be set to 
6dd0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 72  ..        /// tr
6de0: 75 65 2e 20 49 66 20 74 68 65 20 6f 75 74 70 75  ue. If the outpu
6df0: 74 20 69 73 20 6e 6f 74 20 61 75 74 6f 6d 61 74  t is not automat
6e00: 69 63 61 6c 6c 79 20 69 6e 20 74 68 65 20 63 6f  ically in the co
6e10: 72 72 65 63 74 20 6f 72 64 65 72 20 0d 0a 20 20  rrect order ..  
6e20: 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 6e 20 6f        /// then o
6e30: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 6d  rderByConsumed m
6e40: 75 73 74 20 62 65 20 6c 65 66 74 20 69 6e 20 69  ust be left in i
6e50: 74 73 20 64 65 66 61 75 6c 74 20 66 61 6c 73 65  ts default false
6e60: 20 73 65 74 74 69 6e 67 2e 20 0d 0a 20 20 20 20   setting. ..    
6e70: 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 77 69 6c      /// This wil
6e80: 6c 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68  l indicate to th
6e90: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 74 68  e SQLite core th
6ea0: 61 74 20 69 74 20 77 69 6c 6c 20 6e 65 65 64 20  at it will need 
6eb0: 74 6f 20 64 6f 20 61 20 0d 0a 20 20 20 20 20 20  to do a ..      
6ec0: 20 20 2f 2f 2f 20 73 65 70 61 72 61 74 65 20 73    /// separate s
6ed0: 6f 72 74 69 6e 67 20 70 61 73 73 20 6f 76 65 72  orting pass over
6ee0: 20 74 68 65 20 64 61 74 61 20 61 66 74 65 72 20   the data after 
6ef0: 69 74 20 63 6f 6d 65 73 20 6f 75 74 20 6f 66 20  it comes out of 
6f00: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
6f10: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
6f20: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
6f30: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
6f40: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 65 73 74       /// The est
6f50: 69 6d 61 74 65 64 43 6f 73 74 20 66 69 65 6c 64  imatedCost field
6f60: 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 74   should be set t
6f70: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
6f80: 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20 20 20 20  number..        
6f90: 2f 2f 2f 20 6f 66 20 64 69 73 6b 20 61 63 63 65  /// of disk acce
6fa0: 73 73 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65  ss operations re
6fb0: 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74  quired to execut
6fc0: 65 20 74 68 69 73 20 71 75 65 72 79 20 61 67 61  e this query aga
6fd0: 69 6e 73 74 20 0d 0a 20 20 20 20 20 20 20 20 2f  inst ..        /
6fe0: 2f 2f 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  // the virtual t
6ff0: 61 62 6c 65 2e 20 54 68 65 20 53 51 4c 69 74 65  able. The SQLite
7000: 20 63 6f 72 65 20 77 69 6c 6c 20 6f 66 74 65 6e   core will often
7010: 20 63 61 6c 6c 20 78 42 65 73 74 49 6e 64 65 78   call xBestIndex
7020: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d   ..        /// m
7030: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 77 69  ultiple times wi
7040: 74 68 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6e  th different con
7050: 73 74 72 61 69 6e 74 73 2c 20 6f 62 74 61 69 6e  straints, obtain
7060: 20 6d 75 6c 74 69 70 6c 65 20 63 6f 73 74 0d 0a   multiple cost..
7070: 20 20 20 20 20 20 20 20 2f 2f 2f 20 65 73 74 69          /// esti
7080: 6d 61 74 65 73 2c 20 74 68 65 6e 20 63 68 6f 6f  mates, then choo
7090: 73 65 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  se the query pla
70a0: 6e 20 74 68 61 74 20 67 69 76 65 73 20 74 68 65  n that gives the
70b0: 20 6c 6f 77 65 73 74 20 65 73 74 69 6d 61 74 65   lowest estimate
70c0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
70d0: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
70e0: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
70f0: 20 20 20 20 2f 2f 2f 20 49 66 20 74 68 65 20 63      /// If the c
7100: 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f  urrent version o
7110: 66 20 53 51 4c 69 74 65 20 69 73 20 33 2e 38 2e  f SQLite is 3.8.
7120: 32 20 6f 72 20 67 72 65 61 74 65 72 2c 20 74 68  2 or greater, th
7130: 65 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 0d  e estimatedRows.
7140: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 66 69 65  .        /// fie
7150: 6c 64 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  ld may be set to
7160: 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
7170: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
7180: 77 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ws returned by t
7190: 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  he..        /// 
71a0: 70 72 6f 70 6f 73 65 64 20 71 75 65 72 79 20 70  proposed query p
71b0: 6c 61 6e 2e 20 49 66 20 74 68 69 73 20 76 61 6c  lan. If this val
71c0: 75 65 20 69 73 20 6e 6f 74 20 65 78 70 6c 69 63  ue is not explic
71d0: 69 74 6c 79 20 73 65 74 2c 20 74 68 65 20 64 65  itly set, the de
71e0: 66 61 75 6c 74 20 0d 0a 20 20 20 20 20 20 20 20  fault ..        
71f0: 2f 2f 2f 20 65 73 74 69 6d 61 74 65 20 6f 66 20  /// estimate of 
7200: 32 35 20 72 6f 77 73 20 69 73 20 75 73 65 64 2e  25 rows is used.
7210: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
7220: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
7230: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
7240: 20 20 20 2f 2f 2f 20 49 66 20 74 68 65 20 63 75     /// If the cu
7250: 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66  rrent version of
7260: 20 53 51 4c 69 74 65 20 69 73 20 33 2e 39 2e 30   SQLite is 3.9.0
7270: 20 6f 72 20 67 72 65 61 74 65 72 2c 20 74 68 65   or greater, the
7280: 20 69 64 78 46 6c 61 67 73 20 66 69 65 6c 64 0d   idxFlags field.
7290: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d 61 79  .        /// may
72a0: 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
72b0: 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49  E_INDEX_SCAN_UNI
72c0: 51 55 45 20 74 6f 20 69 6e 64 69 63 61 74 65 20  QUE to indicate 
72d0: 74 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c  that the virtual
72e0: 20 74 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20   table..        
72f0: 2f 2f 2f 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  /// will return 
7300: 6f 6e 6c 79 20 7a 65 72 6f 20 6f 72 20 6f 6e 65  only zero or one
7310: 20 72 6f 77 73 20 67 69 76 65 6e 20 74 68 65 20   rows given the 
7320: 69 6e 70 75 74 20 63 6f 6e 73 74 72 61 69 6e 74  input constraint
7330: 73 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 0d 0a  s.  Additional..
7340: 20 20 20 20 20 20 20 20 2f 2f 2f 20 62 69 74 73          /// bits
7350: 20 6f 66 20 74 68 65 20 69 64 78 46 6c 61 67 73   of the idxFlags
7360: 20 66 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20   field might be 
7370: 75 6e 64 65 72 73 74 6f 6f 64 20 69 6e 20 6c 61  understood in la
7380: 74 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ter versions of 
7390: 53 51 4c 69 74 65 2e 0d 0a 20 20 20 20 20 20 20  SQLite...       
73a0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
73b0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
73c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
73d0: 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  e aConstraintUsa
73e0: 67 65 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ge[] array conta
73f0: 69 6e 73 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20  ins one element 
7400: 66 6f 72 20 65 61 63 68 20 6f 66 20 0d 0a 20 20  for each of ..  
7410: 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 6e 43        /// the nC
7420: 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6e 73 74 72  onstraint constr
7430: 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70  aints in the inp
7440: 75 74 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  uts section of t
7450: 68 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  he ..        ///
7460: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7470: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 0d  nfo structure. .
7480: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
7490: 20 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67   aConstraintUsag
74a0: 65 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73 65  e[] array is use
74b0: 64 20 62 79 20 78 42 65 73 74 49 6e 64 65 78 20  d by xBestIndex 
74c0: 74 6f 20 74 65 6c 6c 20 74 68 65 20 0d 0a 20 20  to tell the ..  
74d0: 20 20 20 20 20 20 2f 2f 2f 20 63 6f 72 65 20 68        /// core h
74e0: 6f 77 20 69 74 20 69 73 20 75 73 69 6e 67 20 74  ow it is using t
74f0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d  he constraints..
7500: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
7510: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
7520: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
7530: 20 20 2f 2f 2f 20 54 68 65 20 78 42 65 73 74 49    /// The xBestI
7540: 6e 64 65 78 20 6d 65 74 68 6f 64 20 6d 61 79 20  ndex method may 
7550: 73 65 74 20 61 43 6f 6e 73 74 72 61 69 6e 74 55  set aConstraintU
7560: 73 61 67 65 5b 5d 2e 61 72 67 76 49 6e 64 65 78  sage[].argvIndex
7570: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 65   ..        /// e
7580: 6e 74 72 69 65 73 20 74 6f 20 76 61 6c 75 65 73  ntries to values
7590: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
75a0: 72 6f 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ro. ..        //
75b0: 2f 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 65 6e  / Exactly one en
75c0: 74 72 79 20 73 68 6f 75 6c 64 20 62 65 20 73 65  try should be se
75d0: 74 20 74 6f 20 31 2c 20 61 6e 6f 74 68 65 72 20  t to 1, another 
75e0: 74 6f 20 32 2c 20 61 6e 6f 74 68 65 72 20 74 6f  to 2, another to
75f0: 20 33 2c 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f   3, ..        //
7600: 2f 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 20 75  / and so forth u
7610: 70 20 74 6f 20 61 73 20 6d 61 6e 79 20 6f 72 20  p to as many or 
7620: 61 73 20 66 65 77 20 61 73 20 74 68 65 20 78 42  as few as the xB
7630: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20  estIndex method 
7640: 77 61 6e 74 73 2e 20 0d 0a 20 20 20 20 20 20 20  wants. ..       
7650: 20 2f 2f 2f 20 54 68 65 20 45 58 50 52 20 6f 66   /// The EXPR of
7660: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
7670: 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77  ng constraints w
7680: 69 6c 6c 20 74 68 65 6e 20 62 65 20 70 61 73 73  ill then be pass
7690: 65 64 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ed ..        ///
76a0: 20 69 6e 20 61 73 20 74 68 65 20 61 72 67 76 5b   in as the argv[
76b0: 5d 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  ] parameters to 
76c0: 78 46 69 6c 74 65 72 2e 0d 0a 20 20 20 20 20 20  xFilter...      
76d0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
76e0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
76f0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 46  >..        /// F
7700: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
7710: 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 33  he aConstraint[3
7720: 5d 2e 61 72 67 76 49 6e 64 65 78 20 69 73 20 73  ].argvIndex is s
7730: 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 0d 0a  et to 1, then ..
7740: 20 20 20 20 20 20 20 20 2f 2f 2f 20 77 68 65 6e          /// when
7750: 20 78 46 69 6c 74 65 72 20 69 73 20 63 61 6c 6c   xFilter is call
7760: 65 64 2c 20 74 68 65 20 61 72 67 76 5b 30 5d 20  ed, the argv[0] 
7770: 70 61 73 73 65 64 20 74 6f 20 78 46 69 6c 74 65  passed to xFilte
7780: 72 20 77 69 6c 6c 20 68 61 76 65 20 0d 0a 20 20  r will have ..  
7790: 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 45 58        /// the EX
77a0: 50 52 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  PR value of the 
77b0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 33 5d 20 63  aConstraint[3] c
77c0: 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20  onstraint...    
77d0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
77e0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
77f0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
7800: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65   By default, the
7810: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 64 6f 75   SQLite core dou
7820: 62 6c 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63  ble checks all c
7830: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 0d 0a  onstraints on ..
7840: 20 20 20 20 20 20 20 20 2f 2f 2f 20 65 61 63 68          /// each
7850: 20 72 6f 77 20 6f 66 20 74 68 65 20 76 69 72 74   row of the virt
7860: 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
7870: 74 20 72 65 63 65 69 76 65 73 2e 20 49 66 20 73  t receives. If s
7880: 75 63 68 20 61 20 63 68 65 63 6b 20 0d 0a 20 20  uch a check ..  
7890: 20 20 20 20 20 20 2f 2f 2f 20 69 73 20 72 65 64        /// is red
78a0: 75 6e 64 61 6e 74 2c 20 74 68 65 20 78 42 65 73  undant, the xBes
78b0: 74 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 63  tFilter method c
78c0: 61 6e 20 73 75 70 70 72 65 73 73 20 74 68 61 74  an suppress that
78d0: 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 20 62 79   double-check by
78e0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73   ..        /// s
78f0: 65 74 74 69 6e 67 20 61 43 6f 6e 73 74 72 61 69  etting aConstrai
7900: 6e 74 55 73 61 67 65 5b 5d 2e 6f 6d 69 74 2e 0d  ntUsage[].omit..
7910: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
7920: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
7930: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
7940: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
7950: 20 6e 61 6d 65 3d 22 70 56 74 61 62 22 3e 0d 0a   name="pVtab">..
7960: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
7970: 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74  native pointer t
7980: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74  o the sqlite3_vt
7990: 61 62 20 64 65 72 69 76 65 64 20 73 74 72 75 63  ab derived struc
79a0: 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f  ture...        /
79b0: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
79c0: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
79d0: 6e 61 6d 65 3d 22 70 49 6e 64 65 78 22 3e 0d 0a  name="pIndex">..
79e0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
79f0: 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74  native pointer t
7a00: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  o the sqlite3_in
7a10: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
7a20: 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  re...        ///
7a30: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
7a40: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
7a50: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20  ..        /// A 
7a60: 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20  standard SQLite 
7a70: 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20  return code...  
7a80: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75        /// </retu
7a90: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51  rns>..        SQ
7aa0: 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78 42  LiteErrorCode xB
7ab0: 65 73 74 49 6e 64 65 78 28 0d 0a 20 20 20 20 20  estIndex(..     
7ac0: 20 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 56         IntPtr pV
7ad0: 74 61 62 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tab,..          
7ae0: 20 20 49 6e 74 50 74 72 20 70 49 6e 64 65 78 0d    IntPtr pIndex.
7af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d  .            );.
7b00: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  ...        /////
7b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7b30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7b50: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  //....        //
7b60: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
7b70: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c       /// <para><
7b80: 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f  code>..        /
7b90: 2f 2f 20 20 20 69 6e 74 20 28 2a 78 44 69 73 63  //   int (*xDisc
7ba0: 6f 6e 6e 65 63 74 29 28 73 71 6c 69 74 65 33 5f  onnect)(sqlite3_
7bb0: 76 74 61 62 20 2a 70 56 54 61 62 29 3b 0d 0a 20  vtab *pVTab);.. 
7bc0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64         /// </cod
7bd0: 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  e></para>..     
7be0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
7bf0: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20         /// This 
7c00: 6d 65 74 68 6f 64 20 72 65 6c 65 61 73 65 73 20  method releases 
7c10: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
7c20: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
7c30: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 4f   ..        /// O
7c40: 6e 6c 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nly the sqlite3_
7c50: 76 74 61 62 20 6f 62 6a 65 63 74 20 69 73 20 64  vtab object is d
7c60: 65 73 74 72 6f 79 65 64 2e 0d 0a 20 20 20 20 20  estroyed...     
7c70: 20 20 20 2f 2f 2f 20 54 68 65 20 76 69 72 74 75     /// The virtu
7c80: 61 6c 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  al table is not 
7c90: 64 65 73 74 72 6f 79 65 64 20 61 6e 64 20 61 6e  destroyed and an
7ca0: 79 20 62 61 63 6b 69 6e 67 20 73 74 6f 72 65 20  y backing store 
7cb0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 73  ..        /// as
7cc0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
7cd0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
7ce0: 70 65 72 73 69 73 74 73 2e 20 0d 0a 20 20 20 20  persists. ..    
7cf0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
7d00: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69  .        /// Thi
7d10: 73 20 6d 65 74 68 6f 64 20 75 6e 64 6f 65 73 20  s method undoes 
7d20: 74 68 65 20 77 6f 72 6b 20 6f 66 20 78 43 6f 6e  the work of xCon
7d30: 6e 65 63 74 2e 0d 0a 20 20 20 20 20 20 20 20 2f  nect...        /
7d40: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
7d50: 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68     /// This meth
7d60: 6f 64 20 69 73 20 61 20 64 65 73 74 72 75 63 74  od is a destruct
7d70: 6f 72 20 66 6f 72 20 61 20 63 6f 6e 6e 65 63 74  or for a connect
7d80: 69 6f 6e 20 74 6f 20 74 68 65 20 76 69 72 74 75  ion to the virtu
7d90: 61 6c 20 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20  al table...     
7da0: 20 20 20 2f 2f 2f 20 43 6f 6e 74 72 61 73 74 20     /// Contrast 
7db0: 74 68 69 73 20 6d 65 74 68 6f 64 20 77 69 74 68  this method with
7dc0: 20 78 44 65 73 74 72 6f 79 2e 20 20 54 68 65 20   xDestroy.  The 
7dd0: 78 44 65 73 74 72 6f 79 20 69 73 20 61 20 64 65  xDestroy is a de
7de0: 73 74 72 75 63 74 6f 72 0d 0a 20 20 20 20 20 20  structor..      
7df0: 20 20 2f 2f 2f 20 66 6f 72 20 74 68 65 20 65 6e    /// for the en
7e00: 74 69 72 65 20 76 69 72 74 75 61 6c 20 74 61 62  tire virtual tab
7e10: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  le...        ///
7e20: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
7e30: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
7e40: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 44        /// The xD
7e50: 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64  isconnect method
7e60: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
7e70: 20 65 76 65 72 79 20 76 69 72 74 75 61 6c 20 74   every virtual t
7e80: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
7e90: 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ion,..        //
7ea0: 2f 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61  / though it is a
7eb0: 63 63 65 70 74 61 62 6c 65 20 66 6f 72 20 74 68  cceptable for th
7ec0: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 61 6e  e xDisconnect an
7ed0: 64 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68 6f  d xDestroy metho
7ee0: 64 73 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20  ds to be..      
7ef0: 20 20 2f 2f 2f 20 74 68 65 20 73 61 6d 65 20 66    /// the same f
7f00: 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 61 74 20  unction if that 
7f10: 6d 61 6b 65 73 20 73 65 6e 73 65 20 66 6f 72 20  makes sense for 
7f20: 74 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 76  the particular v
7f30: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a 20  irtual table... 
7f40: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
7f50: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
7f60: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
7f70: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
7f80: 61 6d 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20 20  ame="pVtab">..  
7f90: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61        /// The na
7fa0: 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  tive pointer to 
7fb0: 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62  the sqlite3_vtab
7fc0: 20 64 65 72 69 76 65 64 20 73 74 72 75 63 74 75   derived structu
7fd0: 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  re...        ///
7fe0: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
7ff0: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
8000: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20  ..        /// A 
8010: 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20  standard SQLite 
8020: 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20  return code...  
8030: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75        /// </retu
8040: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51  rns>..        SQ
8050: 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78 44  LiteErrorCode xD
8060: 69 73 63 6f 6e 6e 65 63 74 28 0d 0a 20 20 20 20  isconnect(..    
8070: 20 20 20 20 20 20 20 20 49 6e 74 50 74 72 20 70          IntPtr p
8080: 56 74 61 62 0d 0a 20 20 20 20 20 20 20 20 20 20  Vtab..          
8090: 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20    );....        
80a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
80b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
80c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
80d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
80e0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
80f0: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
8100: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
8110: 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20  ara><code>..    
8120: 20 20 20 20 2f 2f 2f 20 20 20 69 6e 74 20 28 2a      ///   int (*
8130: 78 44 65 73 74 72 6f 79 29 28 73 71 6c 69 74 65  xDestroy)(sqlite
8140: 33 5f 76 74 61 62 20 2a 70 56 54 61 62 29 3b 0d  3_vtab *pVTab);.
8150: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63  .        /// </c
8160: 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  ode></para>..   
8170: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
8180: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69  .        /// Thi
8190: 73 20 6d 65 74 68 6f 64 20 72 65 6c 65 61 73 65  s method release
81a0: 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  s a connection t
81b0: 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  o a virtual tabl
81c0: 65 2c 20 6a 75 73 74 20 6c 69 6b 65 20 0d 0a 20  e, just like .. 
81d0: 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 78         /// the x
81e0: 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74 68 6f  Disconnect metho
81f0: 64 2c 20 61 6e 64 20 69 74 20 61 6c 73 6f 20 64  d, and it also d
8200: 65 73 74 72 6f 79 73 20 74 68 65 20 75 6e 64 65  estroys the unde
8210: 72 6c 79 69 6e 67 20 0d 0a 20 20 20 20 20 20 20  rlying ..       
8220: 20 2f 2f 2f 20 74 61 62 6c 65 20 69 6d 70 6c 65   /// table imple
8230: 6d 65 6e 74 61 74 69 6f 6e 2e 20 54 68 69 73 20  mentation. This 
8240: 6d 65 74 68 6f 64 20 75 6e 64 6f 65 73 20 74 68  method undoes th
8250: 65 20 77 6f 72 6b 20 6f 66 20 78 43 72 65 61 74  e work of xCreat
8260: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
8270: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
8280: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
8290: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 44 69       /// The xDi
82a0: 73 63 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 20  sconnect method 
82b0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
82c0: 65 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  er a database co
82d0: 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nnection..      
82e0: 20 20 2f 2f 2f 20 74 68 61 74 20 75 73 65 73 20    /// that uses 
82f0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
8300: 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65 20 78  is closed. The x
8310: 44 65 73 74 72 6f 79 20 6d 65 74 68 6f 64 20 69  Destroy method i
8320: 73 20 6f 6e 6c 79 20 0d 0a 20 20 20 20 20 20 20  s only ..       
8330: 20 2f 2f 2f 20 63 61 6c 6c 65 64 20 77 68 65 6e   /// called when
8340: 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
8350: 61 74 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75  atement is execu
8360: 74 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  ted against the 
8370: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a  virtual table...
8380: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
8390: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
83a0: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
83b0: 20 2f 2f 2f 20 54 68 65 20 78 44 65 73 74 72 6f   /// The xDestro
83c0: 79 20 6d 65 74 68 6f 64 20 69 73 20 72 65 71 75  y method is requ
83d0: 69 72 65 64 20 66 6f 72 20 65 76 65 72 79 20 76  ired for every v
83e0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70  irtual table imp
83f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 0d 0a 20 20  lementation,..  
8400: 20 20 20 20 20 20 2f 2f 2f 20 74 68 6f 75 67 68        /// though
8410: 20 69 74 20 69 73 20 61 63 63 65 70 74 61 62 6c   it is acceptabl
8420: 65 20 66 6f 72 20 74 68 65 20 78 44 69 73 63 6f  e for the xDisco
8430: 6e 6e 65 63 74 20 61 6e 64 20 78 44 65 73 74 72  nnect and xDestr
8440: 6f 79 20 6d 65 74 68 6f 64 73 20 74 6f 20 62 65  oy methods to be
8450: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
8460: 65 20 73 61 6d 65 20 66 75 6e 63 74 69 6f 6e 20  e same function 
8470: 69 66 20 74 68 61 74 20 6d 61 6b 65 73 20 73 65  if that makes se
8480: 6e 73 65 20 66 6f 72 20 74 68 65 20 70 61 72 74  nse for the part
8490: 69 63 75 6c 61 72 20 76 69 72 74 75 61 6c 20 74  icular virtual t
84a0: 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f  able...        /
84b0: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
84c0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
84d0: 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  y>..        /// 
84e0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74  <param name="pVt
84f0: 61 62 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ab">..        //
8500: 2f 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f 69  / The native poi
8510: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69  nter to the sqli
8520: 74 65 33 5f 76 74 61 62 20 64 65 72 69 76 65 64  te3_vtab derived
8530: 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20   structure...   
8540: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d       /// </param
8550: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
8560: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20  returns>..      
8570: 20 20 2f 2f 2f 20 41 20 73 74 61 6e 64 61 72 64    /// A standard
8580: 20 53 51 4c 69 74 65 20 72 65 74 75 72 6e 20 63   SQLite return c
8590: 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ode...        //
85a0: 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  / </returns>..  
85b0: 20 20 20 20 20 20 53 51 4c 69 74 65 45 72 72 6f        SQLiteErro
85c0: 72 43 6f 64 65 20 78 44 65 73 74 72 6f 79 28 0d  rCode xDestroy(.
85d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  .            Int
85e0: 50 74 72 20 70 56 74 61 62 0d 0a 20 20 20 20 20  Ptr pVtab..     
85f0: 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20         );....   
8600: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
8610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8630: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
8650: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d          /// <sum
8660: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f  mary>..        /
8670: 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d  // <para><code>.
8680: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 69  .        ///   i
8690: 6e 74 20 28 2a 78 4f 70 65 6e 29 28 73 71 6c 69  nt (*xOpen)(sqli
86a0: 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c  te3_vtab *pVTab,
86b0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
86c0: 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29  rsor **ppCursor)
86d0: 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ;..        /// <
86e0: 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20  /code></para>.. 
86f0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
8700: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
8710: 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20  he xOpen method 
8720: 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 75  creates a new cu
8730: 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 61 63  rsor used for ac
8740: 63 65 73 73 69 6e 67 20 28 72 65 61 64 20 61 6e  cessing (read an
8750: 64 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f  d/or..        //
8760: 2f 20 77 72 69 74 69 6e 67 29 20 61 20 76 69 72  / writing) a vir
8770: 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 41 20 73  tual table.  A s
8780: 75 63 63 65 73 73 66 75 6c 20 69 6e 76 6f 63 61  uccessful invoca
8790: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 65 74  tion of this met
87a0: 68 6f 64 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  hod ..        //
87b0: 2f 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20  / will allocate 
87c0: 74 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  the memory for t
87d0: 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  he sqlite3_vtab_
87e0: 63 75 72 73 6f 72 20 28 6f 72 20 61 20 73 75 62  cursor (or a sub
87f0: 63 6c 61 73 73 29 2c 0d 0a 20 20 20 20 20 20 20  class),..       
8800: 20 2f 2f 2f 20 69 6e 69 74 69 61 6c 69 7a 65 20   /// initialize 
8810: 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 2c 20  the new object, 
8820: 61 6e 64 20 6d 61 6b 65 20 2a 70 70 43 75 72 73  and make *ppCurs
8830: 6f 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  or point to the 
8840: 6e 65 77 20 6f 62 6a 65 63 74 2e 0d 0a 20 20 20  new object...   
8850: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 73 75 63       /// The suc
8860: 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 68 65  cessful call the
8870: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
8880: 5f 4f 4b 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  _OK...        //
8890: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
88a0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
88b0: 20 20 20 20 20 20 20 2f 2f 2f 20 46 6f 72 20 65         /// For e
88c0: 76 65 72 79 20 73 75 63 63 65 73 73 66 75 6c 20  very successful 
88d0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 6d 65 74  call to this met
88e0: 68 6f 64 2c 20 74 68 65 20 53 51 4c 69 74 65 20  hod, the SQLite 
88f0: 63 6f 72 65 20 77 69 6c 6c 0d 0a 20 20 20 20 20  core will..     
8900: 20 20 20 2f 2f 2f 20 6c 61 74 65 72 20 69 6e 76     /// later inv
8910: 6f 6b 65 20 74 68 65 20 78 43 6c 6f 73 65 20 6d  oke the xClose m
8920: 65 74 68 6f 64 20 74 6f 20 64 65 73 74 72 6f 79  ethod to destroy
8930: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74   ..        /// t
8940: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 63 75 72  he allocated cur
8950: 73 6f 72 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  sor...        //
8960: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
8970: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
8980: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78         /// The x
8990: 4f 70 65 6e 20 6d 65 74 68 6f 64 20 6e 65 65 64  Open method need
89a0: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20   not initialize 
89b0: 74 68 65 20 70 56 74 61 62 20 66 69 65 6c 64 20  the pVtab field 
89c0: 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  of the..        
89d0: 2f 2f 2f 20 73 71 6c 69 74 65 33 5f 76 74 61 62  /// sqlite3_vtab
89e0: 5f 63 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  _cursor structur
89f0: 65 2e 20 20 54 68 65 20 53 51 4c 69 74 65 20 63  e.  The SQLite c
8a00: 6f 72 65 20 77 69 6c 6c 20 74 61 6b 65 20 63 61  ore will take ca
8a10: 72 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  re..        /// 
8a20: 6f 66 20 74 68 61 74 20 63 68 6f 72 65 20 61 75  of that chore au
8a30: 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0d 0a 20 20  tomatically...  
8a40: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
8a50: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
8a60: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
8a70: 2f 2f 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  // A virtual tab
8a80: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
8a90: 6e 20 6d 75 73 74 20 62 65 20 61 62 6c 65 20 74  n must be able t
8aa0: 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 61 72 62  o support an arb
8ab0: 69 74 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20  itrary..        
8ac0: 2f 2f 2f 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  /// number of si
8ad0: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20 6f 70 65  multaneously ope
8ae0: 6e 20 63 75 72 73 6f 72 73 2e 0d 0a 20 20 20 20  n cursors...    
8af0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
8b00: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
8b10: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
8b20: 20 57 68 65 6e 20 69 6e 69 74 69 61 6c 6c 79 20   When initially 
8b30: 6f 70 65 6e 65 64 2c 20 74 68 65 20 63 75 72 73  opened, the curs
8b40: 6f 72 20 69 73 20 69 6e 20 61 6e 20 75 6e 64 65  or is in an unde
8b50: 66 69 6e 65 64 20 73 74 61 74 65 2e 0d 0a 20 20  fined state...  
8b60: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 53 51        /// The SQ
8b70: 4c 69 74 65 20 63 6f 72 65 20 77 69 6c 6c 20 69  Lite core will i
8b80: 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 74 65  nvoke the xFilte
8b90: 72 20 6d 65 74 68 6f 64 0d 0a 20 20 20 20 20 20  r method..      
8ba0: 20 20 2f 2f 2f 20 6f 6e 20 74 68 65 20 63 75 72    /// on the cur
8bb0: 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 61 6e 79  sor prior to any
8bc0: 20 61 74 74 65 6d 70 74 20 74 6f 20 70 6f 73 69   attempt to posi
8bd0: 74 69 6f 6e 20 6f 72 20 72 65 61 64 20 66 72 6f  tion or read fro
8be0: 6d 20 74 68 65 20 63 75 72 73 6f 72 2e 0d 0a 20  m the cursor... 
8bf0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
8c00: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
8c10: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
8c20: 2f 2f 2f 20 54 68 65 20 78 4f 70 65 6e 20 6d 65  /// The xOpen me
8c30: 74 68 6f 64 20 69 73 20 72 65 71 75 69 72 65 64  thod is required
8c40: 20 66 6f 72 20 65 76 65 72 79 20 76 69 72 74 75   for every virtu
8c50: 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65  al table impleme
8c60: 6e 74 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  ntation...      
8c70: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
8c80: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d         /// </sum
8c90: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f  mary>..        /
8ca0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
8cb0: 70 56 74 61 62 22 3e 0d 0a 20 20 20 20 20 20 20  pVtab">..       
8cc0: 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69 76 65 20   /// The native 
8cd0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
8ce0: 71 6c 69 74 65 33 5f 76 74 61 62 20 64 65 72 69  qlite3_vtab deri
8cf0: 76 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a  ved structure...
8d00: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
8d10: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ram>..        //
8d20: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70  / <param name="p
8d30: 43 75 72 73 6f 72 22 3e 0d 0a 20 20 20 20 20 20  Cursor">..      
8d40: 20 20 2f 2f 2f 20 55 70 6f 6e 20 73 75 63 63 65    /// Upon succe
8d50: 73 73 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74  ss, this paramet
8d60: 65 72 20 6d 75 73 74 20 62 65 20 6d 6f 64 69 66  er must be modif
8d70: 69 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ied to point to 
8d80: 74 68 65 20 6e 65 77 6c 79 0d 0a 20 20 20 20 20  the newly..     
8d90: 20 20 20 2f 2f 2f 20 63 72 65 61 74 65 64 20 6e     /// created n
8da0: 61 74 69 76 65 20 73 71 6c 69 74 65 33 5f 76 74  ative sqlite3_vt
8db0: 61 62 5f 63 75 72 73 6f 72 20 64 65 72 69 76 65  ab_cursor derive
8dc0: 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20  d structure...  
8dd0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
8de0: 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  m>..        /// 
8df0: 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20  <returns>..     
8e00: 20 20 20 2f 2f 2f 20 41 20 73 74 61 6e 64 61 72     /// A standar
8e10: 64 20 53 51 4c 69 74 65 20 72 65 74 75 72 6e 20  d SQLite return 
8e20: 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f  code...        /
8e30: 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20  // </returns>.. 
8e40: 20 20 20 20 20 20 20 53 51 4c 69 74 65 45 72 72         SQLiteErr
8e50: 6f 72 43 6f 64 65 20 78 4f 70 65 6e 28 0d 0a 20  orCode xOpen(.. 
8e60: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 50 74             IntPt
8e70: 72 20 70 56 74 61 62 2c 0d 0a 20 20 20 20 20 20  r pVtab,..      
8e80: 20 20 20 20 20 20 72 65 66 20 49 6e 74 50 74 72        ref IntPtr
8e90: 20 70 43 75 72 73 6f 72 0d 0a 20 20 20 20 20 20   pCursor..      
8ea0: 20 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20 20        );....    
8eb0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
8ec0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8ed0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8ee0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8ef0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
8f00: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d         /// <summ
8f10: 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ary>..        //
8f20: 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a  / <para><code>..
8f30: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 69 6e          ///   in
8f40: 74 20 28 2a 78 43 6c 6f 73 65 29 28 73 71 6c 69  t (*xClose)(sqli
8f50: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 2a  te3_vtab_cursor*
8f60: 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  );..        /// 
8f70: 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a  </code></para>..
8f80: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
8f90: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
8fa0: 54 68 65 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f  The xClose metho
8fb0: 64 20 63 6c 6f 73 65 73 20 61 20 63 75 72 73 6f  d closes a curso
8fc0: 72 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  r previously ope
8fd0: 6e 65 64 20 62 79 20 0d 0a 20 20 20 20 20 20 20  ned by ..       
8fe0: 20 2f 2f 2f 20 78 4f 70 65 6e 2e 20 0d 0a 20 20   /// xOpen. ..  
8ff0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 53 51        /// The SQ
9000: 4c 69 74 65 20 63 6f 72 65 20 77 69 6c 6c 20 61  Lite core will a
9010: 6c 77 61 79 73 20 63 61 6c 6c 20 78 43 6c 6f 73  lways call xClos
9020: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
9030: 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 0d 0a  cursor opened ..
9040: 20 20 20 20 20 20 20 20 2f 2f 2f 20 75 73 69 6e          /// usin
9050: 67 20 78 4f 70 65 6e 2e 0d 0a 20 20 20 20 20 20  g xOpen...      
9060: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
9070: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
9080: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
9090: 68 69 73 20 6d 65 74 68 6f 64 20 6d 75 73 74 20  his method must 
90a0: 72 65 6c 65 61 73 65 20 61 6c 6c 20 72 65 73 6f  release all reso
90b0: 75 72 63 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  urces allocated 
90c0: 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  by the..        
90d0: 2f 2f 2f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  /// correspondin
90e0: 67 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 54 68  g xOpen call. Th
90f0: 65 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e  e routine will n
9100: 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 61 67 61  ot be called aga
9110: 69 6e 20 65 76 65 6e 20 69 66 20 69 74 0d 0a 20  in even if it.. 
9120: 20 20 20 20 20 20 20 2f 2f 2f 20 72 65 74 75 72         /// retur
9130: 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  ns an error.  Th
9140: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 69  e SQLite core wi
9150: 6c 6c 20 6e 6f 74 20 75 73 65 20 74 68 65 0d 0a  ll not use the..
9160: 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 71 6c 69          /// sqli
9170: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
9180: 61 67 61 69 6e 20 61 66 74 65 72 20 69 74 20 68  again after it h
9190: 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 0d  as been closed..
91a0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
91b0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
91c0: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
91d0: 20 20 2f 2f 2f 20 54 68 65 20 78 43 6c 6f 73 65    /// The xClose
91e0: 20 6d 65 74 68 6f 64 20 69 73 20 72 65 71 75 69   method is requi
91f0: 72 65 64 20 66 6f 72 20 65 76 65 72 79 20 76 69  red for every vi
9200: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c  rtual table impl
9210: 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 20 20  ementation...   
9220: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
9230: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
9240: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
9250: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
9260: 65 3d 22 70 43 75 72 73 6f 72 22 3e 0d 0a 20 20  e="pCursor">..  
9270: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61        /// The na
9280: 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  tive pointer to 
9290: 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62  the sqlite3_vtab
92a0: 5f 63 75 72 73 6f 72 20 64 65 72 69 76 65 64 20  _cursor derived 
92b0: 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20 20  structure...    
92c0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
92d0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72  ..        /// <r
92e0: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20  eturns>..       
92f0: 20 2f 2f 2f 20 41 20 73 74 61 6e 64 61 72 64 20   /// A standard 
9300: 53 51 4c 69 74 65 20 72 65 74 75 72 6e 20 63 6f  SQLite return co
9310: 64 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  de...        ///
9320: 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20   </returns>..   
9330: 20 20 20 20 20 53 51 4c 69 74 65 45 72 72 6f 72       SQLiteError
9340: 43 6f 64 65 20 78 43 6c 6f 73 65 28 0d 0a 20 20  Code xClose(..  
9350: 20 20 20 20 20 20 20 20 20 20 49 6e 74 50 74 72            IntPtr
9360: 20 70 43 75 72 73 6f 72 0d 0a 20 20 20 20 20 20   pCursor..      
9370: 20 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20 20        );....    
9380: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
9390: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
93a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
93b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
93c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
93d0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d         /// <summ
93e0: 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ary>..        //
93f0: 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a  / <para><code>..
9400: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 69 6e          ///   in
9410: 74 20 28 2a 78 46 69 6c 74 65 72 29 28 73 71 6c  t (*xFilter)(sql
9420: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
9430: 2a 2c 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63  *, int idxNum, c
9440: 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53 74  onst char *idxSt
9450: 72 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  r,..        /// 
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
9480: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 3b  3_value **argv);
9490: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
94a0: 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20  code></para>..  
94b0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
94c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
94d0: 69 73 20 6d 65 74 68 6f 64 20 62 65 67 69 6e 73  is method begins
94e0: 20 61 20 73 65 61 72 63 68 20 6f 66 20 61 20 76   a search of a v
94f0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 0d 0a  irtual table. ..
9500: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
9510: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
9520: 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  s a cursor opene
9530: 64 20 62 79 20 78 4f 70 65 6e 2e 20 0d 0a 20 20  d by xOpen. ..  
9540: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 65        /// The ne
9550: 78 74 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  xt two arguments
9560: 20 64 65 66 69 6e 65 20 61 20 70 61 72 74 69 63   define a partic
9570: 75 6c 61 72 20 73 65 61 72 63 68 20 69 6e 64 65  ular search inde
9580: 78 20 70 72 65 76 69 6f 75 73 6c 79 20 0d 0a 20  x previously .. 
9590: 20 20 20 20 20 20 20 2f 2f 2f 20 63 68 6f 73 65         /// chose
95a0: 6e 20 62 79 20 78 42 65 73 74 49 6e 64 65 78 2e  n by xBestIndex.
95b0: 20 54 68 65 20 73 70 65 63 69 66 69 63 20 6d 65   The specific me
95c0: 61 6e 69 6e 67 73 20 6f 66 20 69 64 78 4e 75 6d  anings of idxNum
95d0: 20 61 6e 64 20 69 64 78 53 74 72 20 0d 0a 20 20   and idxStr ..  
95e0: 20 20 20 20 20 20 2f 2f 2f 20 61 72 65 20 75 6e        /// are un
95f0: 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 6c 6f 6e  important as lon
9600: 67 20 61 73 20 78 46 69 6c 74 65 72 20 61 6e 64  g as xFilter and
9610: 20 78 42 65 73 74 49 6e 64 65 78 20 61 67 72 65   xBestIndex agre
9620: 65 20 6f 6e 20 77 68 61 74 20 0d 0a 20 20 20 20  e on what ..    
9630: 20 20 20 20 2f 2f 2f 20 74 68 61 74 20 6d 65 61      /// that mea
9640: 6e 69 6e 67 20 69 73 2e 0d 0a 20 20 20 20 20 20  ning is...      
9650: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
9660: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
9670: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
9680: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 66 75  he xBestIndex fu
9690: 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61 76 65 20  nction may have 
96a0: 72 65 71 75 65 73 74 65 64 20 74 68 65 20 76 61  requested the va
96b0: 6c 75 65 73 20 6f 66 20 0d 0a 20 20 20 20 20 20  lues of ..      
96c0: 20 20 2f 2f 2f 20 63 65 72 74 61 69 6e 20 65 78    /// certain ex
96d0: 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20  pressions using 
96e0: 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 55  the aConstraintU
96f0: 73 61 67 65 5b 5d 2e 61 72 67 76 49 6e 64 65 78  sage[].argvIndex
9700: 20 76 61 6c 75 65 73 20 0d 0a 20 20 20 20 20 20   values ..      
9710: 20 20 2f 2f 2f 20 6f 66 20 74 68 65 20 73 71 6c    /// of the sql
9720: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
9730: 73 74 72 75 63 74 75 72 65 2e 20 0d 0a 20 20 20  structure. ..   
9740: 20 20 20 20 20 2f 2f 2f 20 54 68 6f 73 65 20 76       /// Those v
9750: 61 6c 75 65 73 20 61 72 65 20 70 61 73 73 65 64  alues are passed
9760: 20 74 6f 20 78 46 69 6c 74 65 72 20 75 73 69 6e   to xFilter usin
9770: 67 20 74 68 65 20 61 72 67 63 20 61 6e 64 20 61  g the argc and a
9780: 72 67 76 20 70 61 72 61 6d 65 74 65 72 73 2e 0d  rgv parameters..
9790: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
97a0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
97b0: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
97c0: 20 20 2f 2f 2f 20 49 66 20 74 68 65 20 76 69 72    /// If the vir
97d0: 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e 74 61  tual table conta
97e0: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
97f0: 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
9800: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  the..        ///
9810: 20 73 65 61 72 63 68 20 63 72 69 74 65 72 69 61   search criteria
9820: 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
9830: 72 20 6d 75 73 74 20 62 65 20 6c 65 66 74 20 70  r must be left p
9840: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
9850: 74 20 72 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  t row...        
9860: 2f 2f 2f 20 53 75 62 73 65 71 75 65 6e 74 20 63  /// Subsequent c
9870: 61 6c 6c 73 20 74 6f 20 78 45 6f 66 20 6d 75 73  alls to xEof mus
9880: 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20 28  t return false (
9890: 7a 65 72 6f 29 2e 0d 0a 20 20 20 20 20 20 20 20  zero)...        
98a0: 2f 2f 2f 20 49 66 20 74 68 65 72 65 20 61 72 65  /// If there are
98b0: 20 6e 6f 20 72 6f 77 73 20 6d 61 74 63 68 2c 20   no rows match, 
98c0: 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
98d0: 6d 75 73 74 20 62 65 20 6c 65 66 74 20 69 6e 20  must be left in 
98e0: 61 20 73 74 61 74 65 20 0d 0a 20 20 20 20 20 20  a state ..      
98f0: 20 20 2f 2f 2f 20 74 68 61 74 20 77 69 6c 6c 20    /// that will 
9900: 63 61 75 73 65 20 74 68 65 20 78 45 6f 66 20 74  cause the xEof t
9910: 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 28 6e  o return true (n
9920: 6f 6e 2d 7a 65 72 6f 29 2e 0d 0a 20 20 20 20 20  on-zero)...     
9930: 20 20 20 2f 2f 2f 20 54 68 65 20 53 51 4c 69 74     /// The SQLit
9940: 65 20 65 6e 67 69 6e 65 20 77 69 6c 6c 20 75 73  e engine will us
9950: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74  e..        /// t
9960: 68 65 20 78 43 6f 6c 75 6d 6e 20 61 6e 64 20 78  he xColumn and x
9970: 52 6f 77 69 64 20 6d 65 74 68 6f 64 73 20 74 6f  Rowid methods to
9980: 20 61 63 63 65 73 73 20 74 68 61 74 20 72 6f 77   access that row
9990: 20 63 6f 6e 74 65 6e 74 2e 0d 0a 20 20 20 20 20   content...     
99a0: 20 20 20 2f 2f 2f 20 54 68 65 20 78 4e 65 78 74     /// The xNext
99b0: 20 6d 65 74 68 6f 64 20 77 69 6c 6c 20 62 65 20   method will be 
99c0: 75 73 65 64 20 74 6f 20 61 64 76 61 6e 63 65 20  used to advance 
99d0: 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e  to the next row.
99e0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
99f0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
9a00: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
9a10: 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68     /// This meth
9a20: 6f 64 20 6d 75 73 74 20 72 65 74 75 72 6e 20 53  od must return S
9a30: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
9a40: 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 73 71  essful, or an sq
9a50: 6c 69 74 65 20 0d 0a 20 20 20 20 20 20 20 20 2f  lite ..        /
9a60: 2f 2f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  // error code if
9a70: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9a80: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
9a90: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
9aa0: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
9ab0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 46 69 6c      /// The xFil
9ac0: 74 65 72 20 6d 65 74 68 6f 64 20 69 73 20 72 65  ter method is re
9ad0: 71 75 69 72 65 64 20 66 6f 72 20 65 76 65 72 79  quired for every
9ae0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
9af0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a  mplementation...
9b00: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
9b10: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
9b20: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
9b30: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
9b40: 6e 61 6d 65 3d 22 70 43 75 72 73 6f 72 22 3e 0d  name="pCursor">.
9b50: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
9b60: 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20   native pointer 
9b70: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
9b80: 74 61 62 5f 63 75 72 73 6f 72 20 64 65 72 69 76  tab_cursor deriv
9b90: 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20  ed structure... 
9ba0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
9bb0: 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  am>..        ///
9bc0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69 64   <param name="id
9bd0: 78 4e 75 6d 22 3e 0d 0a 20 20 20 20 20 20 20 20  xNum">..        
9be0: 2f 2f 2f 20 4e 75 6d 62 65 72 20 75 73 65 64 20  /// Number used 
9bf0: 74 6f 20 68 65 6c 70 20 69 64 65 6e 74 69 66 79  to help identify
9c00: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 69 6e   the selected in
9c10: 64 65 78 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  dex...        //
9c20: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
9c30: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
9c40: 61 6d 65 3d 22 69 64 78 53 74 72 22 3e 0d 0a 20  ame="idxStr">.. 
9c50: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
9c60: 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f  ative pointer to
9c70: 20 74 68 65 20 55 54 46 2d 38 20 65 6e 63 6f 64   the UTF-8 encod
9c80: 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ed string contai
9c90: 6e 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20  ning the..      
9ca0: 20 20 2f 2f 2f 20 73 74 72 69 6e 67 20 75 73 65    /// string use
9cb0: 64 20 74 6f 20 68 65 6c 70 20 69 64 65 6e 74 69  d to help identi
9cc0: 66 79 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  fy the selected 
9cd0: 69 6e 64 65 78 2e 0d 0a 20 20 20 20 20 20 20 20  index...        
9ce0: 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
9cf0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
9d00: 20 6e 61 6d 65 3d 22 61 72 67 63 22 3e 0d 0a 20   name="argc">.. 
9d10: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
9d20: 75 6d 62 65 72 20 6f 66 20 6e 61 74 69 76 65 20  umber of native 
9d30: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 71 6c 69  pointers to sqli
9d40: 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
9d50: 75 72 65 73 20 73 70 65 63 69 66 69 65 64 0d 0a  ures specified..
9d60: 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 20 3c          /// in <
9d70: 70 61 72 61 6d 72 65 66 20 6e 61 6d 65 3d 22 61  paramref name="a
9d80: 72 67 76 22 20 2f 3e 2e 0d 0a 20 20 20 20 20 20  rgv" />...      
9d90: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a    /// </param>..
9da0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
9db0: 61 6d 20 6e 61 6d 65 3d 22 61 72 67 76 22 3e 0d  am name="argv">.
9dc0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 6e 20  .        /// An 
9dd0: 61 72 72 61 79 20 6f 66 20 6e 61 74 69 76 65 20  array of native 
9de0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 71 6c 69  pointers to sqli
9df0: 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
9e00: 75 72 65 73 20 63 6f 6e 74 61 69 6e 69 6e 67 0d  ures containing.
9e10: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 66 69 6c  .        /// fil
9e20: 74 65 72 69 6e 67 20 63 72 69 74 65 72 69 61 20  tering criteria 
9e30: 66 6f 72 20 74 68 65 20 73 65 6c 65 63 74 65 64  for the selected
9e40: 20 69 6e 64 65 78 2e 0d 0a 20 20 20 20 20 20 20   index...       
9e50: 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20   /// </param>.. 
9e60: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75         /// <retu
9e70: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  rns>..        //
9e80: 2f 20 41 20 73 74 61 6e 64 61 72 64 20 53 51 4c  / A standard SQL
9e90: 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ite return code.
9ea0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
9eb0: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20  returns>..      
9ec0: 20 20 53 51 4c 69 74 65 45 72 72 6f 72 43 6f 64    SQLiteErrorCod
9ed0: 65 20 78 46 69 6c 74 65 72 28 0d 0a 20 20 20 20  e xFilter(..    
9ee0: 20 20 20 20 20 20 20 20 49 6e 74 50 74 72 20 70          IntPtr p
9ef0: 43 75 72 73 6f 72 2c 0d 0a 20 20 20 20 20 20 20  Cursor,..       
9f00: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c       int idxNum,
9f10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  ..            In
9f20: 74 50 74 72 20 69 64 78 53 74 72 2c 0d 0a 20 20  tPtr idxStr,..  
9f30: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 72            int ar
9f40: 67 63 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  gc,..           
9f50: 20 49 6e 74 50 74 72 20 61 72 67 76 0d 0a 20 20   IntPtr argv..  
9f60: 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a            );....
9f70: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
9f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 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 0d  ///////////////.
9fc0: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
9fd0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
9fe0: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64    /// <para><cod
9ff0: 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e>..        /// 
a000: 20 20 69 6e 74 20 28 2a 78 4e 65 78 74 29 28 73    int (*xNext)(s
a010: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
a020: 6f 72 2a 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f  or*);..        /
a030: 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61  // </code></para
a040: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
a050: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
a060: 2f 2f 20 54 68 65 20 78 4e 65 78 74 20 6d 65 74  // The xNext met
a070: 68 6f 64 20 61 64 76 61 6e 63 65 73 20 61 20 76  hod advances a v
a080: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72  irtual table cur
a090: 73 6f 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  sor..        ///
a0a0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
a0b0: 20 6f 66 20 61 20 72 65 73 75 6c 74 20 73 65 74   of a result set
a0c0: 20 69 6e 69 74 69 61 74 65 64 20 62 79 20 78 46   initiated by xF
a0d0: 69 6c 74 65 72 2e 20 0d 0a 20 20 20 20 20 20 20  ilter. ..       
a0e0: 20 2f 2f 2f 20 49 66 20 74 68 65 20 63 75 72 73   /// If the curs
a0f0: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
a100: 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61  inting at the la
a110: 73 74 20 72 6f 77 20 77 68 65 6e 20 74 68 69 73  st row when this
a120: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 72   ..        /// r
a130: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a140: 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
a150: 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 6f 69 6e  r no longer poin
a160: 74 73 20 74 6f 20 76 61 6c 69 64 20 0d 0a 20 20  ts to valid ..  
a170: 20 20 20 20 20 20 2f 2f 2f 20 64 61 74 61 20 61        /// data a
a180: 6e 64 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  nd a subsequent 
a190: 63 61 6c 6c 20 74 6f 20 74 68 65 20 78 45 6f 66  call to the xEof
a1a0: 20 6d 65 74 68 6f 64 20 6d 75 73 74 20 72 65 74   method must ret
a1b0: 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
a1c0: 72 6f 29 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f  ro). ..        /
a1d0: 2f 2f 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  // If the cursor
a1e0: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
a1f0: 20 61 64 76 61 6e 63 65 64 20 74 6f 20 61 6e 6f   advanced to ano
a200: 74 68 65 72 20 72 6f 77 20 6f 66 20 63 6f 6e 74  ther row of cont
a210: 65 6e 74 2c 20 74 68 65 6e 0d 0a 20 20 20 20 20  ent, then..     
a220: 20 20 20 2f 2f 2f 20 73 75 62 73 65 71 75 65 6e     /// subsequen
a230: 74 20 63 61 6c 6c 73 20 74 6f 20 78 45 6f 66 20  t calls to xEof 
a240: 6d 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73  must return fals
a250: 65 20 28 7a 65 72 6f 29 2e 0d 0a 20 20 20 20 20  e (zero)...     
a260: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
a270: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
a280: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
a290: 54 68 69 73 20 6d 65 74 68 6f 64 20 6d 75 73 74  This method must
a2a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a2b0: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
a2c0: 20 6f 72 20 61 6e 20 73 71 6c 69 74 65 20 0d 0a   or an sqlite ..
a2d0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 65 72 72 6f          /// erro
a2e0: 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  r code if an err
a2f0: 6f 72 20 6f 63 63 75 72 73 2e 0d 0a 20 20 20 20  or occurs...    
a300: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
a310: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
a320: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
a330: 20 54 68 65 20 78 4e 65 78 74 20 6d 65 74 68 6f   The xNext metho
a340: 64 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  d is required fo
a350: 72 20 65 76 65 72 79 20 76 69 72 74 75 61 6c 20  r every virtual 
a360: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
a370: 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f  tion...        /
a380: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
a390: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
a3a0: 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  y>..        /// 
a3b0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 43 75  <param name="pCu
a3c0: 72 73 6f 72 22 3e 0d 0a 20 20 20 20 20 20 20 20  rsor">..        
a3d0: 2f 2f 2f 20 54 68 65 20 6e 61 74 69 76 65 20 70  /// The native p
a3e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 71  ointer to the sq
a3f0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
a400: 72 20 64 65 72 69 76 65 64 20 73 74 72 75 63 74  r derived struct
a410: 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ure...        //
a420: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
a430: 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
a440: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41  >..        /// A
a450: 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65   standard SQLite
a460: 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20   return code... 
a470: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74         /// </ret
a480: 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53  urns>..        S
a490: 51 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78  QLiteErrorCode x
a4a0: 4e 65 78 74 28 0d 0a 20 20 20 20 20 20 20 20 20  Next(..         
a4b0: 20 20 20 49 6e 74 50 74 72 20 70 43 75 72 73 6f     IntPtr pCurso
a4c0: 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  r..            )
a4d0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ;....        ///
a4e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a4f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a520: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
a530: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
a540: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
a550: 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20  ><code>..       
a560: 20 2f 2f 2f 20 20 20 69 6e 74 20 28 2a 78 45 6f   ///   int (*xEo
a570: 66 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  f)(sqlite3_vtab_
a580: 63 75 72 73 6f 72 2a 29 3b 0d 0a 20 20 20 20 20  cursor*);..     
a590: 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f     /// </code></
a5a0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
a5b0: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
a5c0: 20 20 20 2f 2f 2f 20 54 68 65 20 78 45 6f 66 20     /// The xEof 
a5d0: 6d 65 74 68 6f 64 20 6d 75 73 74 20 72 65 74 75  method must retu
a5e0: 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20  rn false (zero) 
a5f0: 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
a600: 20 63 75 72 73 6f 72 20 0d 0a 20 20 20 20 20 20   cursor ..      
a610: 20 20 2f 2f 2f 20 63 75 72 72 65 6e 74 6c 79 20    /// currently 
a620: 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
a630: 64 20 72 6f 77 20 6f 66 20 64 61 74 61 2c 20 6f  d row of data, o
a640: 72 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f  r true (non-zero
a650: 29 20 6f 74 68 65 72 77 69 73 65 2e 20 0d 0a 20  ) otherwise. .. 
a660: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20         /// This 
a670: 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c 65 64  method is called
a680: 20 62 79 20 74 68 65 20 53 51 4c 20 65 6e 67 69   by the SQL engi
a690: 6e 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ne immediately a
a6a0: 66 74 65 72 20 65 61 63 68 20 0d 0a 20 20 20 20  fter each ..    
a6b0: 20 20 20 20 2f 2f 2f 20 78 46 69 6c 74 65 72 20      /// xFilter 
a6c0: 61 6e 64 20 78 4e 65 78 74 20 69 6e 76 6f 63 61  and xNext invoca
a6d0: 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f  tion...        /
a6e0: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
a6f0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
a700: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
a710: 78 45 6f 66 20 6d 65 74 68 6f 64 20 69 73 20 72  xEof method is r
a720: 65 71 75 69 72 65 64 20 66 6f 72 20 65 76 65 72  equired for ever
a730: 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  y virtual table 
a740: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d  implementation..
a750: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
a760: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
a770: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
a780: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
a790: 20 6e 61 6d 65 3d 22 70 43 75 72 73 6f 72 22 3e   name="pCursor">
a7a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
a7b0: 65 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72  e native pointer
a7c0: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
a7d0: 76 74 61 62 5f 63 75 72 73 6f 72 20 64 65 72 69  vtab_cursor deri
a7e0: 76 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a  ved structure...
a7f0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
a800: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ram>..        //
a810: 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  / <returns>..   
a820: 20 20 20 20 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72       /// Non-zer
a830: 6f 20 69 66 20 6e 6f 20 6d 6f 72 65 20 72 6f 77  o if no more row
a840: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 3b  s are available;
a850: 20 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e   zero otherwise.
a860: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
a870: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20  returns>..      
a880: 20 20 69 6e 74 20 78 45 6f 66 28 0d 0a 20 20 20    int xEof(..   
a890: 20 20 20 20 20 20 20 20 20 49 6e 74 50 74 72 20           IntPtr 
a8a0: 70 43 75 72 73 6f 72 0d 0a 20 20 20 20 20 20 20  pCursor..       
a8b0: 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 20       );....     
a8c0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
a8d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a8e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a8f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a900: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
a910: 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61        /// <summa
a920: 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ry>..        ///
a930: 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20   <para><code>.. 
a940: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 69 6e 74         ///   int
a950: 20 28 2a 78 43 6f 6c 75 6d 6e 29 28 73 71 6c 69   (*xColumn)(sqli
a960: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 2a  te3_vtab_cursor*
a970: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  , sqlite3_contex
a980: 74 2a 2c 20 69 6e 74 20 4e 29 3b 0d 0a 20 20 20  t*, int N);..   
a990: 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e       /// </code>
a9a0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
a9b0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
a9c0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 53 51 4c       /// The SQL
a9d0: 69 74 65 20 63 6f 72 65 20 69 6e 76 6f 6b 65 73  ite core invokes
a9e0: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 6e 20   this method in 
a9f0: 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 20 74 68  order to find th
aa00: 65 20 76 61 6c 75 65 20 66 6f 72 20 0d 0a 20 20  e value for ..  
aa10: 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 4e 2d        /// the N-
aa20: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
aa30: 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 4e 20   current row. N 
aa40: 69 73 20 7a 65 72 6f 2d 62 61 73 65 64 20 73 6f  is zero-based so
aa50: 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
aa60: 6e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  n ..        /// 
aa70: 69 73 20 6e 75 6d 62 65 72 65 64 20 30 2e 20 0d  is numbered 0. .
aa80: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
aa90: 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20   xColumn method 
aaa0: 6d 61 79 20 72 65 74 75 72 6e 20 69 74 73 20 72  may return its r
aab0: 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51  esult back to SQ
aac0: 4c 69 74 65 20 75 73 69 6e 67 20 6f 6e 65 20 6f  Lite using one o
aad0: 66 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f  f the..        /
aae0: 2f 2f 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 74  // following int
aaf0: 65 72 66 61 63 65 3a 0d 0a 20 20 20 20 20 20 20  erface:..       
ab00: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
ab10: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
ab20: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21  ..        /// <!
ab30: 5b 43 44 41 54 41 5b 3c 75 6c 3e 5d 5d 3e 0d 0a  [CDATA[<ul>]]>..
ab40: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43          /// <![C
ab50: 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 73 71 6c  DATA[<li>]]> sql
ab60: 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
ab70: 28 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ()..        /// 
ab80: 3c 21 5b 43 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e  <![CDATA[<li>]]>
ab90: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
aba0: 64 6f 75 62 6c 65 28 29 0d 0a 20 20 20 20 20 20  double()..      
abb0: 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c    /// <![CDATA[<
abc0: 6c 69 3e 5d 5d 3e 20 73 71 6c 69 74 65 33 5f 72  li>]]> sqlite3_r
abd0: 65 73 75 6c 74 5f 69 6e 74 28 29 0d 0a 20 20 20  esult_int()..   
abe0: 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54       /// <![CDAT
abf0: 41 5b 3c 6c 69 3e 5d 5d 3e 20 73 71 6c 69 74 65  A[<li>]]> sqlite
ac00: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 29  3_result_int64()
ac10: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21  ..        /// <!
ac20: 5b 43 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 73  [CDATA[<li>]]> s
ac30: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
ac40: 6c 6c 28 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ll()..        //
ac50: 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 6c 69 3e 5d  / <![CDATA[<li>]
ac60: 5d 3e 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ]> sqlite3_resul
ac70: 74 5f 74 65 78 74 28 29 0d 0a 20 20 20 20 20 20  t_text()..      
ac80: 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c    /// <![CDATA[<
ac90: 6c 69 3e 5d 5d 3e 20 73 71 6c 69 74 65 33 5f 72  li>]]> sqlite3_r
aca0: 65 73 75 6c 74 5f 74 65 78 74 31 36 28 29 0d 0a  esult_text16()..
acb0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43          /// <![C
acc0: 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 73 71 6c  DATA[<li>]]> sql
acd0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
ace0: 31 36 6c 65 28 29 0d 0a 20 20 20 20 20 20 20 20  16le()..        
acf0: 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 6c 69  /// <![CDATA[<li
ad00: 3e 5d 5d 3e 20 73 71 6c 69 74 65 33 5f 72 65 73  >]]> sqlite3_res
ad10: 75 6c 74 5f 74 65 78 74 31 36 62 65 28 29 0d 0a  ult_text16be()..
ad20: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43          /// <![C
ad30: 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 73 71 6c  DATA[<li>]]> sql
ad40: 69 74 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f  ite3_result_zero
ad50: 62 6c 6f 62 28 29 0d 0a 20 20 20 20 20 20 20 20  blob()..        
ad60: 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 75  /// <![CDATA[</u
ad70: 6c 3e 5d 5d 3e 0d 0a 20 20 20 20 20 20 20 20 2f  l>]]>..        /
ad80: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
ad90: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
ada0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 49 66 20 74          /// If t
adb0: 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f  he xColumn metho
adc0: 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  d implementation
add0: 20 63 61 6c 6c 73 20 6e 6f 6e 65 20 6f 66 20 74   calls none of t
ade0: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 62 6f  he functions abo
adf0: 76 65 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ve,..        ///
ae00: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
ae10: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65  of the column de
ae20: 66 61 75 6c 74 73 20 74 6f 20 61 6e 20 53 51 4c  faults to an SQL
ae30: 20 4e 55 4c 4c 2e 0d 0a 20 20 20 20 20 20 20 20   NULL...        
ae40: 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
ae50: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
ae60: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 6f 20  .        /// To 
ae70: 72 61 69 73 65 20 61 6e 20 65 72 72 6f 72 2c 20  raise an error, 
ae80: 74 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68  the xColumn meth
ae90: 6f 64 20 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e  od should use on
aea0: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 5f  e of the result_
aeb0: 74 65 78 74 28 29 20 0d 0a 20 20 20 20 20 20 20  text() ..       
aec0: 20 2f 2f 2f 20 6d 65 74 68 6f 64 73 20 74 6f 20   /// methods to 
aed0: 73 65 74 20 74 68 65 20 65 72 72 6f 72 20 6d 65  set the error me
aee0: 73 73 61 67 65 20 74 65 78 74 2c 20 74 68 65 6e  ssage text, then
aef0: 20 72 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f   return an appro
af00: 70 72 69 61 74 65 0d 0a 20 20 20 20 20 20 20 20  priate..        
af10: 2f 2f 2f 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  /// error code. 
af20: 20 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74   The xColumn met
af30: 68 6f 64 20 6d 75 73 74 20 72 65 74 75 72 6e 20  hod must return 
af40: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
af50: 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 2f  cess...        /
af60: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
af70: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
af80: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
af90: 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69  xColumn method i
afa0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65  s required for e
afb0: 76 65 72 79 20 76 69 72 74 75 61 6c 20 74 61 62  very virtual tab
afc0: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
afd0: 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  n...        /// 
afe0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
aff0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
b000: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
b010: 72 61 6d 20 6e 61 6d 65 3d 22 70 43 75 72 73 6f  ram name="pCurso
b020: 72 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  r">..        ///
b030: 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f 69 6e   The native poin
b040: 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ter to the sqlit
b050: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 64  e3_vtab_cursor d
b060: 65 72 69 76 65 64 20 73 74 72 75 63 74 75 72 65  erived structure
b070: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
b080: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
b090: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
b0a0: 3d 22 70 43 6f 6e 74 65 78 74 22 3e 0d 0a 20 20  ="pContext">..  
b0b0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61        /// The na
b0c0: 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  tive pointer to 
b0d0: 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  the sqlite3_cont
b0e0: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 74 6f  ext structure to
b0f0: 20 62 65 20 75 73 65 64 0d 0a 20 20 20 20 20 20   be used..      
b100: 20 20 2f 2f 2f 20 66 6f 72 20 72 65 74 75 72 6e    /// for return
b110: 69 6e 67 20 74 68 65 20 73 70 65 63 69 66 69 65  ing the specifie
b120: 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 74  d column value t
b130: 6f 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  o the SQLite cor
b140: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6c  e..        /// l
b150: 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 20  ibrary...       
b160: 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20   /// </param>.. 
b170: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
b180: 6d 20 6e 61 6d 65 3d 22 69 6e 64 65 78 22 3e 0d  m name="index">.
b190: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
b1a0: 20 7a 65 72 6f 2d 62 61 73 65 64 20 69 6e 64 65   zero-based inde
b1b0: 78 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  x corresponding 
b1c0: 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  to the column co
b1d0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 0d 0a 20 20  ntaining the..  
b1e0: 20 20 20 20 20 20 2f 2f 2f 20 76 61 6c 75 65 20        /// value 
b1f0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0d  to be returned..
b200: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
b210: 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f  aram>..        /
b220: 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20  // <returns>..  
b230: 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74 61 6e        /// A stan
b240: 64 61 72 64 20 53 51 4c 69 74 65 20 72 65 74 75  dard SQLite retu
b250: 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20  rn code...      
b260: 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e    /// </returns>
b270: 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65  ..        SQLite
b280: 45 72 72 6f 72 43 6f 64 65 20 78 43 6f 6c 75 6d  ErrorCode xColum
b290: 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n(..            
b2a0: 49 6e 74 50 74 72 20 70 43 75 72 73 6f 72 2c 0d  IntPtr pCursor,.
b2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  .            Int
b2c0: 50 74 72 20 70 43 6f 6e 74 65 78 74 2c 0d 0a 20  Ptr pContext,.. 
b2d0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
b2e0: 6e 64 65 78 0d 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
b2f0: 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20    );....        
b300: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b310: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b340: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
b350: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
b360: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
b370: 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20  ara><code>..    
b380: 20 20 20 20 2f 2f 2f 20 20 20 69 6e 74 20 28 2a      ///   int (*
b390: 78 52 6f 77 69 64 29 28 73 71 6c 69 74 65 33 5f  xRowid)(sqlite3_
b3a0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
b3b0: 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  r, sqlite_int64 
b3c0: 2a 70 52 6f 77 69 64 29 3b 0d 0a 20 20 20 20 20  *pRowid);..     
b3d0: 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f     /// </code></
b3e0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
b3f0: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
b400: 20 20 20 2f 2f 2f 20 41 20 73 75 63 63 65 73 73     /// A success
b410: 66 75 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ful invocation o
b420: 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20 77 69  f this method wi
b430: 6c 6c 20 63 61 75 73 65 20 2a 70 52 6f 77 69 64  ll cause *pRowid
b440: 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20   to be..        
b450: 2f 2f 2f 20 66 69 6c 6c 65 64 20 77 69 74 68 20  /// filled with 
b460: 74 68 65 20 72 6f 77 69 64 20 6f 66 20 72 6f 77  the rowid of row
b470: 20 74 68 61 74 20 74 68 65 0d 0a 20 20 20 20 20   that the..     
b480: 20 20 20 2f 2f 2f 20 76 69 72 74 75 61 6c 20 74     /// virtual t
b490: 61 62 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  able cursor pCur
b4a0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
b4b0: 69 6e 74 69 6e 67 20 61 74 2e 0d 0a 20 20 20 20  inting at...    
b4c0: 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74      /// This met
b4d0: 68 6f 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49  hod returns SQLI
b4e0: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
b4f0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 49  ...        /// I
b500: 74 20 72 65 74 75 72 6e 73 20 61 6e 20 61 70 70  t returns an app
b510: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
b520: 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0d  ode on failure..
b530: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
b540: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
b550: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
b560: 20 20 2f 2f 2f 20 54 68 65 20 78 52 6f 77 69 64    /// The xRowid
b570: 20 6d 65 74 68 6f 64 20 69 73 20 72 65 71 75 69   method is requi
b580: 72 65 64 20 66 6f 72 20 65 76 65 72 79 20 76 69  red for every vi
b590: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c  rtual table impl
b5a0: 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 20 20  ementation...   
b5b0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
b5c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
b5d0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
b5e0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
b5f0: 65 3d 22 70 43 75 72 73 6f 72 22 3e 0d 0a 20 20  e="pCursor">..  
b600: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61        /// The na
b610: 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  tive pointer to 
b620: 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62  the sqlite3_vtab
b630: 5f 63 75 72 73 6f 72 20 64 65 72 69 76 65 64 20  _cursor derived 
b640: 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20 20  structure...    
b650: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
b660: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
b670: 61 72 61 6d 20 6e 61 6d 65 3d 22 72 6f 77 49 64  aram name="rowId
b680: 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ">..        /// 
b690: 55 70 6f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  Upon success, th
b6a0: 69 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  is parameter mus
b6b0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 74 6f  t be modified to
b6c0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 75 6e 69   contain the uni
b6d0: 71 75 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  que..        ///
b6e0: 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64 65   integer row ide
b6f0: 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20  ntifier for the 
b700: 63 75 72 72 65 6e 74 20 72 6f 77 20 66 6f 72 20  current row for 
b710: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63 75  the specified cu
b720: 72 73 6f 72 2e 0d 0a 20 20 20 20 20 20 20 20 2f  rsor...        /
b730: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
b740: 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e       /// <return
b750: 73 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  s>..        /// 
b760: 41 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74  A standard SQLit
b770: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a  e return code...
b780: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65          /// </re
b790: 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20  turns>..        
b7a0: 53 51 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20  SQLiteErrorCode 
b7b0: 78 52 6f 77 49 64 28 0d 0a 20 20 20 20 20 20 20  xRowId(..       
b7c0: 20 20 20 20 20 49 6e 74 50 74 72 20 70 43 75 72       IntPtr pCur
b7d0: 73 6f 72 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  sor,..          
b7e0: 20 20 72 65 66 20 6c 6f 6e 67 20 72 6f 77 49 64    ref long rowId
b7f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  ..            );
b800: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
b810: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b820: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b830: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b840: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b850: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  ///....        /
b860: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
b870: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
b880: 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20  <code>..        
b890: 2f 2f 2f 20 20 20 69 6e 74 20 28 2a 78 55 70 64  ///   int (*xUpd
b8a0: 61 74 65 29 28 0d 0a 20 20 20 20 20 20 20 20 2f  ate)(..        /
b8b0: 2f 2f 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  //     sqlite3_v
b8c0: 74 61 62 20 2a 70 56 54 61 62 2c 0d 0a 20 20 20  tab *pVTab,..   
b8d0: 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 69 6e 74       ///     int
b8e0: 20 61 72 67 63 2c 0d 0a 20 20 20 20 20 20 20 20   argc,..        
b8f0: 2f 2f 2f 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ///     sqlite3_
b900: 76 61 6c 75 65 20 2a 2a 61 72 67 76 2c 0d 0a 20  value **argv,.. 
b910: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 73         ///     s
b920: 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f  qlite_int64 *pRo
b930: 77 69 64 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  wid..        ///
b940: 20 20 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f     );..        /
b950: 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61  // </code></para
b960: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
b970: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
b980: 2f 2f 20 41 6c 6c 20 63 68 61 6e 67 65 73 20 74  // All changes t
b990: 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  o a virtual tabl
b9a0: 65 20 61 72 65 20 6d 61 64 65 20 75 73 69 6e 67  e are made using
b9b0: 20 74 68 65 20 78 55 70 64 61 74 65 20 6d 65 74   the xUpdate met
b9c0: 68 6f 64 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  hod...        //
b9d0: 2f 20 54 68 69 73 20 6f 6e 65 20 6d 65 74 68 6f  / This one metho
b9e0: 64 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  d can be used to
b9f0: 20 69 6e 73 65 72 74 2c 20 64 65 6c 65 74 65 2c   insert, delete,
ba00: 20 6f 72 20 75 70 64 61 74 65 2e 0d 0a 20 20 20   or update...   
ba10: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
ba20: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
ba30: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
ba40: 2f 20 54 68 65 20 61 72 67 63 20 70 61 72 61 6d  / The argc param
ba50: 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
ba60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
ba70: 72 69 65 73 20 69 6e 20 74 68 65 20 61 72 67 76  ries in the argv
ba80: 20 61 72 72 61 79 2e 20 0d 0a 20 20 20 20 20 20   array. ..      
ba90: 20 20 2f 2f 2f 20 54 68 65 20 76 61 6c 75 65 20    /// The value 
baa0: 6f 66 20 61 72 67 63 20 77 69 6c 6c 20 62 65 20  of argc will be 
bab0: 31 20 66 6f 72 20 61 20 70 75 72 65 20 64 65 6c  1 for a pure del
bac0: 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 72  ete operation or
bad0: 20 4e 2b 32 20 66 6f 72 20 61 6e 20 69 6e 73 65   N+2 for an inse
bae0: 72 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  rt..        /// 
baf0: 6f 72 20 72 65 70 6c 61 63 65 20 6f 72 20 75 70  or replace or up
bb00: 64 61 74 65 20 77 68 65 72 65 20 4e 20 69 73 20  date where N is 
bb10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
bb20: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
bb30: 6c 65 2e 20 20 0d 0a 20 20 20 20 20 20 20 20 2f  le.  ..        /
bb40: 2f 2f 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f  // In the previo
bb50: 75 73 20 73 65 6e 74 65 6e 63 65 2c 20 4e 20 69  us sentence, N i
bb60: 6e 63 6c 75 64 65 73 20 61 6e 79 20 68 69 64 64  ncludes any hidd
bb70: 65 6e 20 63 6f 6c 75 6d 6e 73 2e 0d 0a 20 20 20  en columns...   
bb80: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
bb90: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
bba0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
bbb0: 2f 20 45 76 65 72 79 20 61 72 67 76 20 65 6e 74  / Every argv ent
bbc0: 72 79 20 77 69 6c 6c 20 68 61 76 65 20 61 20 6e  ry will have a n
bbd0: 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e  on-NULL value in
bbe0: 20 43 20 62 75 74 20 6d 61 79 20 63 6f 6e 74 61   C but may conta
bbf0: 69 6e 20 74 68 65 20 0d 0a 20 20 20 20 20 20 20  in the ..       
bc00: 20 2f 2f 2f 20 53 51 4c 20 76 61 6c 75 65 20 4e   /// SQL value N
bc10: 55 4c 4c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ULL.  In other w
bc20: 6f 72 64 73 2c 20 69 74 20 69 73 20 61 6c 77 61  ords, it is alwa
bc30: 79 73 20 74 72 75 65 20 74 68 61 74 0d 0a 20 20  ys true that..  
bc40: 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41        /// <![CDA
bc50: 54 41 5b 3c 74 74 3e 5d 5d 3e 61 72 67 76 5b 69  TA[<tt>]]>argv[i
bc60: 5d 21 3d 30 3c 21 5b 43 44 41 54 41 5b 3c 2f 74  ]!=0<![CDATA[</t
bc70: 74 3e 5d 5d 3e 20 66 6f 72 20 3c 21 5b 43 44 41  t>]]> for <![CDA
bc80: 54 41 5b 3c 62 3e 5d 5d 3e 69 3c 21 5b 43 44 41  TA[<b>]]>i<![CDA
bc90: 54 41 5b 3c 2f 62 3e 5d 5d 3e 20 62 65 74 77 65  TA[</b>]]> betwe
bca0: 65 6e 20 30 20 61 6e 64 20 3c 21 5b 43 44 41 54  en 0 and <![CDAT
bcb0: 41 5b 3c 74 74 3e 5d 5d 3e 61 72 67 63 2d 31 3c  A[<tt>]]>argc-1<
bcc0: 21 5b 43 44 41 54 41 5b 3c 2f 74 74 3e 5d 5d 3e  ![CDATA[</tt>]]>
bcd0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 48  ...        /// H
bce0: 6f 77 65 76 65 72 2c 20 69 74 20 6d 69 67 68 74  owever, it might
bcf0: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
bd00: 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  t..        /// <
bd10: 21 5b 43 44 41 54 41 5b 3c 74 74 3e 5d 5d 3e 73  ![CDATA[<tt>]]>s
bd20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
bd30: 65 28 61 72 67 76 5b 69 5d 29 3d 3d 53 51 4c 49  e(argv[i])==SQLI
bd40: 54 45 5f 4e 55 4c 4c 3c 21 5b 43 44 41 54 41 5b  TE_NULL<![CDATA[
bd50: 3c 2f 74 74 3e 5d 5d 3e 2e 0d 0a 20 20 20 20 20  </tt>]]>...     
bd60: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
bd70: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
bd80: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
bd90: 54 68 65 20 61 72 67 76 5b 30 5d 20 70 61 72 61  The argv[0] para
bda0: 6d 65 74 65 72 20 69 73 20 74 68 65 20 72 6f 77  meter is the row
bdb0: 69 64 20 6f 66 20 61 20 72 6f 77 20 69 6e 20 74  id of a row in t
bdc0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
bdd0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74   ..        /// t
bde0: 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 66  o be deleted. If
bdf0: 20 61 72 67 76 5b 30 5d 20 69 73 20 61 6e 20 53   argv[0] is an S
be00: 51 4c 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6e 6f  QL NULL, then no
be10: 20 64 65 6c 65 74 69 6f 6e 20 6f 63 63 75 72 73   deletion occurs
be20: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
be30: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
be40: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
be50: 20 20 20 20 2f 2f 2f 20 54 68 65 20 61 72 67 76      /// The argv
be60: 5b 31 5d 20 70 61 72 61 6d 65 74 65 72 20 69 73  [1] parameter is
be70: 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61 20   the rowid of a 
be80: 6e 65 77 20 72 6f 77 20 74 6f 20 62 65 20 69 6e  new row to be in
be90: 73 65 72 74 65 64 20 0d 0a 20 20 20 20 20 20 20  serted ..       
bea0: 20 2f 2f 2f 20 69 6e 74 6f 20 74 68 65 20 76 69   /// into the vi
beb0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 49 66 20  rtual table. If 
bec0: 61 72 67 76 5b 31 5d 20 69 73 20 61 6e 20 53 51  argv[1] is an SQ
bed0: 4c 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  L NULL, then the
bee0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
bef0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d 75  ..        /// mu
bf00: 73 74 20 63 68 6f 6f 73 65 20 61 20 72 6f 77 69  st choose a rowi
bf10: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79 20  d for the newly 
bf20: 69 6e 73 65 72 74 65 64 20 72 6f 77 2e 20 53 75  inserted row. Su
bf30: 62 73 65 71 75 65 6e 74 20 61 72 67 76 5b 5d 20  bsequent argv[] 
bf40: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 65 6e  ..        /// en
bf50: 74 72 69 65 73 20 63 6f 6e 74 61 69 6e 20 76 61  tries contain va
bf60: 6c 75 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  lues of the colu
bf70: 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 72 74 75  mns of the virtu
bf80: 61 6c 20 74 61 62 6c 65 2c 20 69 6e 20 74 68 65  al table, in the
bf90: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6f   ..        /// o
bfa0: 72 64 65 72 20 74 68 61 74 20 74 68 65 20 63 6f  rder that the co
bfb0: 6c 75 6d 6e 73 20 77 65 72 65 20 64 65 63 6c 61  lumns were decla
bfc0: 72 65 64 2e 20 54 68 65 20 6e 75 6d 62 65 72 20  red. The number 
bfd0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 77 69 6c 6c 0d  of columns will.
bfe0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d 61 74  .        /// mat
bff0: 63 68 20 74 68 65 20 74 61 62 6c 65 20 64 65 63  ch the table dec
c000: 6c 61 72 61 74 69 6f 6e 20 74 68 61 74 20 74 68  laration that th
c010: 65 20 78 43 6f 6e 6e 65 63 74 20 6f 72 20 78 43  e xConnect or xC
c020: 72 65 61 74 65 20 6d 65 74 68 6f 64 20 6d 61 64  reate method mad
c030: 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e ..        /// 
c040: 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
c050: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
c060: 20 63 61 6c 6c 2e 20 20 41 6c 6c 20 68 69 64 64   call.  All hidd
c070: 65 6e 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 69  en columns are i
c080: 6e 63 6c 75 64 65 64 2e 0d 0a 20 20 20 20 20 20  ncluded...      
c090: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
c0a0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
c0b0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 57  >..        /// W
c0c0: 68 65 6e 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73  hen doing an ins
c0d0: 65 72 74 20 77 69 74 68 6f 75 74 20 61 20 72 6f  ert without a ro
c0e0: 77 69 64 20 28 61 72 67 63 3e 31 2c 20 61 72 67  wid (argc>1, arg
c0f0: 76 5b 31 5d 20 69 73 20 61 6e 20 53 51 4c 20 4e  v[1] is an SQL N
c100: 55 4c 4c 29 2c 20 74 68 65 20 0d 0a 20 20 20 20  ULL), the ..    
c110: 20 20 20 20 2f 2f 2f 20 69 6d 70 6c 65 6d 65 6e      /// implemen
c120: 74 61 74 69 6f 6e 20 6d 75 73 74 20 73 65 74 20  tation must set 
c130: 2a 70 52 6f 77 69 64 20 74 6f 20 74 68 65 20 72  *pRowid to the r
c140: 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65 77 6c  owid of the newl
c150: 79 20 69 6e 73 65 72 74 65 64 20 72 6f 77 3b 20  y inserted row; 
c160: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
c170: 69 73 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  is will become t
c180: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c190: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
c1a0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
c1b0: 69 64 28 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f  id()..        //
c1c0: 2f 20 66 75 6e 63 74 69 6f 6e 2e 20 53 65 74 74  / function. Sett
c1d0: 69 6e 67 20 74 68 69 73 20 76 61 6c 75 65 20 69  ing this value i
c1e0: 6e 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  n all the other 
c1f0: 63 61 73 65 73 20 69 73 20 61 20 68 61 72 6d 6c  cases is a harml
c200: 65 73 73 20 6e 6f 2d 6f 70 3b 0d 0a 20 20 20 20  ess no-op;..    
c210: 20 20 20 20 2f 2f 2f 20 74 68 65 20 53 51 4c 69      /// the SQLi
c220: 74 65 20 65 6e 67 69 6e 65 20 69 67 6e 6f 72 65  te engine ignore
c230: 73 20 74 68 65 20 2a 70 52 6f 77 69 64 20 72 65  s the *pRowid re
c240: 74 75 72 6e 20 76 61 6c 75 65 20 69 66 20 61 72  turn value if ar
c250: 67 63 3d 3d 31 20 6f 72 20 0d 0a 20 20 20 20 20  gc==1 or ..     
c260: 20 20 20 2f 2f 2f 20 61 72 67 76 5b 31 5d 20 69     /// argv[1] i
c270: 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 4e 55 4c  s not an SQL NUL
c280: 4c 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  L...        /// 
c290: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
c2a0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
c2b0: 20 20 20 20 20 2f 2f 2f 20 45 61 63 68 20 63 61       /// Each ca
c2c0: 6c 6c 20 74 6f 20 78 55 70 64 61 74 65 20 77 69  ll to xUpdate wi
c2d0: 6c 6c 20 66 61 6c 6c 20 69 6e 74 6f 20 6f 6e 65  ll fall into one
c2e0: 20 6f 66 20 63 61 73 65 73 20 73 68 6f 77 6e 20   of cases shown 
c2f0: 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  below...        
c300: 2f 2f 2f 20 4e 6f 74 20 74 68 61 74 20 72 65 66  /// Not that ref
c310: 65 72 65 6e 63 65 73 20 74 6f 20 3c 21 5b 43 44  erences to <![CD
c320: 41 54 41 5b 3c 62 3e 5d 5d 3e 61 72 67 76 5b 69  ATA[<b>]]>argv[i
c330: 5d 3c 21 5b 43 44 41 54 41 5b 3c 2f 62 3e 5d 5d  ]<![CDATA[</b>]]
c340: 3e 20 6d 65 61 6e 20 74 68 65 20 53 51 4c 20 76  > mean the SQL v
c350: 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f  alue..        //
c360: 2f 20 68 65 6c 64 20 77 69 74 68 69 6e 20 74 68  / held within th
c370: 65 20 61 72 67 76 5b 69 5d 20 6f 62 6a 65 63 74  e argv[i] object
c380: 2c 20 6e 6f 74 20 74 68 65 20 61 72 67 76 5b 69  , not the argv[i
c390: 5d 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6f  ]..        /// o
c3a0: 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0d 0a 20  bject itself... 
c3b0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
c3c0: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
c3d0: 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20  <para><code>..  
c3e0: 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41        /// <![CDA
c3f0: 54 41 5b 3c 64 6c 3e 5d 5d 3e 0d 0a 20 20 20 20  TA[<dl>]]>..    
c400: 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41      /// <![CDATA
c410: 5b 3c 64 74 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41  [<dt>]]><![CDATA
c420: 5b 3c 62 3e 5d 5d 3e 61 72 67 63 20 3d 20 31 3c  [<b>]]>argc = 1<
c430: 21 5b 43 44 41 54 41 5b 3c 2f 62 3e 5d 5d 3e 0d  ![CDATA[</b>]]>.
c440: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b  .        /// <![
c450: 43 44 41 54 41 5b 3c 64 64 3e 5d 5d 3e 54 68 65  CDATA[<dd>]]>The
c460: 20 73 69 6e 67 6c 65 20 72 6f 77 20 77 69 74 68   single row with
c470: 20 72 6f 77 69 64 20 65 71 75 61 6c 20 74 6f 20   rowid equal to 
c480: 61 72 67 76 5b 30 5d 20 69 73 20 64 65 6c 65 74  argv[0] is delet
c490: 65 64 2e 20 4e 6f 20 69 6e 73 65 72 74 20 6f 63  ed. No insert oc
c4a0: 63 75 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 2f  curs...        /
c4b0: 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 64 74 3e  // <![CDATA[<dt>
c4c0: 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 62 3e 5d  ]]><![CDATA[<b>]
c4d0: 5d 3e 61 72 67 63 20 26 67 74 3b 20 31 20 3c 21  ]>argc &gt; 1 <!
c4e0: 5b 43 44 41 54 41 5b 3c 62 72 3e 5d 5d 3e 20 61  [CDATA[<br>]]> a
c4f0: 72 67 76 5b 30 5d 20 3d 20 4e 55 4c 4c 3c 21 5b  rgv[0] = NULL<![
c500: 43 44 41 54 41 5b 3c 2f 62 3e 5d 5d 3e 0d 0a 20  CDATA[</b>]]>.. 
c510: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44         /// <![CD
c520: 41 54 41 5b 3c 64 64 3e 5d 5d 3e 41 20 6e 65 77  ATA[<dd>]]>A new
c530: 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64   row is inserted
c540: 20 77 69 74 68 20 61 20 72 6f 77 69 64 20 61 72   with a rowid ar
c550: 67 76 5b 31 5d 20 61 6e 64 20 63 6f 6c 75 6d 6e  gv[1] and column
c560: 20 76 61 6c 75 65 73 20 69 6e 0d 0a 20 20 20 20   values in..    
c570: 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 61      ///        a
c580: 72 67 76 5b 32 5d 20 61 6e 64 20 66 6f 6c 6c 6f  rgv[2] and follo
c590: 77 69 6e 67 2e 20 20 49 66 20 61 72 67 76 5b 31  wing.  If argv[1
c5a0: 5d 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  ] is an SQL NULL
c5b0: 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20  ,..        ///  
c5c0: 20 20 20 20 20 20 74 68 65 20 61 20 6e 65 77 20        the a new 
c5d0: 75 6e 69 71 75 65 20 72 6f 77 69 64 20 69 73 20  unique rowid is 
c5e0: 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61  generated automa
c5f0: 74 69 63 61 6c 6c 79 2e 0d 0a 20 20 20 20 20 20  tically...      
c600: 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c    /// <![CDATA[<
c610: 64 74 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c  dt>]]><![CDATA[<
c620: 62 3e 5d 5d 3e 61 72 67 63 20 26 67 74 3b 20 31  b>]]>argc &gt; 1
c630: 20 3c 21 5b 43 44 41 54 41 5b 3c 62 72 3e 5d 5d   <![CDATA[<br>]]
c640: 3e 20 61 72 67 76 5b 30 5d 20 26 23 38 38 30 30  > argv[0] &#8800
c650: 3b 20 4e 55 4c 4c 20 3c 21 5b 43 44 41 54 41 5b  ; NULL <![CDATA[
c660: 3c 62 72 3e 5d 5d 3e 20 61 72 67 76 5b 30 5d 20  <br>]]> argv[0] 
c670: 3d 20 61 72 67 76 5b 31 5d 3c 21 5b 43 44 41 54  = argv[1]<![CDAT
c680: 41 5b 3c 2f 62 3e 5d 5d 3e 0d 0a 20 20 20 20 20  A[</b>]]>..     
c690: 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b     /// <![CDATA[
c6a0: 3c 64 64 3e 5d 5d 3e 54 68 65 20 72 6f 77 20 77  <dd>]]>The row w
c6b0: 69 74 68 20 72 6f 77 69 64 20 61 72 67 76 5b 30  ith rowid argv[0
c6c0: 5d 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  ] is updated wit
c6d0: 68 20 6e 65 77 20 76 61 6c 75 65 73 20 0d 0a 20  h new values .. 
c6e0: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 20         ///      
c6f0: 20 20 69 6e 20 61 72 67 76 5b 32 5d 20 61 6e 64    in argv[2] and
c700: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
c710: 65 74 65 72 73 2e 0d 0a 20 20 20 20 20 20 20 20  eters...        
c720: 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 64 74  /// <![CDATA[<dt
c730: 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 62 3e  >]]><![CDATA[<b>
c740: 5d 5d 3e 61 72 67 63 20 26 67 74 3b 20 31 20 3c  ]]>argc &gt; 1 <
c750: 21 5b 43 44 41 54 41 5b 3c 62 72 3e 5d 5d 3e 20  ![CDATA[<br>]]> 
c760: 61 72 67 76 5b 30 5d 20 26 23 38 38 30 30 3b 20  argv[0] &#8800; 
c770: 4e 55 4c 4c 20 3c 21 5b 43 44 41 54 41 5b 3c 62  NULL <![CDATA[<b
c780: 72 3e 5d 5d 3e 20 61 72 67 76 5b 30 5d 20 26 23  r>]]> argv[0] &#
c790: 38 38 30 30 3b 20 61 72 67 76 5b 31 5d 3c 21 5b  8800; argv[1]<![
c7a0: 43 44 41 54 41 5b 3c 2f 62 3e 5d 5d 3e 0d 0a 20  CDATA[</b>]]>.. 
c7b0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44         /// <![CD
c7c0: 41 54 41 5b 3c 64 64 3e 5d 5d 3e 20 54 68 65 20  ATA[<dd>]]> The 
c7d0: 72 6f 77 20 77 69 74 68 20 72 6f 77 69 64 20 61  row with rowid a
c7e0: 72 67 76 5b 30 5d 20 69 73 20 75 70 64 61 74 65  rgv[0] is update
c7f0: 64 20 77 69 74 68 20 72 6f 77 69 64 20 61 72 67  d with rowid arg
c800: 76 5b 31 5d 20 0d 0a 20 20 20 20 20 20 20 20 2f  v[1] ..        /
c810: 2f 2f 20 61 6e 64 20 6e 65 77 20 76 61 6c 75 65  // and new value
c820: 73 20 69 6e 20 61 72 67 76 5b 32 5d 20 61 6e 64  s in argv[2] and
c830: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
c840: 65 74 65 72 73 2e 20 54 68 69 73 20 77 69 6c 6c  eters. This will
c850: 20 6f 63 63 75 72 20 0d 0a 20 20 20 20 20 20 20   occur ..       
c860: 20 2f 2f 2f 20 77 68 65 6e 20 61 6e 20 53 51 4c   /// when an SQL
c870: 20 73 74 61 74 65 6d 65 6e 74 20 75 70 64 61 74   statement updat
c880: 65 73 20 61 20 72 6f 77 69 64 2c 20 61 73 20 69  es a rowid, as i
c890: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 3a  n the statement:
c8a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
c8b0: 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20  ara><code>..    
c8c0: 20 20 20 20 2f 2f 2f 20 20 20 20 55 50 44 41 54      ///    UPDAT
c8d0: 45 20 74 61 62 6c 65 20 53 45 54 20 72 6f 77 69  E table SET rowi
c8e0: 64 3d 72 6f 77 69 64 2b 31 20 57 48 45 52 45 20  d=rowid+1 WHERE 
c8f0: 2e 2e 2e 3b 20 0d 0a 20 20 20 20 20 20 20 20 2f  ...; ..        /
c900: 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61  // </code></para
c910: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
c920: 21 5b 43 44 41 54 41 5b 3c 2f 64 6c 3e 5d 5d 3e  ![CDATA[</dl>]]>
c930: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
c940: 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20  code></para>..  
c950: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
c960: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
c970: 65 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64  e xUpdate method
c980: 20 6d 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   must return SQL
c990: 49 54 45 5f 4f 4b 20 69 66 20 61 6e 64 20 6f 6e  ITE_OK if and on
c9a0: 6c 79 20 69 66 20 69 74 20 69 73 0d 0a 20 20 20  ly if it is..   
c9b0: 20 20 20 20 20 2f 2f 2f 20 73 75 63 63 65 73 73       /// success
c9c0: 66 75 6c 2e 20 20 49 66 20 61 20 66 61 69 6c 75  ful.  If a failu
c9d0: 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 78  re occurs, the x
c9e0: 55 70 64 61 74 65 20 6d 75 73 74 20 72 65 74 75  Update must retu
c9f0: 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  rn an appropriat
ca00: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 65  e..        /// e
ca10: 72 72 6f 72 20 63 6f 64 65 2e 20 20 4f 6e 20 61  rror code.  On a
ca20: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 70 56   failure, the pV
ca30: 54 61 62 2d 3e 7a 45 72 72 4d 73 67 20 65 6c 65  Tab->zErrMsg ele
ca40: 6d 65 6e 74 20 6d 61 79 20 6f 70 74 69 6f 6e 61  ment may optiona
ca50: 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  lly..        ///
ca60: 20 62 65 20 72 65 70 6c 61 63 65 64 20 77 69 74   be replaced wit
ca70: 68 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  h error message 
ca80: 74 65 78 74 20 73 74 6f 72 65 64 20 69 6e 20 6d  text stored in m
ca90: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
caa0: 66 72 6f 6d 20 53 51 4c 69 74 65 20 0d 0a 20 20  from SQLite ..  
cab0: 20 20 20 20 20 20 2f 2f 2f 20 75 73 69 6e 67 20        /// using 
cac0: 66 75 6e 63 74 69 6f 6e 73 20 73 75 63 68 20 61  functions such a
cad0: 73 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  s sqlite3_mprint
cae0: 66 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6d  f() or sqlite3_m
caf0: 61 6c 6c 6f 63 28 29 2e 0d 0a 20 20 20 20 20 20  alloc()...      
cb00: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
cb10: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
cb20: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 49  >..        /// I
cb30: 66 20 74 68 65 20 78 55 70 64 61 74 65 20 6d 65  f the xUpdate me
cb40: 74 68 6f 64 20 76 69 6f 6c 61 74 65 73 20 73 6f  thod violates so
cb50: 6d 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66  me constraint of
cb60: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
cb70: 6c 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  le..        /// 
cb80: 28 69 6e 63 6c 75 64 69 6e 67 2c 20 62 75 74 20  (including, but 
cb90: 6e 6f 74 20 6c 69 6d 69 74 65 64 20 74 6f 2c 20  not limited to, 
cba0: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 74  attempting to st
cbb0: 6f 72 65 20 61 20 76 61 6c 75 65 20 6f 66 20 74  ore a value of t
cbc0: 68 65 20 77 72 6f 6e 67 20 0d 0a 20 20 20 20 20  he wrong ..     
cbd0: 20 20 20 2f 2f 2f 20 64 61 74 61 74 79 70 65 2c     /// datatype,
cbe0: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73   attempting to s
cbf0: 74 6f 72 65 20 61 20 76 61 6c 75 65 20 74 68 61  tore a value tha
cc00: 74 20 69 73 20 74 6f 6f 0d 0a 20 20 20 20 20 20  t is too..      
cc10: 20 20 2f 2f 2f 20 6c 61 72 67 65 20 6f 72 20 74    /// large or t
cc20: 6f 6f 20 73 6d 61 6c 6c 2c 20 6f 72 20 61 74 74  oo small, or att
cc30: 65 6d 70 74 69 6e 67 20 74 6f 20 63 68 61 6e 67  empting to chang
cc40: 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 76 61  e a read-only va
cc50: 6c 75 65 29 20 74 68 65 6e 20 74 68 65 0d 0a 20  lue) then the.. 
cc60: 20 20 20 20 20 20 20 2f 2f 2f 20 78 55 70 64 61         /// xUpda
cc70: 74 65 20 6d 75 73 74 20 66 61 69 6c 20 77 69 74  te must fail wit
cc80: 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  h an appropriate
cc90: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0d 0a 20 20   error code...  
cca0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
ccb0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
ccc0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
ccd0: 2f 2f 20 54 68 65 72 65 20 6d 69 67 68 74 20 62  // There might b
cce0: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 71  e one or more sq
ccf0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
cd00: 72 20 6f 62 6a 65 63 74 73 20 6f 70 65 6e 20 61  r objects open a
cd10: 6e 64 20 69 6e 20 75 73 65 20 0d 0a 20 20 20 20  nd in use ..    
cd20: 20 20 20 20 2f 2f 2f 20 6f 6e 20 74 68 65 20 76      /// on the v
cd30: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 73  irtual table ins
cd40: 74 61 6e 63 65 20 61 6e 64 20 70 65 72 68 61 70  tance and perhap
cd50: 73 20 65 76 65 6e 20 6f 6e 20 74 68 65 20 72 6f  s even on the ro
cd60: 77 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  w of the virtual
cd70: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 61  ..        /// ta
cd80: 62 6c 65 20 77 68 65 6e 20 74 68 65 20 78 55 70  ble when the xUp
cd90: 64 61 74 65 20 6d 65 74 68 6f 64 20 69 73 20 69  date method is i
cda0: 6e 76 6f 6b 65 64 2e 20 20 54 68 65 20 69 6d 70  nvoked.  The imp
cdb0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 0d 0a  lementation of..
cdc0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 78 55 70 64          /// xUpd
cdd0: 61 74 65 20 6d 75 73 74 20 62 65 20 70 72 65 70  ate must be prep
cde0: 61 72 65 64 20 66 6f 72 20 61 74 74 65 6d 70 74  ared for attempt
cdf0: 73 20 74 6f 20 64 65 6c 65 74 65 20 6f 72 20 6d  s to delete or m
ce00: 6f 64 69 66 79 20 72 6f 77 73 20 6f 66 20 74 68  odify rows of th
ce10: 65 20 74 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  e table..       
ce20: 20 2f 2f 2f 20 6f 75 74 20 66 72 6f 6d 20 6f 74   /// out from ot
ce30: 68 65 72 20 65 78 69 73 74 69 6e 67 20 63 75 72  her existing cur
ce40: 73 6f 72 73 2e 20 20 49 66 20 74 68 65 20 76 69  sors.  If the vi
ce50: 72 74 75 61 6c 20 74 61 62 6c 65 20 63 61 6e 6e  rtual table cann
ce60: 6f 74 20 61 63 63 6f 6d 6d 6f 64 61 74 65 0d 0a  ot accommodate..
ce70: 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 75 63 68          /// such
ce80: 20 63 68 61 6e 67 65 73 2c 20 74 68 65 20 78 55   changes, the xU
ce90: 70 64 61 74 65 20 6d 65 74 68 6f 64 20 6d 75 73  pdate method mus
cea0: 74 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  t return an erro
ceb0: 72 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20  r code...       
cec0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
ced0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
cee0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
cef0: 65 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64  e xUpdate method
cf00: 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0d 0a 20   is optional... 
cf10: 20 20 20 20 20 20 20 2f 2f 2f 20 49 66 20 74 68         /// If th
cf20: 65 20 78 55 70 64 61 74 65 20 70 6f 69 6e 74 65  e xUpdate pointe
cf30: 72 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  r in the sqlite3
cf40: 5f 6d 6f 64 75 6c 65 20 66 6f 72 20 61 20 76 69  _module for a vi
cf50: 72 74 75 61 6c 20 74 61 62 6c 65 0d 0a 20 20 20  rtual table..   
cf60: 20 20 20 20 20 2f 2f 2f 20 69 73 20 61 20 4e 55       /// is a NU
cf70: 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 6e  LL pointer, then
cf80: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
cf90: 6c 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e  le is read-only.
cfa0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
cfb0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
cfc0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
cfd0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
cfe0: 6d 20 6e 61 6d 65 3d 22 70 56 74 61 62 22 3e 0d  m name="pVtab">.
cff0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
d000: 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20   native pointer 
d010: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
d020: 74 61 62 20 64 65 72 69 76 65 64 20 73 74 72 75  tab derived stru
d030: 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20  cture...        
d040: 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
d050: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
d060: 20 6e 61 6d 65 3d 22 61 72 67 63 22 3e 0d 0a 20   name="argc">.. 
d070: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
d080: 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 6f 72 20  umber of new or 
d090: 6d 6f 64 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  modified column 
d0a0: 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64  values contained
d0b0: 20 69 6e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   in..        ///
d0c0: 20 3c 70 61 72 61 6d 72 65 66 20 6e 61 6d 65 3d   <paramref name=
d0d0: 22 61 72 67 76 22 20 2f 3e 2e 0d 0a 20 20 20 20  "argv" />...    
d0e0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
d0f0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
d100: 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 76 22  aram name="argv"
d110: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
d120: 68 65 20 61 72 72 61 79 20 6f 66 20 6e 61 74 69  he array of nati
d130: 76 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  ve pointers to s
d140: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
d150: 75 63 74 75 72 65 73 20 63 6f 6e 74 61 69 6e 69  uctures containi
d160: 6e 67 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ng..        /// 
d170: 74 68 65 20 6e 65 77 20 6f 72 20 6d 6f 64 69 66  the new or modif
d180: 69 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  ied column value
d190: 73 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20 20  s, if any...    
d1a0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
d1b0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
d1c0: 61 72 61 6d 20 6e 61 6d 65 3d 22 72 6f 77 49 64  aram name="rowId
d1d0: 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ">..        /// 
d1e0: 55 70 6f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  Upon success, th
d1f0: 69 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  is parameter mus
d200: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 74 6f  t be modified to
d210: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 75 6e 69   contain the uni
d220: 71 75 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  que..        ///
d230: 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64 65   integer row ide
d240: 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20  ntifier for the 
d250: 72 6f 77 20 74 68 61 74 20 77 61 73 20 69 6e 73  row that was ins
d260: 65 72 74 65 64 2c 20 69 66 20 61 6e 79 2e 0d 0a  erted, if any...
d270: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
d280: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ram>..        //
d290: 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  / <returns>..   
d2a0: 20 20 20 20 20 2f 2f 2f 20 41 20 73 74 61 6e 64       /// A stand
d2b0: 61 72 64 20 53 51 4c 69 74 65 20 72 65 74 75 72  ard SQLite retur
d2c0: 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20  n code...       
d2d0: 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d   /// </returns>.
d2e0: 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 45  .        SQLiteE
d2f0: 72 72 6f 72 43 6f 64 65 20 78 55 70 64 61 74 65  rrorCode xUpdate
d300: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  (..            I
d310: 6e 74 50 74 72 20 70 56 74 61 62 2c 0d 0a 20 20  ntPtr pVtab,..  
d320: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 72            int ar
d330: 67 63 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  gc,..           
d340: 20 49 6e 74 50 74 72 20 61 72 67 76 2c 0d 0a 20   IntPtr argv,.. 
d350: 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 6c             ref l
d360: 6f 6e 67 20 72 6f 77 49 64 0d 0a 20 20 20 20 20  ong rowId..     
d370: 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20         );....   
d380: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
d390: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d3a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d3b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d3c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
d3d0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d          /// <sum
d3e0: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f  mary>..        /
d3f0: 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d  // <para><code>.
d400: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 69  .        ///   i
d410: 6e 74 20 28 2a 78 42 65 67 69 6e 29 28 73 71 6c  nt (*xBegin)(sql
d420: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62  ite3_vtab *pVTab
d430: 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  );..        /// 
d440: 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a  </code></para>..
d450: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
d460: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
d470: 54 68 69 73 20 6d 65 74 68 6f 64 20 62 65 67 69  This method begi
d480: 6e 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ns a transaction
d490: 20 6f 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   on a virtual ta
d4a0: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ble...        //
d4b0: 2f 20 54 68 69 73 20 69 73 20 6d 65 74 68 6f 64  / This is method
d4c0: 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 54   is optional.  T
d4d0: 68 65 20 78 42 65 67 69 6e 20 70 6f 69 6e 74 65  he xBegin pointe
d4e0: 72 20 6f 66 20 73 71 6c 69 74 65 33 5f 6d 6f 64  r of sqlite3_mod
d4f0: 75 6c 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ule..        ///
d500: 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 0d 0a 20   may be NULL... 
d510: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
d520: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
d530: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
d540: 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20  /// This method 
d550: 69 73 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77  is always follow
d560: 65 64 20 62 79 20 6f 6e 65 20 63 61 6c 6c 20 74  ed by one call t
d570: 6f 20 65 69 74 68 65 72 20 74 68 65 0d 0a 20 20  o either the..  
d580: 20 20 20 20 20 20 2f 2f 2f 20 78 43 6f 6d 6d 69        /// xCommi
d590: 74 20 6f 72 20 78 52 6f 6c 6c 62 61 63 6b 20 6d  t or xRollback m
d5a0: 65 74 68 6f 64 2e 20 20 56 69 72 74 75 61 6c 20  ethod.  Virtual 
d5b0: 74 61 62 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  table transactio
d5c0: 6e 73 20 64 6f 0d 0a 20 20 20 20 20 20 20 20 2f  ns do..        /
d5d0: 2f 2f 20 6e 6f 74 20 6e 65 73 74 2c 20 73 6f 20  // not nest, so 
d5e0: 74 68 65 20 78 42 65 67 69 6e 20 6d 65 74 68 6f  the xBegin metho
d5f0: 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 69 6e  d will not be in
d600: 76 6f 6b 65 64 20 6d 6f 72 65 20 74 68 61 6e 20  voked more than 
d610: 6f 6e 63 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f  once..        //
d620: 2f 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 76 69  / on a single vi
d630: 72 74 75 61 6c 20 74 61 62 6c 65 0d 0a 20 20 20  rtual table..   
d640: 20 20 20 20 20 2f 2f 2f 20 77 69 74 68 6f 75 74       /// without
d650: 20 61 6e 20 69 6e 74 65 72 76 65 6e 69 6e 67 20   an intervening 
d660: 63 61 6c 6c 20 74 6f 20 65 69 74 68 65 72 20 78  call to either x
d670: 43 6f 6d 6d 69 74 20 6f 72 20 78 52 6f 6c 6c 62  Commit or xRollb
d680: 61 63 6b 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ack...        //
d690: 2f 20 4d 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73  / Multiple calls
d6a0: 20 74 6f 20 6f 74 68 65 72 20 6d 65 74 68 6f 64   to other method
d6b0: 73 20 63 61 6e 20 61 6e 64 20 6c 69 6b 65 6c 79  s can and likely
d6c0: 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 6e 20 62   will occur in b
d6d0: 65 74 77 65 65 6e 0d 0a 20 20 20 20 20 20 20 20  etween..        
d6e0: 2f 2f 2f 20 74 68 65 20 78 42 65 67 69 6e 20 61  /// the xBegin a
d6f0: 6e 64 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nd the correspon
d700: 64 69 6e 67 20 78 43 6f 6d 6d 69 74 20 6f 72 20  ding xCommit or 
d710: 78 52 6f 6c 6c 62 61 63 6b 2e 0d 0a 20 20 20 20  xRollback...    
d720: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
d730: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73  .        /// </s
d740: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20  ummary>..       
d750: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
d760: 3d 22 70 56 74 61 62 22 3e 0d 0a 20 20 20 20 20  ="pVtab">..     
d770: 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69 76     /// The nativ
d780: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
d790: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 64 65   sqlite3_vtab de
d7a0: 72 69 76 65 64 20 73 74 72 75 63 74 75 72 65 2e  rived structure.
d7b0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
d7c0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20  param>..        
d7d0: 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20  /// <returns>.. 
d7e0: 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74 61         /// A sta
d7f0: 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72 65 74  ndard SQLite ret
d800: 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20  urn code...     
d810: 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73     /// </returns
d820: 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74  >..        SQLit
d830: 65 45 72 72 6f 72 43 6f 64 65 20 78 42 65 67 69  eErrorCode xBegi
d840: 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n(..            
d850: 49 6e 74 50 74 72 20 70 56 74 61 62 0d 0a 20 20  IntPtr pVtab..  
d860: 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a            );....
d870: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
d880: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d890: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d8a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d8b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
d8c0: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
d8d0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
d8e0: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64    /// <para><cod
d8f0: 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e>..        /// 
d900: 20 20 69 6e 74 20 28 2a 78 53 79 6e 63 29 28 73    int (*xSync)(s
d910: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
d920: 61 62 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ab);..        //
d930: 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e  / </code></para>
d940: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
d950: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
d960: 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20 73 69  / This method si
d970: 67 6e 61 6c 73 20 74 68 65 20 73 74 61 72 74 20  gnals the start 
d980: 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
d990: 6f 6d 6d 69 74 20 6f 6e 20 61 20 76 69 72 74 75  ommit on a virtu
d9a0: 61 6c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  al..        /// 
d9b0: 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  table...        
d9c0: 2f 2f 2f 20 54 68 69 73 20 69 73 20 6d 65 74 68  /// This is meth
d9d0: 6f 64 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20  od is optional. 
d9e0: 20 54 68 65 20 78 53 79 6e 63 20 70 6f 69 6e 74   The xSync point
d9f0: 65 72 20 6f 66 20 73 71 6c 69 74 65 33 5f 6d 6f  er of sqlite3_mo
da00: 64 75 6c 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f  dule..        //
da10: 2f 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 0d 0a  / may be NULL...
da20: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
da30: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
da40: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
da50: 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f 64   /// This method
da60: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
da70: 20 61 66 74 65 72 20 63 61 6c 6c 20 74 6f 20 74   after call to t
da80: 68 65 20 78 42 65 67 69 6e 20 6d 65 74 68 6f 64  he xBegin method
da90: 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 2f 2f   and..        //
daa0: 2f 20 70 72 69 6f 72 20 74 6f 20 61 6e 20 78 43  / prior to an xC
dab0: 6f 6d 6d 69 74 20 6f 72 20 78 52 6f 6c 6c 62 61  ommit or xRollba
dac0: 63 6b 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  ck.  In order to
dad0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 77 6f 2d 70   implement two-p
dae0: 68 61 73 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f  hase..        //
daf0: 2f 20 63 6f 6d 6d 69 74 2c 20 74 68 65 20 78 53  / commit, the xS
db00: 79 6e 63 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6c  ync method on al
db10: 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  l virtual tables
db20: 20 69 73 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   is invoked prio
db30: 72 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 2f 2f  r to..        //
db40: 2f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 78  / invoking the x
db50: 43 6f 6d 6d 69 74 20 6d 65 74 68 6f 64 20 6f 6e  Commit method on
db60: 20 61 6e 79 20 76 69 72 74 75 61 6c 20 74 61 62   any virtual tab
db70: 6c 65 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74  le.  If any of t
db80: 68 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  he ..        ///
db90: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 73 20 66   xSync methods f
dba0: 61 69 6c 2c 20 74 68 65 20 65 6e 74 69 72 65 20  ail, the entire 
dbb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
dbc0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0d 0a 20 20 20  olled back...   
dbd0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
dbe0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
dbf0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
dc00: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
dc10: 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20 20 20 20  e="pVtab">..    
dc20: 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69      /// The nati
dc30: 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ve pointer to th
dc40: 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 64  e sqlite3_vtab d
dc50: 65 72 69 76 65 64 20 73 74 72 75 63 74 75 72 65  erived structure
dc60: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
dc70: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
dc80: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a   /// <returns>..
dc90: 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74          /// A st
dca0: 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72 65  andard SQLite re
dcb0: 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20  turn code...    
dcc0: 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e      /// </return
dcd0: 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69  s>..        SQLi
dce0: 74 65 45 72 72 6f 72 43 6f 64 65 20 78 53 79 6e  teErrorCode xSyn
dcf0: 63 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  c(..            
dd00: 49 6e 74 50 74 72 20 70 56 74 61 62 0d 0a 20 20  IntPtr pVtab..  
dd10: 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a            );....
dd20: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
dd30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dd40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dd50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dd60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
dd70: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
dd80: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
dd90: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64    /// <para><cod
dda0: 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e>..        /// 
ddb0: 20 20 69 6e 74 20 28 2a 78 43 6f 6d 6d 69 74 29    int (*xCommit)
ddc0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
ddd0: 56 54 61 62 29 3b 0d 0a 20 20 20 20 20 20 20 20  VTab);..        
dde0: 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72  /// </code></par
ddf0: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
de00: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
de10: 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20  /// This method 
de20: 63 61 75 73 65 73 20 61 20 76 69 72 74 75 61 6c  causes a virtual
de30: 20 74 61 62 6c 65 20 74 72 61 6e 73 61 63 74 69   table transacti
de40: 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 2e 0d 0a 20  on to commit... 
de50: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20         /// This 
de60: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 6f 70 74  is method is opt
de70: 69 6f 6e 61 6c 2e 20 20 54 68 65 20 78 43 6f 6d  ional.  The xCom
de80: 6d 69 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 73  mit pointer of s
de90: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 0d 0a 20  qlite3_module.. 
dea0: 20 20 20 20 20 20 20 2f 2f 2f 20 6d 61 79 20 62         /// may b
deb0: 65 20 4e 55 4c 4c 2e 0d 0a 20 20 20 20 20 20 20  e NULL...       
dec0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
ded0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
dee0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20  ..        /// A 
def0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 6d 65 74  call to this met
df00: 68 6f 64 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f  hod always follo
df10: 77 73 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  ws a prior call 
df20: 74 6f 20 78 42 65 67 69 6e 20 61 6e 64 0d 0a 20  to xBegin and.. 
df30: 20 20 20 20 20 20 20 2f 2f 2f 20 78 53 79 6e 63         /// xSync
df40: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
df50: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
df60: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
df70: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
df80: 61 6d 20 6e 61 6d 65 3d 22 70 56 74 61 62 22 3e  am name="pVtab">
df90: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
dfa0: 65 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72  e native pointer
dfb0: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
dfc0: 76 74 61 62 20 64 65 72 69 76 65 64 20 73 74 72  vtab derived str
dfd0: 75 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20  ucture...       
dfe0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20   /// </param>.. 
dff0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75         /// <retu
e000: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  rns>..        //
e010: 2f 20 41 20 73 74 61 6e 64 61 72 64 20 53 51 4c  / A standard SQL
e020: 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ite return code.
e030: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
e040: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20  returns>..      
e050: 20 20 53 51 4c 69 74 65 45 72 72 6f 72 43 6f 64    SQLiteErrorCod
e060: 65 20 78 43 6f 6d 6d 69 74 28 0d 0a 20 20 20 20  e xCommit(..    
e070: 20 20 20 20 20 20 20 20 49 6e 74 50 74 72 20 70          IntPtr p
e080: 56 74 61 62 0d 0a 20 20 20 20 20 20 20 20 20 20  Vtab..          
e090: 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20    );....        
e0a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e0b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e0c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e0d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e0e0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
e0f0: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
e100: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
e110: 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20  ara><code>..    
e120: 20 20 20 20 2f 2f 2f 20 20 20 69 6e 74 20 28 2a      ///   int (*
e130: 78 52 6f 6c 6c 62 61 63 6b 29 28 73 71 6c 69 74  xRollback)(sqlit
e140: 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 29 3b  e3_vtab *pVTab);
e150: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
e160: 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20  code></para>..  
e170: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
e180: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
e190: 69 73 20 6d 65 74 68 6f 64 20 63 61 75 73 65 73  is method causes
e1a0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
e1b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
e1c0: 72 6f 6c 6c 62 61 63 6b 2e 0d 0a 20 20 20 20 20  rollback...     
e1d0: 20 20 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 6d     /// This is m
e1e0: 65 74 68 6f 64 20 69 73 20 6f 70 74 69 6f 6e 61  ethod is optiona
e1f0: 6c 2e 20 20 54 68 65 20 78 52 6f 6c 6c 62 61 63  l.  The xRollbac
e200: 6b 20 70 6f 69 6e 74 65 72 20 6f 66 20 73 71 6c  k pointer of sql
e210: 69 74 65 33 5f 6d 6f 64 75 6c 65 0d 0a 20 20 20  ite3_module..   
e220: 20 20 20 20 20 2f 2f 2f 20 6d 61 79 20 62 65 20       /// may be 
e230: 4e 55 4c 4c 2e 0d 0a 20 20 20 20 20 20 20 20 2f  NULL...        /
e240: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
e250: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
e260: 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 63 61          /// A ca
e270: 6c 6c 20 74 6f 20 74 68 69 73 20 6d 65 74 68 6f  ll to this metho
e280: 64 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 73  d always follows
e290: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
e2a0: 20 78 42 65 67 69 6e 2e 0d 0a 20 20 20 20 20 20   xBegin...      
e2b0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
e2c0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d         /// </sum
e2d0: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f  mary>..        /
e2e0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
e2f0: 70 56 74 61 62 22 3e 0d 0a 20 20 20 20 20 20 20  pVtab">..       
e300: 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69 76 65 20   /// The native 
e310: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
e320: 71 6c 69 74 65 33 5f 76 74 61 62 20 64 65 72 69  qlite3_vtab deri
e330: 76 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a  ved structure...
e340: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
e350: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ram>..        //
e360: 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  / <returns>..   
e370: 20 20 20 20 20 2f 2f 2f 20 41 20 73 74 61 6e 64       /// A stand
e380: 61 72 64 20 53 51 4c 69 74 65 20 72 65 74 75 72  ard SQLite retur
e390: 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20  n code...       
e3a0: 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d   /// </returns>.
e3b0: 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 45  .        SQLiteE
e3c0: 72 72 6f 72 43 6f 64 65 20 78 52 6f 6c 6c 62 61  rrorCode xRollba
e3d0: 63 6b 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ck(..           
e3e0: 20 49 6e 74 50 74 72 20 70 56 74 61 62 0d 0a 20   IntPtr pVtab.. 
e3f0: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d             );...
e400: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
e410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e450: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ....        /// 
e460: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  <summary>..     
e470: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f     /// <para><co
e480: 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  de>..        ///
e490: 20 20 20 69 6e 74 20 28 2a 78 46 69 6e 64 46 75     int (*xFindFu
e4a0: 6e 63 74 69 6f 6e 29 28 0d 0a 20 20 20 20 20 20  nction)(..      
e4b0: 20 20 2f 2f 2f 20 20 20 20 20 73 71 6c 69 74 65    ///     sqlite
e4c0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 0d 0a  3_vtab *pVtab,..
e4d0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20          ///     
e4e0: 69 6e 74 20 6e 41 72 67 2c 0d 0a 20 20 20 20 20  int nArg,..     
e4f0: 20 20 20 2f 2f 2f 20 20 20 20 20 63 6f 6e 73 74     ///     const
e500: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0d 0a 20   char *zName,.. 
e510: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 76         ///     v
e520: 6f 69 64 20 28 2a 2a 70 78 46 75 6e 63 29 28 73  oid (**pxFunc)(s
e530: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
e540: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
e550: 65 2a 2a 29 2c 0d 0a 20 20 20 20 20 20 20 20 2f  e**),..        /
e560: 2f 2f 20 20 20 20 20 76 6f 69 64 20 2a 2a 70 70  //     void **pp
e570: 41 72 67 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  Arg..        ///
e580: 20 20 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f     );..        /
e590: 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61  // </code></para
e5a0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
e5b0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
e5c0: 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69  // This method i
e5d0: 73 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  s called during 
e5e0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
e5f0: 29 20 74 6f 20 67 69 76 65 20 74 68 65 20 76 69  ) to give the vi
e600: 72 74 75 61 6c 0d 0a 20 20 20 20 20 20 20 20 2f  rtual..        /
e610: 2f 2f 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65  // table impleme
e620: 6e 74 61 74 69 6f 6e 20 61 6e 20 6f 70 70 6f 72  ntation an oppor
e630: 74 75 6e 69 74 79 20 74 6f 20 6f 76 65 72 6c 6f  tunity to overlo
e640: 61 64 20 66 75 6e 63 74 69 6f 6e 73 2e 20 0d 0a  ad functions. ..
e650: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73          /// This
e660: 20 6d 65 74 68 6f 64 20 6d 61 79 20 62 65 20 73   method may be s
e670: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 77 68  et to NULL in wh
e680: 69 63 68 20 63 61 73 65 20 6e 6f 20 6f 76 65 72  ich case no over
e690: 6c 6f 61 64 69 6e 67 20 6f 63 63 75 72 73 2e 0d  loading occurs..
e6a0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
e6b0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
e6c0: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
e6d0: 20 20 2f 2f 2f 20 57 68 65 6e 20 61 20 66 75 6e    /// When a fun
e6e0: 63 74 69 6f 6e 20 75 73 65 73 20 61 20 63 6f 6c  ction uses a col
e6f0: 75 6d 6e 20 66 72 6f 6d 20 61 20 76 69 72 74 75  umn from a virtu
e700: 61 6c 20 74 61 62 6c 65 20 61 73 20 69 74 73 20  al table as its 
e710: 66 69 72 73 74 20 0d 0a 20 20 20 20 20 20 20 20  first ..        
e720: 2f 2f 2f 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  /// argument, th
e730: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  is method is cal
e740: 6c 65 64 20 74 6f 20 73 65 65 20 69 66 20 74 68  led to see if th
e750: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
e760: 77 6f 75 6c 64 20 0d 0a 20 20 20 20 20 20 20 20  would ..        
e770: 2f 2f 2f 20 6c 69 6b 65 20 74 6f 20 6f 76 65 72  /// like to over
e780: 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
e790: 6e 2e 20 54 68 65 20 66 69 72 73 74 20 74 68 72  n. The first thr
e7a0: 65 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ee parameters ar
e7b0: 65 20 69 6e 70 75 74 73 3a 20 0d 0a 20 20 20 20  e inputs: ..    
e7c0: 20 20 20 20 2f 2f 2f 20 74 68 65 20 76 69 72 74      /// the virt
e7d0: 75 61 6c 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  ual table, the n
e7e0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
e7f0: 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
e800: 6f 6e 2c 20 61 6e 64 20 74 68 65 20 0d 0a 20 20  on, and the ..  
e810: 20 20 20 20 20 20 2f 2f 2f 20 6e 61 6d 65 20 6f        /// name o
e820: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20  f the function. 
e830: 49 66 20 6e 6f 20 6f 76 65 72 6c 6f 61 64 69 6e  If no overloadin
e840: 67 20 69 73 20 64 65 73 69 72 65 64 2c 20 74 68  g is desired, th
e850: 69 73 20 6d 65 74 68 6f 64 0d 0a 20 20 20 20 20  is method..     
e860: 20 20 20 2f 2f 2f 20 72 65 74 75 72 6e 73 20 30     /// returns 0
e870: 2e 20 54 6f 20 6f 76 65 72 6c 6f 61 64 20 74 68  . To overload th
e880: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 69 73  e function, this
e890: 20 6d 65 74 68 6f 64 20 77 72 69 74 65 73 20 74   method writes t
e8a0: 68 65 20 6e 65 77 20 0d 0a 20 20 20 20 20 20 20  he new ..       
e8b0: 20 2f 2f 2f 20 66 75 6e 63 74 69 6f 6e 20 69 6d   /// function im
e8c0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
e8d0: 6f 20 2a 70 78 46 75 6e 63 20 61 6e 64 20 77 72  o *pxFunc and wr
e8e0: 69 74 65 73 20 75 73 65 72 20 64 61 74 61 20 69  ites user data i
e8f0: 6e 74 6f 20 2a 70 70 41 72 67 20 0d 0a 20 20 20  nto *ppArg ..   
e900: 20 20 20 20 20 2f 2f 2f 20 61 6e 64 20 72 65 74       /// and ret
e910: 75 72 6e 73 20 31 2e 0d 0a 20 20 20 20 20 20 20  urns 1...       
e920: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
e930: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
e940: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 4e 6f  ..        /// No
e950: 74 65 20 74 68 61 74 20 69 6e 66 69 78 20 66 75  te that infix fu
e960: 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
e970: 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
e980: 20 4d 41 54 43 48 29 20 72 65 76 65 72 73 65 20   MATCH) reverse 
e990: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
e9a0: 65 20 6f 72 64 65 72 20 6f 66 20 74 68 65 69 72  e order of their
e9b0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 53 6f 20 22   arguments. So "
e9c0: 6c 69 6b 65 28 41 2c 42 29 22 20 69 73 20 65 71  like(A,B)" is eq
e9d0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 22 42 20 6c  uivalent to "B l
e9e0: 69 6b 65 20 41 22 2e 20 0d 0a 20 20 20 20 20 20  ike A". ..      
e9f0: 20 20 2f 2f 2f 20 46 6f 72 20 74 68 65 20 66 6f    /// For the fo
ea00: 72 6d 20 22 42 20 6c 69 6b 65 20 41 22 20 74 68  rm "B like A" th
ea10: 65 20 42 20 74 65 72 6d 20 69 73 20 63 6f 6e 73  e B term is cons
ea20: 69 64 65 72 65 64 20 74 68 65 20 66 69 72 73 74  idered the first
ea30: 20 61 72 67 75 6d 65 6e 74 20 0d 0a 20 20 20 20   argument ..    
ea40: 20 20 20 20 2f 2f 2f 20 74 6f 20 74 68 65 20 66      /// to the f
ea50: 75 6e 63 74 69 6f 6e 2e 20 42 75 74 20 66 6f 72  unction. But for
ea60: 20 22 6c 69 6b 65 28 41 2c 42 29 22 20 74 68 65   "like(A,B)" the
ea70: 20 41 20 74 65 72 6d 20 69 73 20 63 6f 6e 73 69   A term is consi
ea80: 64 65 72 65 64 20 74 68 65 20 0d 0a 20 20 20 20  dered the ..    
ea90: 20 20 20 20 2f 2f 2f 20 66 69 72 73 74 20 61 72      /// first ar
eaa0: 67 75 6d 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20  gument...       
eab0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
eac0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
ead0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
eae0: 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  e function point
eaf0: 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
eb00: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
eb10: 20 62 65 20 76 61 6c 69 64 20 66 6f 72 0d 0a 20   be valid for.. 
eb20: 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 6c         /// the l
eb30: 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 73  ifetime of the s
eb40: 71 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65  qlite3_vtab obje
eb50: 63 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ct given in the 
eb60: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 2e  first parameter.
eb70: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
eb80: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
eb90: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
eba0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
ebb0: 6d 20 6e 61 6d 65 3d 22 70 56 74 61 62 22 3e 0d  m name="pVtab">.
ebc0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
ebd0: 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20   native pointer 
ebe0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
ebf0: 74 61 62 20 64 65 72 69 76 65 64 20 73 74 72 75  tab derived stru
ec00: 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20  cture...        
ec10: 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
ec20: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
ec30: 20 6e 61 6d 65 3d 22 6e 41 72 67 22 3e 0d 0a 20   name="nArg">.. 
ec40: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
ec50: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
ec60: 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
ec70: 6f 6e 20 62 65 69 6e 67 20 73 6f 75 67 68 74 2e  on being sought.
ec80: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
ec90: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20  param>..        
eca0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
ecb0: 22 7a 4e 61 6d 65 22 3e 0d 0a 20 20 20 20 20 20  "zName">..      
ecc0: 20 20 2f 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f    /// The name o
ecd0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 62  f the function b
ece0: 65 69 6e 67 20 73 6f 75 67 68 74 2e 0d 0a 20 20  eing sought...  
ecf0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
ed00: 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  m>..        /// 
ed10: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 61 6c  <param name="cal
ed20: 6c 62 61 63 6b 22 3e 0d 0a 20 20 20 20 20 20 20  lback">..       
ed30: 20 2f 2f 2f 20 55 70 6f 6e 20 73 75 63 63 65 73   /// Upon succes
ed40: 73 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  s, this paramete
ed50: 72 20 6d 75 73 74 20 62 65 20 6d 6f 64 69 66 69  r must be modifi
ed60: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
ed70: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 64  e..        /// d
ed80: 65 6c 65 67 61 74 65 20 72 65 73 70 6f 6e 73 69  elegate responsi
ed90: 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
eda0: 74 69 6e 67 20 74 68 65 20 73 70 65 63 69 66 69  ting the specifi
edb0: 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20  ed function...  
edc0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
edd0: 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  m>..        /// 
ede0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 43 6c  <param name="pCl
edf0: 69 65 6e 74 44 61 74 61 22 3e 0d 0a 20 20 20 20  ientData">..    
ee00: 20 20 20 20 2f 2f 2f 20 55 70 6f 6e 20 73 75 63      /// Upon suc
ee10: 63 65 73 73 2c 20 74 68 69 73 20 70 61 72 61 6d  cess, this param
ee20: 65 74 65 72 20 6d 75 73 74 20 62 65 20 6d 6f 64  eter must be mod
ee30: 69 66 69 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  ified to contain
ee40: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f   the..        //
ee50: 2f 20 6e 61 74 69 76 65 20 75 73 65 72 2d 64 61  / native user-da
ee60: 74 61 20 70 6f 69 6e 74 65 72 20 61 73 73 6f 63  ta pointer assoc
ee70: 69 61 74 65 64 20 77 69 74 68 0d 0a 20 20 20 20  iated with..    
ee80: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 72 65      /// <paramre
ee90: 66 20 6e 61 6d 65 3d 22 63 61 6c 6c 62 61 63 6b  f name="callback
eea0: 22 20 2f 3e 2e 0d 0a 20 20 20 20 20 20 20 20 2f  " />...        /
eeb0: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
eec0: 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e       /// <return
eed0: 73 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  s>..        /// 
eee0: 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  Non-zero if the 
eef0: 73 70 65 63 69 66 69 65 64 20 66 75 6e 63 74 69  specified functi
ef00: 6f 6e 20 77 61 73 20 66 6f 75 6e 64 3b 20 7a 65  on was found; ze
ef10: 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0d 0a 20  ro otherwise... 
ef20: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74         /// </ret
ef30: 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 69  urns>..        i
ef40: 6e 74 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e  nt xFindFunction
ef50: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  (..            I
ef60: 6e 74 50 74 72 20 70 56 74 61 62 2c 0d 0a 20 20  ntPtr pVtab,..  
ef70: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 41            int nA
ef80: 72 67 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rg,..           
ef90: 20 49 6e 74 50 74 72 20 7a 4e 61 6d 65 2c 0d 0a   IntPtr zName,..
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20              ref 
efb0: 53 51 4c 69 74 65 43 61 6c 6c 62 61 63 6b 20 63  SQLiteCallback c
efc0: 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20  allback,..      
efd0: 20 20 20 20 20 20 72 65 66 20 49 6e 74 50 74 72        ref IntPtr
efe0: 20 70 43 6c 69 65 6e 74 44 61 74 61 0d 0a 20 20   pClientData..  
eff0: 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a            );....
f000: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
f010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f020: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f040: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
f050: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
f060: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
f070: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64    /// <para><cod
f080: 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e>..        /// 
f090: 20 20 69 6e 74 20 28 2a 78 52 65 6e 61 6d 65 29    int (*xRename)
f0a0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
f0b0: 56 74 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  Vtab, const char
f0c0: 20 2a 7a 4e 65 77 29 3b 0d 0a 20 20 20 20 20 20   *zNew);..      
f0d0: 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70    /// </code></p
f0e0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
f0f0: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
f100: 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f    /// This metho
f110: 64 20 70 72 6f 76 69 64 65 73 20 6e 6f 74 69 66  d provides notif
f120: 69 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68 65  ication that the
f130: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
f140: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0d 0a 20  mplementation.. 
f150: 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 61 74 20         /// that 
f160: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
f170: 65 20 77 69 6c 6c 20 62 65 20 67 69 76 65 6e 20  e will be given 
f180: 61 20 6e 65 77 20 6e 61 6d 65 2e 20 0d 0a 20 20  a new name. ..  
f190: 20 20 20 20 20 20 2f 2f 2f 20 49 66 20 74 68 69        /// If thi
f1a0: 73 20 6d 65 74 68 6f 64 20 72 65 74 75 72 6e 73  s method returns
f1b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20   SQLITE_OK then 
f1c0: 53 51 4c 69 74 65 20 72 65 6e 61 6d 65 73 20 74  SQLite renames t
f1d0: 68 65 20 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20  he table...     
f1e0: 20 20 20 2f 2f 2f 20 49 66 20 74 68 69 73 20 6d     /// If this m
f1f0: 65 74 68 6f 64 20 72 65 74 75 72 6e 73 20 61 6e  ethod returns an
f200: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 65 6e   error code then
f210: 20 74 68 65 20 72 65 6e 61 6d 69 6e 67 20 69 73   the renaming is
f220: 20 70 72 65 76 65 6e 74 65 64 2e 0d 0a 20 20 20   prevented...   
f230: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
f240: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
f250: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
f260: 2f 20 54 68 65 20 78 52 65 6e 61 6d 65 20 6d 65  / The xRename me
f270: 74 68 6f 64 20 69 73 20 72 65 71 75 69 72 65 64  thod is required
f280: 20 66 6f 72 20 65 76 65 72 79 20 76 69 72 74 75   for every virtu
f290: 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65  al table impleme
f2a0: 6e 74 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  ntation...      
f2b0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
f2c0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d         /// </sum
f2d0: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f  mary>..        /
f2e0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
f2f0: 70 56 74 61 62 22 3e 0d 0a 20 20 20 20 20 20 20  pVtab">..       
f300: 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69 76 65 20   /// The native 
f310: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
f320: 71 6c 69 74 65 33 5f 76 74 61 62 20 64 65 72 69  qlite3_vtab deri
f330: 76 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a  ved structure...
f340: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
f350: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ram>..        //
f360: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 7a  / <param name="z
f370: 4e 65 77 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f  New">..        /
f380: 2f 2f 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f  // The native po
f390: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 55 54 46  inter to the UTF
f3a0: 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  -8 encoded strin
f3b0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
f3c0: 20 6e 65 77 0d 0a 20 20 20 20 20 20 20 20 2f 2f   new..        //
f3d0: 2f 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 76  / name for the v
f3e0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a 20  irtual table... 
f3f0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
f400: 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  am>..        ///
f410: 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20   <returns>..    
f420: 20 20 20 20 2f 2f 2f 20 41 20 73 74 61 6e 64 61      /// A standa
f430: 72 64 20 53 51 4c 69 74 65 20 72 65 74 75 72 6e  rd SQLite return
f440: 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20   code...        
f450: 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a  /// </returns>..
f460: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 45 72          SQLiteEr
f470: 72 6f 72 43 6f 64 65 20 78 52 65 6e 61 6d 65 28  rorCode xRename(
f480: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  ..            In
f490: 74 50 74 72 20 70 56 74 61 62 2c 0d 0a 20 20 20  tPtr pVtab,..   
f4a0: 20 20 20 20 20 20 20 20 20 49 6e 74 50 74 72 20           IntPtr 
f4b0: 7a 4e 65 77 0d 0a 20 20 20 20 20 20 20 20 20 20  zNew..          
f4c0: 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20    );....        
f4d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f4e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f4f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f510: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
f520: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
f530: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
f540: 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20  ara><code>..    
f550: 20 20 20 20 2f 2f 2f 20 20 20 69 6e 74 20 28 2a      ///   int (*
f560: 78 53 61 76 65 70 6f 69 6e 74 29 28 73 71 6c 69  xSavepoint)(sqli
f570: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
f580: 20 69 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20   int);..        
f590: 2f 2f 2f 20 20 20 69 6e 74 20 28 2a 78 52 65 6c  ///   int (*xRel
f5a0: 65 61 73 65 29 28 73 71 6c 69 74 65 33 5f 76 74  ease)(sqlite3_vt
f5b0: 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 29 3b  ab *pVtab, int);
f5c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
f5d0: 69 6e 74 20 28 2a 78 52 6f 6c 6c 62 61 63 6b 54  int (*xRollbackT
f5e0: 6f 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  o)(sqlite3_vtab 
f5f0: 2a 70 56 74 61 62 2c 20 69 6e 74 29 3b 0d 0a 20  *pVtab, int);.. 
f600: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64         /// </cod
f610: 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  e></para>..     
f620: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
f630: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 73 65         /// These
f640: 20 6d 65 74 68 6f 64 73 20 70 72 6f 76 69 64 65   methods provide
f650: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
f660: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
f670: 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
f680: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   to..        ///
f690: 20 69 6d 70 6c 65 6d 65 6e 74 20 6e 65 73 74 65   implement neste
f6a0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  d transactions. 
f6b0: 20 54 68 65 79 20 61 72 65 20 61 6c 77 61 79 73   They are always
f6c0: 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64 20 77 69   optional and wi
f6d0: 6c 6c 20 6f 6e 6c 79 20 62 65 0d 0a 20 20 20 20  ll only be..    
f6e0: 20 20 20 20 2f 2f 2f 20 63 61 6c 6c 65 64 20 69      /// called i
f6f0: 6e 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  n SQLite version
f700: 20 33 2e 37 2e 37 20 61 6e 64 20 6c 61 74 65 72   3.7.7 and later
f710: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
f720: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
f730: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
f740: 20 20 20 20 2f 2f 2f 20 57 68 65 6e 20 78 53 61      /// When xSa
f750: 76 65 70 6f 69 6e 74 28 58 2c 4e 29 20 69 73 20  vepoint(X,N) is 
f760: 69 6e 76 6f 6b 65 64 2c 20 74 68 61 74 20 69 73  invoked, that is
f770: 20 61 20 73 69 67 6e 61 6c 20 74 6f 20 74 68 65   a signal to the
f780: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 58   virtual table X
f790: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
f7a0: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 61 76  at it should sav
f7b0: 65 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 74  e its current st
f7c0: 61 74 65 20 61 73 20 73 61 76 65 70 6f 69 6e 74  ate as savepoint
f7d0: 20 4e 2e 20 20 0d 0a 20 20 20 20 20 20 20 20 2f   N.  ..        /
f7e0: 2f 2f 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  // A subsequent 
f7f0: 63 61 6c 6c 0d 0a 20 20 20 20 20 20 20 20 2f 2f  call..        //
f800: 2f 20 74 6f 20 78 52 6f 6c 6c 62 61 63 6b 54 6f  / to xRollbackTo
f810: 28 58 2c 52 29 20 6d 65 61 6e 73 20 74 68 61 74  (X,R) means that
f820: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
f830: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
f840: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0d 0a 20  should return.. 
f850: 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20 77 68         /// to wh
f860: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 78  at it was when x
f870: 53 61 76 65 70 6f 69 6e 74 28 58 2c 52 29 20 77  Savepoint(X,R) w
f880: 61 73 20 6c 61 73 74 20 63 61 6c 6c 65 64 2e 20  as last called. 
f890: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54   ..        /// T
f8a0: 68 65 20 63 61 6c 6c 0d 0a 20 20 20 20 20 20 20  he call..       
f8b0: 20 2f 2f 2f 20 74 6f 20 78 52 6f 6c 6c 62 61 63   /// to xRollbac
f8c0: 6b 54 6f 28 58 2c 52 29 20 77 69 6c 6c 20 69 6e  kTo(X,R) will in
f8d0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 73 61 76  validate all sav
f8e0: 65 70 6f 69 6e 74 73 20 77 69 74 68 20 4e 3e 52  epoints with N>R
f8f0: 3b 20 6e 6f 6e 65 20 6f 66 20 74 68 65 0d 0a 20  ; none of the.. 
f900: 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 76 61 6c         /// inval
f910: 69 64 65 64 20 73 61 76 65 70 6f 69 6e 74 73 20  ided savepoints 
f920: 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
f930: 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 64 20  ack or released 
f940: 77 69 74 68 6f 75 74 20 66 69 72 73 74 0d 0a 20  without first.. 
f950: 20 20 20 20 20 20 20 2f 2f 2f 20 62 65 69 6e 67         /// being
f960: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62   reinitialized b
f970: 79 20 61 20 63 61 6c 6c 20 74 6f 20 78 53 61 76  y a call to xSav
f980: 65 70 6f 69 6e 74 28 29 2e 20 20 0d 0a 20 20 20  epoint().  ..   
f990: 20 20 20 20 20 2f 2f 2f 20 41 20 63 61 6c 6c 20       /// A call 
f9a0: 74 6f 20 78 52 65 6c 65 61 73 65 28 58 2c 4d 29  to xRelease(X,M)
f9b0: 20 69 6e 76 61 6c 69 64 61 74 65 73 20 61 6c 6c   invalidates all
f9c0: 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 65 72   savepoints wher
f9d0: 65 20 4e 3e 3d 4d 2e 0d 0a 20 20 20 20 20 20 20  e N>=M...       
f9e0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
f9f0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
fa00: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 4e 6f  ..        /// No
fa10: 6e 65 20 6f 66 20 74 68 65 20 78 53 61 76 65 70  ne of the xSavep
fa20: 6f 69 6e 74 28 29 2c 20 78 52 65 6c 65 61 73 65  oint(), xRelease
fa30: 28 29 2c 20 6f 72 20 78 52 6f 6c 6c 62 61 63 6b  (), or xRollback
fa40: 54 6f 28 29 20 6d 65 74 68 6f 64 73 20 77 69 6c  To() methods wil
fa50: 6c 20 65 76 65 72 0d 0a 20 20 20 20 20 20 20 20  l ever..        
fa60: 2f 2f 2f 20 62 65 20 63 61 6c 6c 65 64 20 65 78  /// be called ex
fa70: 63 65 70 74 20 69 6e 20 62 65 74 77 65 65 6e 20  cept in between 
fa80: 63 61 6c 6c 73 20 74 6f 20 78 42 65 67 69 6e 28  calls to xBegin(
fa90: 29 20 61 6e 64 20 0d 0a 20 20 20 20 20 20 20 20  ) and ..        
faa0: 2f 2f 2f 20 65 69 74 68 65 72 20 78 43 6f 6d 6d  /// either xComm
fab0: 69 74 28 29 20 6f 72 20 78 52 6f 6c 6c 62 61 63  it() or xRollbac
fac0: 6b 28 29 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  k()...        //
fad0: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
fae0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
faf0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
fb00: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74 61  param name="pVta
fb10: 62 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  b">..        ///
fb20: 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f 69 6e   The native poin
fb30: 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ter to the sqlit
fb40: 65 33 5f 76 74 61 62 20 64 65 72 69 76 65 64 20  e3_vtab derived 
fb50: 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20 20  structure...    
fb60: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
fb70: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
fb80: 61 72 61 6d 20 6e 61 6d 65 3d 22 69 53 61 76 65  aram name="iSave
fb90: 70 6f 69 6e 74 22 3e 0d 0a 20 20 20 20 20 20 20  point">..       
fba0: 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 61 6e 20   /// This is an 
fbb0: 69 6e 74 65 67 65 72 20 69 64 65 6e 74 69 66 69  integer identifi
fbc0: 65 72 20 75 6e 64 65 72 20 77 68 69 63 68 20 74  er under which t
fbd0: 68 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  he the current s
fbe0: 74 61 74 65 20 6f 66 0d 0a 20 20 20 20 20 20 20  tate of..       
fbf0: 20 2f 2f 2f 20 74 68 65 20 76 69 72 74 75 61 6c   /// the virtual
fc00: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
fc10: 20 73 61 76 65 64 2e 0d 0a 20 20 20 20 20 20 20   saved...       
fc20: 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20   /// </param>.. 
fc30: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75         /// <retu
fc40: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  rns>..        //
fc50: 2f 20 41 20 73 74 61 6e 64 61 72 64 20 53 51 4c  / A standard SQL
fc60: 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ite return code.
fc70: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
fc80: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20  returns>..      
fc90: 20 20 53 51 4c 69 74 65 45 72 72 6f 72 43 6f 64    SQLiteErrorCod
fca0: 65 20 78 53 61 76 65 70 6f 69 6e 74 28 0d 0a 20  e xSavepoint(.. 
fcb0: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 50 74             IntPt
fcc0: 72 20 70 56 74 61 62 2c 0d 0a 20 20 20 20 20 20  r pVtab,..      
fcd0: 20 20 20 20 20 20 69 6e 74 20 69 53 61 76 65 70        int iSavep
fce0: 6f 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 20  oint..          
fcf0: 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20    );....        
fd00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fd10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fd20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fd30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fd40: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
fd50: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
fd60: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
fd70: 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20  ara><code>..    
fd80: 20 20 20 20 2f 2f 2f 20 20 20 69 6e 74 20 28 2a      ///   int (*
fd90: 78 53 61 76 65 70 6f 69 6e 74 29 28 73 71 6c 69  xSavepoint)(sqli
fda0: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
fdb0: 20 69 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20   int);..        
fdc0: 2f 2f 2f 20 20 20 69 6e 74 20 28 2a 78 52 65 6c  ///   int (*xRel
fdd0: 65 61 73 65 29 28 73 71 6c 69 74 65 33 5f 76 74  ease)(sqlite3_vt
fde0: 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 29 3b  ab *pVtab, int);
fdf0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
fe00: 69 6e 74 20 28 2a 78 52 6f 6c 6c 62 61 63 6b 54  int (*xRollbackT
fe10: 6f 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  o)(sqlite3_vtab 
fe20: 2a 70 56 74 61 62 2c 20 69 6e 74 29 3b 0d 0a 20  *pVtab, int);.. 
fe30: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64         /// </cod
fe40: 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  e></para>..     
fe50: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
fe60: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 73 65         /// These
fe70: 20 6d 65 74 68 6f 64 73 20 70 72 6f 76 69 64 65   methods provide
fe80: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
fe90: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
fea0: 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
feb0: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   to..        ///
fec0: 20 69 6d 70 6c 65 6d 65 6e 74 20 6e 65 73 74 65   implement neste
fed0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  d transactions. 
fee0: 20 54 68 65 79 20 61 72 65 20 61 6c 77 61 79 73   They are always
fef0: 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64 20 77 69   optional and wi
ff00: 6c 6c 20 6f 6e 6c 79 20 62 65 0d 0a 20 20 20 20  ll only be..    
ff10: 20 20 20 20 2f 2f 2f 20 63 61 6c 6c 65 64 20 69      /// called i
ff20: 6e 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  n SQLite version
ff30: 20 33 2e 37 2e 37 20 61 6e 64 20 6c 61 74 65 72   3.7.7 and later
ff40: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
ff50: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
ff60: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
ff70: 20 20 20 20 2f 2f 2f 20 57 68 65 6e 20 78 53 61      /// When xSa
ff80: 76 65 70 6f 69 6e 74 28 58 2c 4e 29 20 69 73 20  vepoint(X,N) is 
ff90: 69 6e 76 6f 6b 65 64 2c 20 74 68 61 74 20 69 73  invoked, that is
ffa0: 20 61 20 73 69 67 6e 61 6c 20 74 6f 20 74 68 65   a signal to the
ffb0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 58   virtual table X
ffc0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
ffd0: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 61 76  at it should sav
ffe0: 65 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 74  e its current st
fff0: 61 74 65 20 61 73 20 73 61 76 65 70 6f 69 6e 74  ate as savepoint
10000 20 4e 2e 20 20 0d 0a 20 20 20 20 20 20 20 20 2f   N.  ..        /
10010 2f 2f 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  // A subsequent 
10020 63 61 6c 6c 0d 0a 20 20 20 20 20 20 20 20 2f 2f  call..        //
10030 2f 20 74 6f 20 78 52 6f 6c 6c 62 61 63 6b 54 6f  / to xRollbackTo
10040 28 58 2c 52 29 20 6d 65 61 6e 73 20 74 68 61 74  (X,R) means that
10050 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
10060 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
10070 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0d 0a 20  should return.. 
10080 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20 77 68         /// to wh
10090 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 78  at it was when x
100a0 53 61 76 65 70 6f 69 6e 74 28 58 2c 52 29 20 77  Savepoint(X,R) w
100b0 61 73 20 6c 61 73 74 20 63 61 6c 6c 65 64 2e 20  as last called. 
100c0 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54   ..        /// T
100d0 68 65 20 63 61 6c 6c 0d 0a 20 20 20 20 20 20 20  he call..       
100e0 20 2f 2f 2f 20 74 6f 20 78 52 6f 6c 6c 62 61 63   /// to xRollbac
100f0 6b 54 6f 28 58 2c 52 29 20 77 69 6c 6c 20 69 6e  kTo(X,R) will in
10100 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 73 61 76  validate all sav
10110 65 70 6f 69 6e 74 73 20 77 69 74 68 20 4e 3e 52  epoints with N>R
10120 3b 20 6e 6f 6e 65 20 6f 66 20 74 68 65 0d 0a 20  ; none of the.. 
10130 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 76 61 6c         /// inval
10140 69 64 65 64 20 73 61 76 65 70 6f 69 6e 74 73 20  ided savepoints 
10150 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
10160 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 64 20  ack or released 
10170 77 69 74 68 6f 75 74 20 66 69 72 73 74 0d 0a 20  without first.. 
10180 20 20 20 20 20 20 20 2f 2f 2f 20 62 65 69 6e 67         /// being
10190 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62   reinitialized b
101a0 79 20 61 20 63 61 6c 6c 20 74 6f 20 78 53 61 76  y a call to xSav
101b0 65 70 6f 69 6e 74 28 29 2e 20 20 0d 0a 20 20 20  epoint().  ..   
101c0 20 20 20 20 20 2f 2f 2f 20 41 20 63 61 6c 6c 20       /// A call 
101d0 74 6f 20 78 52 65 6c 65 61 73 65 28 58 2c 4d 29  to xRelease(X,M)
101e0 20 69 6e 76 61 6c 69 64 61 74 65 73 20 61 6c 6c   invalidates all
101f0 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 65 72   savepoints wher
10200 65 20 4e 3e 3d 4d 2e 0d 0a 20 20 20 20 20 20 20  e N>=M...       
10210 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
10220 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
10230 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 4e 6f  ..        /// No
10240 6e 65 20 6f 66 20 74 68 65 20 78 53 61 76 65 70  ne of the xSavep
10250 6f 69 6e 74 28 29 2c 20 78 52 65 6c 65 61 73 65  oint(), xRelease
10260 28 29 2c 20 6f 72 20 78 52 6f 6c 6c 62 61 63 6b  (), or xRollback
10270 54 6f 28 29 20 6d 65 74 68 6f 64 73 20 77 69 6c  To() methods wil
10280 6c 20 65 76 65 72 0d 0a 20 20 20 20 20 20 20 20  l ever..        
10290 2f 2f 2f 20 62 65 20 63 61 6c 6c 65 64 20 65 78  /// be called ex
102a0 63 65 70 74 20 69 6e 20 62 65 74 77 65 65 6e 20  cept in between 
102b0 63 61 6c 6c 73 20 74 6f 20 78 42 65 67 69 6e 28  calls to xBegin(
102c0 29 20 61 6e 64 20 0d 0a 20 20 20 20 20 20 20 20  ) and ..        
102d0 2f 2f 2f 20 65 69 74 68 65 72 20 78 43 6f 6d 6d  /// either xComm
102e0 69 74 28 29 20 6f 72 20 78 52 6f 6c 6c 62 61 63  it() or xRollbac
102f0 6b 28 29 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  k()...        //
10300 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
10310 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
10320 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
10330 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74 61  param name="pVta
10340 62 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  b">..        ///
10350 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f 69 6e   The native poin
10360 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ter to the sqlit
10370 65 33 5f 76 74 61 62 20 64 65 72 69 76 65 64 20  e3_vtab derived 
10380 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20 20  structure...    
10390 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
103a0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
103b0 61 72 61 6d 20 6e 61 6d 65 3d 22 69 53 61 76 65  aram name="iSave
103c0 70 6f 69 6e 74 22 3e 0d 0a 20 20 20 20 20 20 20  point">..       
103d0 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 61 6e 20   /// This is an 
103e0 69 6e 74 65 67 65 72 20 75 73 65 64 20 74 6f 20  integer used to 
103f0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6e  indicate that an
10400 79 20 73 61 76 65 64 20 73 74 61 74 65 73 20 77  y saved states w
10410 69 74 68 20 61 6e 0d 0a 20 20 20 20 20 20 20 20  ith an..        
10420 2f 2f 2f 20 69 64 65 6e 74 69 66 69 65 72 20 67  /// identifier g
10430 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
10440 71 75 61 6c 20 74 6f 20 74 68 69 73 20 73 68 6f  qual to this sho
10450 75 6c 64 20 62 65 20 64 65 6c 65 74 65 64 20 62  uld be deleted b
10460 79 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f  y the..        /
10470 2f 2f 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  // virtual table
10480 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
10490 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
104a0 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a   /// <returns>..
104b0 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74          /// A st
104c0 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72 65  andard SQLite re
104d0 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20  turn code...    
104e0 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e      /// </return
104f0 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69  s>..        SQLi
10500 74 65 45 72 72 6f 72 43 6f 64 65 20 78 52 65 6c  teErrorCode xRel
10510 65 61 73 65 28 0d 0a 20 20 20 20 20 20 20 20 20  ease(..         
10520 20 20 20 49 6e 74 50 74 72 20 70 56 74 61 62 2c     IntPtr pVtab,
10530 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ..            in
10540 74 20 69 53 61 76 65 70 6f 69 6e 74 0d 0a 20 20  t iSavepoint..  
10550 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a            );....
10560 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
10570 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10580 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10590 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
105a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
105b0 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
105c0 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
105d0 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64    /// <para><cod
105e0 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e>..        /// 
105f0 20 20 69 6e 74 20 28 2a 78 53 61 76 65 70 6f 69    int (*xSavepoi
10600 6e 74 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62  nt)(sqlite3_vtab
10610 20 2a 70 56 74 61 62 2c 20 69 6e 74 29 3b 0d 0a   *pVtab, int);..
10620 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 69 6e          ///   in
10630 74 20 28 2a 78 52 65 6c 65 61 73 65 29 28 73 71  t (*xRelease)(sq
10640 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
10650 62 2c 20 69 6e 74 29 3b 0d 0a 20 20 20 20 20 20  b, int);..      
10660 20 20 2f 2f 2f 20 20 20 69 6e 74 20 28 2a 78 52    ///   int (*xR
10670 6f 6c 6c 62 61 63 6b 54 6f 29 28 73 71 6c 69 74  ollbackTo)(sqlit
10680 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20  e3_vtab *pVtab, 
10690 69 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f  int);..        /
106a0 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61  // </code></para
106b0 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
106c0 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
106d0 2f 2f 20 54 68 65 73 65 20 6d 65 74 68 6f 64 73  // These methods
106e0 20 70 72 6f 76 69 64 65 20 74 68 65 20 76 69 72   provide the vir
106f0 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65  tual table imple
10700 6d 65 6e 74 61 74 69 6f 6e 20 61 6e 20 6f 70 70  mentation an opp
10710 6f 72 74 75 6e 69 74 79 20 74 6f 0d 0a 20 20 20  ortunity to..   
10720 20 20 20 20 20 2f 2f 2f 20 69 6d 70 6c 65 6d 65       /// impleme
10730 6e 74 20 6e 65 73 74 65 64 20 74 72 61 6e 73 61  nt nested transa
10740 63 74 69 6f 6e 73 2e 20 20 54 68 65 79 20 61 72  ctions.  They ar
10750 65 20 61 6c 77 61 79 73 20 6f 70 74 69 6f 6e 61  e always optiona
10760 6c 20 61 6e 64 20 77 69 6c 6c 20 6f 6e 6c 79 20  l and will only 
10770 62 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  be..        /// 
10780 63 61 6c 6c 65 64 20 69 6e 20 53 51 4c 69 74 65  called in SQLite
10790 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 37 20 61   version 3.7.7 a
107a0 6e 64 20 6c 61 74 65 72 2e 0d 0a 20 20 20 20 20  nd later...     
107b0 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
107c0 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
107d0 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
107e0 57 68 65 6e 20 78 53 61 76 65 70 6f 69 6e 74 28  When xSavepoint(
107f0 58 2c 4e 29 20 69 73 20 69 6e 76 6f 6b 65 64 2c  X,N) is invoked,
10800 20 74 68 61 74 20 69 73 20 61 20 73 69 67 6e 61   that is a signa
10810 6c 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  l to the virtual
10820 20 74 61 62 6c 65 20 58 0d 0a 20 20 20 20 20 20   table X..      
10830 20 20 2f 2f 2f 20 74 68 61 74 20 69 74 20 73 68    /// that it sh
10840 6f 75 6c 64 20 73 61 76 65 20 69 74 73 20 63 75  ould save its cu
10850 72 72 65 6e 74 20 73 74 61 74 65 20 61 73 20 73  rrent state as s
10860 61 76 65 70 6f 69 6e 74 20 4e 2e 20 20 0d 0a 20  avepoint N.  .. 
10870 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 75 62         /// A sub
10880 73 65 71 75 65 6e 74 20 63 61 6c 6c 0d 0a 20 20  sequent call..  
10890 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20 78 52 6f        /// to xRo
108a0 6c 6c 62 61 63 6b 54 6f 28 58 2c 52 29 20 6d 65  llbackTo(X,R) me
108b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 74 61  ans that the sta
108c0 74 65 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  te of the virtua
108d0 6c 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 72  l table should r
108e0 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20 20 2f  eturn..        /
108f0 2f 2f 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  // to what it wa
10900 73 20 77 68 65 6e 20 78 53 61 76 65 70 6f 69 6e  s when xSavepoin
10910 74 28 58 2c 52 29 20 77 61 73 20 6c 61 73 74 20  t(X,R) was last 
10920 63 61 6c 6c 65 64 2e 20 20 0d 0a 20 20 20 20 20  called.  ..     
10930 20 20 20 2f 2f 2f 20 54 68 65 20 63 61 6c 6c 0d     /// The call.
10940 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20  .        /// to 
10950 78 52 6f 6c 6c 62 61 63 6b 54 6f 28 58 2c 52 29  xRollbackTo(X,R)
10960 20 77 69 6c 6c 20 69 6e 76 61 6c 69 64 61 74 65   will invalidate
10970 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
10980 77 69 74 68 20 4e 3e 52 3b 20 6e 6f 6e 65 20 6f  with N>R; none o
10990 66 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f  f the..        /
109a0 2f 2f 20 69 6e 76 61 6c 69 64 65 64 20 73 61 76  // invalided sav
109b0 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20 62 65 20  epoints will be 
109c0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 72  rolled back or r
109d0 65 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74 20  eleased without 
109e0 66 69 72 73 74 0d 0a 20 20 20 20 20 20 20 20 2f  first..        /
109f0 2f 2f 20 62 65 69 6e 67 20 72 65 69 6e 69 74 69  // being reiniti
10a00 61 6c 69 7a 65 64 20 62 79 20 61 20 63 61 6c 6c  alized by a call
10a10 20 74 6f 20 78 53 61 76 65 70 6f 69 6e 74 28 29   to xSavepoint()
10a20 2e 20 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  .  ..        ///
10a30 20 41 20 63 61 6c 6c 20 74 6f 20 78 52 65 6c 65   A call to xRele
10a40 61 73 65 28 58 2c 4d 29 20 69 6e 76 61 6c 69 64  ase(X,M) invalid
10a50 61 74 65 73 20 61 6c 6c 20 73 61 76 65 70 6f 69  ates all savepoi
10a60 6e 74 73 20 77 68 65 72 65 20 4e 3e 3d 4d 2e 0d  nts where N>=M..
10a70 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
10a80 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
10a90 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
10aa0 20 20 2f 2f 2f 20 4e 6f 6e 65 20 6f 66 20 74 68    /// None of th
10ab0 65 20 78 53 61 76 65 70 6f 69 6e 74 28 29 2c 20  e xSavepoint(), 
10ac0 78 52 65 6c 65 61 73 65 28 29 2c 20 6f 72 20 78  xRelease(), or x
10ad0 52 6f 6c 6c 62 61 63 6b 54 6f 28 29 20 6d 65 74  RollbackTo() met
10ae0 68 6f 64 73 20 77 69 6c 6c 20 65 76 65 72 0d 0a  hods will ever..
10af0 20 20 20 20 20 20 20 20 2f 2f 2f 20 62 65 20 63          /// be c
10b00 61 6c 6c 65 64 20 65 78 63 65 70 74 20 69 6e 20  alled except in 
10b10 62 65 74 77 65 65 6e 20 63 61 6c 6c 73 20 74 6f  between calls to
10b20 20 78 42 65 67 69 6e 28 29 20 61 6e 64 20 0d 0a   xBegin() and ..
10b30 20 20 20 20 20 20 20 20 2f 2f 2f 20 65 69 74 68          /// eith
10b40 65 72 20 78 43 6f 6d 6d 69 74 28 29 20 6f 72 20  er xCommit() or 
10b50 78 52 6f 6c 6c 62 61 63 6b 28 29 2e 0d 0a 20 20  xRollback()...  
10b60 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
10b70 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
10b80 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  /summary>..     
10b90 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
10ba0 6d 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20 20 20  me="pVtab">..   
10bb0 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74       /// The nat
10bc0 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ive pointer to t
10bd0 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  he sqlite3_vtab 
10be0 64 65 72 69 76 65 64 20 73 74 72 75 63 74 75 72  derived structur
10bf0 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
10c00 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
10c10 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
10c20 65 3d 22 69 53 61 76 65 70 6f 69 6e 74 22 3e 0d  e="iSavepoint">.
10c30 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69  .        /// Thi
10c40 73 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  s is an integer 
10c50 69 64 65 6e 74 69 66 69 65 72 20 75 73 65 64 20  identifier used 
10c60 74 6f 20 73 70 65 63 69 66 79 20 61 20 73 70 65  to specify a spe
10c70 63 69 66 69 63 20 73 61 76 65 64 0d 0a 20 20 20  cific saved..   
10c80 20 20 20 20 20 2f 2f 2f 20 73 74 61 74 65 20 66       /// state f
10c90 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  or the virtual t
10ca0 61 62 6c 65 20 66 6f 72 20 69 74 20 74 6f 20 72  able for it to r
10cb0 65 73 74 6f 72 65 20 69 74 73 65 6c 66 20 62 61  estore itself ba
10cc0 63 6b 20 74 6f 2c 20 77 68 69 63 68 0d 0a 20 20  ck to, which..  
10cd0 20 20 20 20 20 20 2f 2f 2f 20 73 68 6f 75 6c 64        /// should
10ce0 20 61 6c 73 6f 20 68 61 76 65 20 74 68 65 20 65   also have the e
10cf0 66 66 65 63 74 20 6f 66 20 64 65 6c 65 74 69 6e  ffect of deletin
10d00 67 20 61 6c 6c 20 73 61 76 65 64 20 73 74 61 74  g all saved stat
10d10 65 73 20 77 69 74 68 20 61 6e 0d 0a 20 20 20 20  es with an..    
10d20 20 20 20 20 2f 2f 2f 20 69 6e 74 65 67 65 72 20      /// integer 
10d30 69 64 65 6e 74 69 66 69 65 72 20 67 72 65 61 74  identifier great
10d40 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
10d50 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
10d60 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
10d70 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a   /// <returns>..
10d80 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74          /// A st
10d90 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72 65  andard SQLite re
10da0 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20  turn code...    
10db0 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e      /// </return
10dc0 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69  s>..        SQLi
10dd0 74 65 45 72 72 6f 72 43 6f 64 65 20 78 52 6f 6c  teErrorCode xRol
10de0 6c 62 61 63 6b 54 6f 28 0d 0a 20 20 20 20 20 20  lbackTo(..      
10df0 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 56 74        IntPtr pVt
10e00 61 62 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ab,..           
10e10 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 0d   int iSavepoint.
10e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d  .            );.
10e30 0a 20 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64  .    }..    #end
10e40 72 65 67 69 6f 6e 0d 0a 7d 0d 0a                 region..}..