System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 842363b5804da2c6587dac5534ab4b2acd1446e9:


0000: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 20 2a 20 41 44  *********.. * AD
0040: 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74 61 20 50  O.NET 2.0 Data P
0050: 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51 4c 69  rovider for SQLi
0060: 74 65 20 56 65 72 73 69 6f 6e 20 33 2e 58 0d 0a  te Version 3.X..
0070: 20 2a 20 57 72 69 74 74 65 6e 20 62 79 20 4a 6f   * Written by Jo
0080: 65 20 4d 69 73 74 61 63 68 6b 69 6e 20 28 6a 6f  e Mistachkin (jo
0090: 65 40 6d 69 73 74 61 63 68 6b 69 6e 2e 63 6f 6d  e@mistachkin.com
00a0: 29 0d 0a 20 2a 0d 0a 20 2a 20 52 65 6c 65 61 73  ).. *.. * Releas
00b0: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00c0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00d0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00e0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 6e 61  *********/....na
0120: 6d 65 73 70 61 63 65 20 53 79 73 74 65 6d 2e 44  mespace System.D
0130: 61 74 61 2e 53 51 4c 69 74 65 0d 0a 7b 0d 0a 20  ata.SQLite..{.. 
0140: 20 20 20 23 72 65 67 69 6f 6e 20 49 53 51 4c 69     #region ISQLi
0150: 74 65 4e 61 74 69 76 65 4d 6f 64 75 6c 65 20 49  teNativeModule I
0160: 6e 74 65 72 66 61 63 65 0d 0a 20 20 20 20 2f 2f  nterface..    //
0170: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
0180: 20 2f 2f 2f 20 54 68 69 73 20 69 6e 74 65 72 66   /// This interf
0190: 61 63 65 20 72 65 70 72 65 73 65 6e 74 73 20 61  ace represents a
01a0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
01b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 72  mplementation wr
01c0: 69 74 74 65 6e 20 69 6e 0d 0a 20 20 20 20 2f 2f  itten in..    //
01d0: 2f 20 6e 61 74 69 76 65 20 63 6f 64 65 2e 0d 0a  / native code...
01e0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
01f0: 79 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 69  y>..    public i
0200: 6e 74 65 72 66 61 63 65 20 49 53 51 4c 69 74 65  nterface ISQLite
0210: 4e 61 74 69 76 65 4d 6f 64 75 6c 65 0d 0a 20 20  NativeModule..  
0220: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f    {..        ///
0230: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
0240: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63      /// <para><c
0250: 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ode>..        //
0260: 2f 20 69 6e 74 20 28 2a 78 43 72 65 61 74 65 29  / int (*xCreate)
0270: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
0280: 69 64 20 2a 70 41 75 78 2c 0d 0a 20 20 20 20 20  id *pAux,..     
0290: 20 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20 20     ///          
02a0: 20 20 20 20 69 6e 74 20 61 72 67 63 2c 20 63 68      int argc, ch
02b0: 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0d  ar *const*argv,.
02c0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20  .        ///    
02d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
02e0: 33 5f 76 74 61 62 20 2a 2a 70 70 56 54 61 62 2c  3_vtab **ppVTab,
02f0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
0300: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
0310: 2a 2a 70 7a 45 72 72 29 3b 0d 0a 20 20 20 20 20  **pzErr);..     
0320: 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f     /// </code></
0330: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
0340: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
0350: 20 20 20 2f 2f 2f 20 54 68 65 20 78 43 72 65 61     /// The xCrea
0360: 74 65 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  te method is cal
0370: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
0380: 6e 65 77 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  new instance of 
0390: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
03a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e  ..        /// in
03b0: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 43   response to a C
03c0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
03d0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a  BLE statement...
03e0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 49 66 20 74          /// If t
03f0: 68 65 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f  he xCreate metho
0400: 64 20 69 73 20 74 68 65 20 73 61 6d 65 20 70 6f  d is the same po
0410: 69 6e 74 65 72 20 61 73 20 74 68 65 20 78 43 6f  inter as the xCo
0420: 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2c 20 74 68  nnect method, th
0430: 65 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  en the..        
0440: 2f 2f 2f 20 76 69 72 74 75 61 6c 20 74 61 62 6c  /// virtual tabl
0450: 65 20 69 73 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  e is an eponymou
0460: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  s virtual table.
0470: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 49 66  ..        /// If
0480: 20 74 68 65 20 78 43 72 65 61 74 65 20 6d 65 74   the xCreate met
0490: 68 6f 64 20 69 73 20 6f 6d 69 74 74 65 64 20 28  hod is omitted (
04a0: 69 66 20 69 74 20 69 73 20 61 20 4e 55 4c 4c 20  if it is a NULL 
04b0: 70 6f 69 6e 74 65 72 29 20 74 68 65 6e 20 74 68  pointer) then th
04c0: 65 20 76 69 72 74 75 61 6c 20 0d 0a 20 20 20 20  e virtual ..    
04d0: 20 20 20 20 2f 2f 2f 20 74 61 62 6c 65 20 69 73      /// table is
04e0: 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 2d 6f 6e   an eponymous-on
04f0: 6c 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ly virtual table
0500: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
0510: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
0520: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
0530: 20 20 20 20 2f 2f 2f 20 54 68 65 20 64 62 20 70      /// The db p
0540: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
0550: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 51 4c  inter to the SQL
0560: 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ite database con
0570: 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 0d 0a 20  nection that .. 
0580: 20 20 20 20 20 20 20 2f 2f 2f 20 69 73 20 65 78         /// is ex
0590: 65 63 75 74 69 6e 67 20 74 68 65 20 43 52 45 41  ecuting the CREA
05a0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
05b0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 0d 0a 20 20   statement. ..  
05c0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 70 41        /// The pA
05d0: 75 78 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  ux argument is t
05e0: 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  he copy of the c
05f0: 6c 69 65 6e 74 20 64 61 74 61 20 70 6f 69 6e 74  lient data point
0600: 65 72 20 74 68 61 74 20 77 61 73 20 74 68 65 20  er that was the 
0610: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 66 6f  ..        /// fo
0620: 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f  urth argument to
0630: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65   the sqlite3_cre
0640: 61 74 65 5f 6d 6f 64 75 6c 65 28 29 20 6f 72 0d  ate_module() or.
0650: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 71 6c  .        /// sql
0660: 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75  ite3_create_modu
0670: 6c 65 5f 76 32 28 29 20 63 61 6c 6c 20 74 68 61  le_v2() call tha
0680: 74 20 72 65 67 69 73 74 65 72 65 64 20 74 68 65  t registered the
0690: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 76   ..        /// v
06a0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
06b0: 75 6c 65 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f  ule. ..        /
06c0: 2f 2f 20 54 68 65 20 61 72 67 76 20 70 61 72 61  // The argv para
06d0: 6d 65 74 65 72 20 69 73 20 61 6e 20 61 72 72 61  meter is an arra
06e0: 79 20 6f 66 20 61 72 67 63 20 70 6f 69 6e 74 65  y of argc pointe
06f0: 72 73 20 74 6f 20 6e 75 6c 6c 20 74 65 72 6d 69  rs to null termi
0700: 6e 61 74 65 64 20 73 74 72 69 6e 67 73 2e 20 0d  nated strings. .
0710: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
0720: 20 66 69 72 73 74 20 73 74 72 69 6e 67 2c 20 61   first string, a
0730: 72 67 76 5b 30 5d 2c 20 69 73 20 74 68 65 20 6e  rgv[0], is the n
0740: 61 6d 65 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c  ame of the modul
0750: 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 2e  e being invoked.
0760: 20 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20     The..        
0770: 2f 2f 2f 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20  /// module name 
0780: 69 73 20 74 68 65 20 6e 61 6d 65 20 70 72 6f 76  is the name prov
0790: 69 64 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ided as the seco
07a0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 0d  nd argument to .
07b0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 71 6c  .        /// sql
07c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75  ite3_create_modu
07d0: 6c 65 28 29 20 61 6e 64 20 61 73 20 74 68 65 20  le() and as the 
07e0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
07f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
0800: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  the..        ///
0810: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
0820: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
0830: 74 68 61 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e  that is running.
0840: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
0850: 65 20 73 65 63 6f 6e 64 2c 20 61 72 67 76 5b 31  e second, argv[1
0860: 5d 2c 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  ], is the name o
0870: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
0880: 6e 20 77 68 69 63 68 20 74 68 65 20 6e 65 77 20  n which the new 
0890: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73  virtual table is
08a0: 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 2e 20   being created. 
08b0: 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  The database nam
08c0: 65 20 69 73 20 22 6d 61 69 6e 22 20 66 6f 72 20  e is "main" for 
08d0: 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74 61  the primary data
08e0: 62 61 73 65 2c 20 6f 72 0d 0a 20 20 20 20 20 20  base, or..      
08f0: 20 20 2f 2f 2f 20 22 74 65 6d 70 22 20 66 6f 72    /// "temp" for
0900: 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 2c 20   TEMP database, 
0910: 6f 72 20 74 68 65 20 6e 61 6d 65 20 67 69 76 65  or the name give
0920: 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  n at the end of 
0930: 74 68 65 20 41 54 54 41 43 48 0d 0a 20 20 20 20  the ATTACH..    
0940: 20 20 20 20 2f 2f 2f 20 73 74 61 74 65 6d 65 6e      /// statemen
0950: 74 20 66 6f 72 20 61 74 74 61 63 68 65 64 20 64  t for attached d
0960: 61 74 61 62 61 73 65 73 2e 20 20 54 68 65 20 74  atabases.  The t
0970: 68 69 72 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  hird element of 
0980: 74 68 65 20 61 72 72 61 79 2c 20 61 72 67 76 5b  the array, argv[
0990: 32 5d 2c 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  2], ..        //
09a0: 2f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  / is the name of
09b0: 20 74 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c   the new virtual
09c0: 20 74 61 62 6c 65 2c 20 61 73 20 73 70 65 63 69   table, as speci
09d0: 66 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  fied following t
09e0: 68 65 20 54 41 42 4c 45 0d 0a 20 20 20 20 20 20  he TABLE..      
09f0: 20 20 2f 2f 2f 20 6b 65 79 77 6f 72 64 20 69 6e    /// keyword in
0a00: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 52 54   the CREATE VIRT
0a10: 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d  UAL TABLE statem
0a20: 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ent...        //
0a30: 2f 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74 68  / If present, th
0a40: 65 20 66 6f 75 72 74 68 20 61 6e 64 20 73 75 62  e fourth and sub
0a50: 73 65 71 75 65 6e 74 20 73 74 72 69 6e 67 73 20  sequent strings 
0a60: 69 6e 20 74 68 65 20 61 72 67 76 5b 5d 20 61 72  in the argv[] ar
0a70: 72 61 79 20 72 65 70 6f 72 74 20 0d 0a 20 20 20  ray report ..   
0a80: 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 61 72 67       /// the arg
0a90: 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6d 6f  uments to the mo
0aa0: 64 75 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  dule name in the
0ab0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
0ac0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
0ad0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
0ae0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
0af0: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
0b00: 20 20 20 2f 2f 2f 20 54 68 65 20 6a 6f 62 20 6f     /// The job o
0b10: 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73  f this method is
0b20: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68   to construct th
0b30: 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 61  e new virtual ta
0b40: 62 6c 65 20 6f 62 6a 65 63 74 0d 0a 20 20 20 20  ble object..    
0b50: 20 20 20 20 2f 2f 2f 20 28 61 6e 20 73 71 6c 69      /// (an sqli
0b60: 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 29  te3_vtab object)
0b70: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0b80: 69 6e 74 65 72 20 74 6f 20 69 74 20 69 6e 20 2a  inter to it in *
0b90: 70 70 56 54 61 62 2e 0d 0a 20 20 20 20 20 20 20  ppVTab...       
0ba0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
0bb0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
0bc0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 73  ..        /// As
0bd0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 61 73   part of the tas
0be0: 6b 20 6f 66 20 63 72 65 61 74 69 6e 67 20 61 20  k of creating a 
0bf0: 6e 65 77 20 73 71 6c 69 74 65 33 5f 76 74 61 62  new sqlite3_vtab
0c00: 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 69 73   structure, this
0c10: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d   ..        /// m
0c20: 65 74 68 6f 64 20 3c 75 3e 6d 75 73 74 3c 2f 75  ethod <u>must</u
0c30: 3e 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  > invoke sqlite3
0c40: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20  _declare_vtab() 
0c50: 74 6f 20 74 65 6c 6c 20 74 68 65 20 53 51 4c 69  to tell the SQLi
0c60: 74 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  te ..        ///
0c70: 20 63 6f 72 65 20 61 62 6f 75 74 20 74 68 65 20   core about the 
0c80: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 64 61 74 61  columns and data
0c90: 74 79 70 65 73 20 69 6e 20 74 68 65 20 76 69 72  types in the vir
0ca0: 74 75 61 6c 20 74 61 62 6c 65 2e 20 0d 0a 20 20  tual table. ..  
0cb0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 73 71        /// The sq
0cc0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
0cd0: 61 62 28 29 20 41 50 49 20 68 61 73 20 74 68 65  ab() API has the
0ce0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 74 6f   following proto
0cf0: 74 79 70 65 3a 0d 0a 20 20 20 20 20 20 20 20 2f  type:..        /
0d00: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
0d10: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63      /// <para><c
0d20: 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ode>..        //
0d30: 2f 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 65  / int sqlite3_de
0d40: 63 6c 61 72 65 5f 76 74 61 62 28 73 71 6c 69 74  clare_vtab(sqlit
0d50: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
0d60: 61 72 20 2a 7a 43 72 65 61 74 65 54 61 62 6c 65  ar *zCreateTable
0d70: 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  )..        /// <
0d80: 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20  /code></para>.. 
0d90: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
0da0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
0db0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
0dc0: 74 20 74 6f 20 73 71 6c 69 74 65 33 5f 64 65 63  t to sqlite3_dec
0dd0: 6c 61 72 65 5f 76 74 61 62 28 29 20 6d 75 73 74  lare_vtab() must
0de0: 20 62 65 20 74 68 65 20 73 61 6d 65 20 0d 0a 20   be the same .. 
0df0: 20 20 20 20 20 20 20 2f 2f 2f 20 64 61 74 61 62         /// datab
0e00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ase connection p
0e10: 6f 69 6e 74 65 72 20 61 73 20 74 68 65 20 66 69  ointer as the fi
0e20: 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f  rst parameter to
0e30: 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 0d 0a 20   this method... 
0e40: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 73         /// The s
0e50: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
0e60: 6f 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  o sqlite3_declar
0e70: 65 5f 76 74 61 62 28 29 20 6d 75 73 74 20 61 20  e_vtab() must a 
0e80: 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20  zero-terminated 
0e90: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 55 54  ..        /// UT
0ea0: 46 2d 38 20 73 74 72 69 6e 67 20 74 68 61 74 20  F-8 string that 
0eb0: 63 6f 6e 74 61 69 6e 73 20 61 20 77 65 6c 6c 2d  contains a well-
0ec0: 66 6f 72 6d 65 64 20 43 52 45 41 54 45 20 54 41  formed CREATE TA
0ed0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  BLE statement th
0ee0: 61 74 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  at ..        ///
0ef0: 20 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f 6c   defines the col
0f00: 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 69 72 74  umns in the virt
0f10: 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 74 68  ual table and th
0f20: 65 69 72 20 64 61 74 61 20 74 79 70 65 73 2e 20  eir data types. 
0f30: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
0f40: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0f50: 62 6c 65 20 69 6e 20 74 68 69 73 20 43 52 45 41  ble in this CREA
0f60: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
0f70: 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 2c 20 0d  nt is ignored, .
0f80: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 73 20  .        /// as 
0f90: 61 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  are all constrai
0fa0: 6e 74 73 2e 20 4f 6e 6c 79 20 74 68 65 20 63 6f  nts. Only the co
0fb0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64  lumn names and d
0fc0: 61 74 61 74 79 70 65 73 20 6d 61 74 74 65 72 2e  atatypes matter.
0fd0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
0fe0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
0ff0: 74 61 74 65 6d 65 6e 74 20 73 74 72 69 6e 67 20  tatement string 
1000: 6e 65 65 64 20 6e 6f 74 20 74 6f 20 62 65 20 0d  need not to be .
1010: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 68 65 6c  .        /// hel
1020: 64 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 20  d in persistent 
1030: 6d 65 6d 6f 72 79 2e 20 20 54 68 65 20 73 74 72  memory.  The str
1040: 69 6e 67 20 63 61 6e 20 62 65 0d 0a 20 20 20 20  ing can be..    
1050: 20 20 20 20 2f 2f 2f 20 64 65 61 6c 6c 6f 63 61      /// dealloca
1060: 74 65 64 20 61 6e 64 2f 6f 72 20 72 65 75 73 65  ted and/or reuse
1070: 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  d as soon as the
1080: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
1090: 5f 76 74 61 62 28 29 0d 0a 20 20 20 20 20 20 20  _vtab()..       
10a0: 20 2f 2f 2f 20 72 6f 75 74 69 6e 65 20 72 65 74   /// routine ret
10b0: 75 72 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 2f  urns...        /
10c0: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
10d0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
10e0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
10f0: 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64 20 6e  xCreate method n
1100: 65 65 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69  eed not initiali
1110: 7a 65 20 74 68 65 20 70 4d 6f 64 75 6c 65 2c 20  ze the pModule, 
1120: 6e 52 65 66 2c 20 61 6e 64 20 7a 45 72 72 4d 73  nRef, and zErrMs
1130: 67 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 66  g..        /// f
1140: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 71 6c  ields of the sql
1150: 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74  ite3_vtab object
1160: 2e 20 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f  .  The SQLite co
1170: 72 65 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72  re will take car
1180: 65 20 6f 66 20 0d 0a 20 20 20 20 20 20 20 20 2f  e of ..        /
1190: 2f 2f 20 74 68 61 74 20 63 68 6f 72 65 2e 0d 0a  // that chore...
11a0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
11b0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
11c0: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
11d0: 20 2f 2f 2f 20 54 68 65 20 78 43 72 65 61 74 65   /// The xCreate
11e0: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53   should return S
11f0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74 20 69  QLITE_OK if it i
1200: 73 20 73 75 63 63 65 73 73 66 75 6c 20 69 6e 20  s successful in 
1210: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 63 72  ..        /// cr
1220: 65 61 74 69 6e 67 20 74 68 65 20 6e 65 77 20 76  eating the new v
1230: 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 6f 72  irtual table, or
1240: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
1250: 20 69 74 20 69 73 20 6e 6f 74 20 73 75 63 63 65   it is not succe
1260: 73 73 66 75 6c 2e 0d 0a 20 20 20 20 20 20 20 20  ssful...        
1270: 2f 2f 2f 20 49 66 20 6e 6f 74 20 73 75 63 63 65  /// If not succe
1280: 73 73 66 75 6c 2c 20 74 68 65 20 73 71 6c 69 74  ssful, the sqlit
1290: 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
12a0: 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 6c  e must not be al
12b0: 6c 6f 63 61 74 65 64 2e 20 0d 0a 20 20 20 20 20  located. ..     
12c0: 20 20 20 2f 2f 2f 20 41 6e 20 65 72 72 6f 72 20     /// An error 
12d0: 6d 65 73 73 61 67 65 20 6d 61 79 20 6f 70 74 69  message may opti
12e0: 6f 6e 61 6c 6c 79 20 62 65 20 72 65 74 75 72 6e  onally be return
12f0: 65 64 20 69 6e 20 2a 70 7a 45 72 72 20 69 66 20  ed in *pzErr if 
1300: 75 6e 73 75 63 63 65 73 73 66 75 6c 2e 0d 0a 20  unsuccessful... 
1310: 20 20 20 20 20 20 20 2f 2f 2f 20 53 70 61 63 65         /// Space
1320: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 72 72   to hold the err
1330: 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
1340: 67 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  g must be alloca
1350: 74 65 64 20 75 73 69 6e 67 0d 0a 20 20 20 20 20  ted using..     
1360: 20 20 20 2f 2f 2f 20 61 6e 20 53 51 4c 69 74 65     /// an SQLite
1370: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1380: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65  on function like
1390: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73   ..        /// s
13a0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
13b0: 6f 72 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  or sqlite3_mprin
13c0: 74 66 28 29 20 61 73 20 74 68 65 20 53 51 4c 69  tf() as the SQLi
13d0: 74 65 20 63 6f 72 65 20 77 69 6c 6c 0d 0a 20 20  te core will..  
13e0: 20 20 20 20 20 20 2f 2f 2f 20 61 74 74 65 6d 70        /// attemp
13f0: 74 20 74 6f 20 66 72 65 65 20 74 68 65 20 73 70  t to free the sp
1400: 61 63 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ace using sqlite
1410: 33 5f 66 72 65 65 28 29 20 61 66 74 65 72 20 74  3_free() after t
1420: 68 65 20 65 72 72 6f 72 20 68 61 73 0d 0a 20 20  he error has..  
1430: 20 20 20 20 20 20 2f 2f 2f 20 62 65 65 6e 20 72        /// been r
1440: 65 70 6f 72 74 65 64 20 75 70 20 74 6f 20 74 68  eported up to th
1450: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0d 0a  e application...
1460: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
1470: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
1480: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
1490: 20 2f 2f 2f 20 49 66 20 74 68 65 20 78 43 72 65   /// If the xCre
14a0: 61 74 65 20 6d 65 74 68 6f 64 20 69 73 20 6f 6d  ate method is om
14b0: 69 74 74 65 64 20 28 6c 65 66 74 20 61 73 20 61  itted (left as a
14c0: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 29 20 74   NULL pointer) t
14d0: 68 65 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20  hen the..       
14e0: 20 2f 2f 2f 20 76 69 72 74 75 61 6c 20 74 61 62   /// virtual tab
14f0: 6c 65 20 69 73 20 61 6e 20 65 70 6f 6e 79 6d 6f  le is an eponymo
1500: 75 73 2d 6f 6e 6c 79 20 76 69 72 74 75 61 6c 20  us-only virtual 
1510: 74 61 62 6c 65 2e 20 20 4e 65 77 20 69 6e 73 74  table.  New inst
1520: 61 6e 63 65 73 20 6f 66 0d 0a 20 20 20 20 20 20  ances of..      
1530: 20 20 2f 2f 2f 20 74 68 65 20 76 69 72 74 75 61    /// the virtua
1540: 6c 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62  l table cannot b
1550: 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  e created using 
1560: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
1570: 41 42 4c 45 20 61 6e 64 20 74 68 65 0d 0a 20 20  ABLE and the..  
1580: 20 20 20 20 20 20 2f 2f 2f 20 76 69 72 74 75 61        /// virtua
1590: 6c 20 74 61 62 6c 65 20 63 61 6e 20 6f 6e 6c 79  l table can only
15a0: 20 62 65 20 75 73 65 64 20 76 69 61 20 69 74 73   be used via its
15b0: 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 2e 0d 0a 20   module name... 
15c0: 20 20 20 20 20 20 20 2f 2f 2f 20 4e 6f 74 65 20         /// Note 
15d0: 74 68 61 74 20 53 51 4c 69 74 65 20 76 65 72 73  that SQLite vers
15e0: 69 6f 6e 73 20 70 72 69 6f 72 20 74 6f 20 33 2e  ions prior to 3.
15f0: 39 2e 30 20 28 32 30 31 35 2d 31 30 2d 31 34 29  9.0 (2015-10-14)
1600: 20 64 6f 20 6e 6f 74 20 75 6e 64 65 72 73 74 61   do not understa
1610: 6e 64 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  nd..        /// 
1620: 65 70 6f 6e 79 6d 6f 75 73 2d 6f 6e 6c 79 20 76  eponymous-only v
1630: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 61 6e  irtual tables an
1640: 64 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 20  d will segfault 
1650: 69 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  if an attempt is
1660: 20 6d 61 64 65 0d 0a 20 20 20 20 20 20 20 20 2f   made..        /
1670: 2f 2f 20 74 6f 20 43 52 45 41 54 45 20 56 49 52  // to CREATE VIR
1680: 54 55 41 4c 20 54 41 42 4c 45 20 6f 6e 20 61 6e  TUAL TABLE on an
1690: 20 65 70 6f 6e 79 6d 6f 75 73 2d 6f 6e 6c 79 20   eponymous-only 
16a0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 62 65  virtual table be
16b0: 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20 20 2f  cause..        /
16c0: 2f 2f 20 74 68 65 20 78 43 72 65 61 74 65 20 6d  // the xCreate m
16d0: 65 74 68 6f 64 20 77 61 73 20 6e 6f 74 20 63 68  ethod was not ch
16e0: 65 63 6b 65 64 20 66 6f 72 20 6e 75 6c 6c 2e 0d  ecked for null..
16f0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
1700: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
1710: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
1720: 20 20 2f 2f 2f 20 49 66 20 74 68 65 20 78 43 72    /// If the xCr
1730: 65 61 74 65 20 6d 65 74 68 6f 64 20 69 73 20 74  eate method is t
1740: 68 65 20 65 78 61 63 74 20 73 61 6d 65 20 70 6f  he exact same po
1750: 69 6e 74 65 72 20 61 73 20 74 68 65 20 78 43 6f  inter as the xCo
1760: 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2c 0d 0a 20  nnect method,.. 
1770: 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 61 74 20         /// that 
1780: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1790: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
17a0: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
17b0: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 62 61 63  o initialize bac
17c0: 6b 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 2f 2f  king..        //
17d0: 2f 20 73 74 6f 72 65 2e 20 20 53 75 63 68 20 61  / store.  Such a
17e0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
17f0: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61 6e  an be used as an
1800: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
1810: 61 6c 20 74 61 62 6c 65 0d 0a 20 20 20 20 20 20  al table..      
1820: 20 20 2f 2f 2f 20 6f 72 20 61 73 20 61 20 6e 61    /// or as a na
1830: 6d 65 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c  med virtual tabl
1840: 65 20 75 73 69 6e 67 20 43 52 45 41 54 45 20 56  e using CREATE V
1850: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 6f 72 20  IRTUAL TABLE or 
1860: 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 2f  both...        /
1870: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
1880: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
1890: 20 20 20 20 20 20 20 20 2f 2f 2f 20 49 66 20 61          /// If a
18a0: 20 63 6f 6c 75 6d 6e 20 64 61 74 61 74 79 70 65   column datatype
18b0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 70   contains the sp
18c0: 65 63 69 61 6c 20 6b 65 79 77 6f 72 64 20 22 48  ecial keyword "H
18d0: 49 44 44 45 4e 22 0d 0a 20 20 20 20 20 20 20 20  IDDEN"..        
18e0: 2f 2f 2f 20 28 69 6e 20 61 6e 79 20 63 6f 6d 62  /// (in any comb
18f0: 69 6e 61 74 69 6f 6e 20 6f 66 20 75 70 70 65 72  ination of upper
1900: 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20   and lower case 
1910: 6c 65 74 74 65 72 73 29 20 74 68 65 6e 20 74 68  letters) then th
1920: 61 74 20 6b 65 79 77 6f 72 64 0d 0a 20 20 20 20  at keyword..    
1930: 20 20 20 20 2f 2f 2f 20 69 74 20 69 73 20 6f 6d      /// it is om
1940: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 63  itted from the c
1950: 6f 6c 75 6d 6e 20 64 61 74 61 74 79 70 65 20 6e  olumn datatype n
1960: 61 6d 65 20 61 6e 64 20 74 68 65 20 63 6f 6c 75  ame and the colu
1970: 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 0d 0a 20  mn is marked .. 
1980: 20 20 20 20 20 20 20 2f 2f 2f 20 61 73 20 61 20         /// as a 
1990: 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 69 6e  hidden column in
19a0: 74 65 72 6e 61 6c 6c 79 2e 20 0d 0a 20 20 20 20  ternally. ..    
19b0: 20 20 20 20 2f 2f 2f 20 41 20 68 69 64 64 65 6e      /// A hidden
19c0: 20 63 6f 6c 75 6d 6e 20 64 69 66 66 65 72 73 20   column differs 
19d0: 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 63 6f  from a normal co
19e0: 6c 75 6d 6e 20 69 6e 20 74 68 72 65 65 20 72 65  lumn in three re
19f0: 73 70 65 63 74 73 3a 0d 0a 20 20 20 20 20 20 20  spects:..       
1a00: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
1a10: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
1a20: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21  ..        /// <!
1a30: 5b 43 44 41 54 41 5b 3c 75 6c 3e 5d 5d 3e 0d 0a  [CDATA[<ul>]]>..
1a40: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43          /// <![C
1a50: 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 48 69 64  DATA[<li>]]> Hid
1a60: 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  den columns are 
1a70: 6e 6f 74 20 6c 69 73 74 65 64 20 69 6e 20 74 68  not listed in th
1a80: 65 20 64 61 74 61 73 65 74 20 72 65 74 75 72 6e  e dataset return
1a90: 65 64 20 62 79 20 0d 0a 20 20 20 20 20 20 20 20  ed by ..        
1aa0: 2f 2f 2f 20 20 20 20 20 20 22 50 52 41 47 4d 41  ///      "PRAGMA
1ab0: 20 74 61 62 6c 65 5f 69 6e 66 6f 22 2c 0d 0a 20   table_info",.. 
1ac0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44         /// <![CD
1ad0: 41 54 41 5b 3c 2f 6c 69 3e 5d 5d 3e 3c 21 5b 43  ATA[</li>]]><![C
1ae0: 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 48 69 64  DATA[<li>]]> Hid
1af0: 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  den columns are 
1b00: 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 20  not included in 
1b10: 74 68 65 20 65 78 70 61 6e 73 69 6f 6e 20 6f 66  the expansion of
1b20: 20 61 20 22 2a 22 0d 0a 20 20 20 20 20 20 20 20   a "*"..        
1b30: 2f 2f 2f 20 20 20 20 20 20 65 78 70 72 65 73 73  ///      express
1b40: 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
1b50: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
1b60: 54 2c 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20  T, and..        
1b70: 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 6c  /// <![CDATA[</l
1b80: 69 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 6c  i>]]><![CDATA[<l
1b90: 69 3e 5d 5d 3e 20 48 69 64 64 65 6e 20 63 6f 6c  i>]]> Hidden col
1ba0: 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 69 6e 63  umns are not inc
1bb0: 6c 75 64 65 64 20 69 6e 20 74 68 65 20 69 6d 70  luded in the imp
1bc0: 6c 69 63 69 74 20 63 6f 6c 75 6d 6e 2d 6c 69 73  licit column-lis
1bd0: 74 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  t ..        /// 
1be0: 20 20 20 20 20 75 73 65 64 20 62 79 20 61 6e 20       used by an 
1bf0: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
1c00: 20 74 68 61 74 20 6c 61 63 6b 73 20 61 6e 20 65   that lacks an e
1c10: 78 70 6c 69 63 69 74 20 63 6f 6c 75 6d 6e 2d 6c  xplicit column-l
1c20: 69 73 74 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f  ist. ..        /
1c30: 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 6c 69  // <![CDATA[</li
1c40: 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 2f 75  >]]><![CDATA[</u
1c50: 6c 3e 5d 5d 3e 0d 0a 20 20 20 20 20 20 20 20 2f  l>]]>..        /
1c60: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
1c70: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
1c80: 20 20 20 20 20 20 20 20 2f 2f 2f 20 46 6f 72 20          /// For 
1c90: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1ca0: 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 69 73  following SQL is
1cb0: 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1cc0: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
1cd0: 29 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ):..        /// 
1ce0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
1cf0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65   /// <para><code
1d00: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 43  >..        /// C
1d10: 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 61 20  REATE TABLE x(a 
1d20: 48 49 44 44 45 4e 20 56 41 52 43 48 41 52 28 31  HIDDEN VARCHAR(1
1d30: 32 29 2c 20 62 20 49 4e 54 45 47 45 52 2c 20 63  2), b INTEGER, c
1d40: 20 49 4e 54 45 47 45 52 20 48 69 64 64 65 6e 29   INTEGER Hidden)
1d50: 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ;..        /// <
1d60: 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20  /code></para>.. 
1d70: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
1d80: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
1d90: 68 65 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20  hen the virtual 
1da0: 74 61 62 6c 65 20 77 6f 75 6c 64 20 62 65 20 63  table would be c
1db0: 72 65 61 74 65 64 20 77 69 74 68 20 74 77 6f 20  reated with two 
1dc0: 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 2c 0d  hidden columns,.
1dd0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 6e 64  .        /// and
1de0: 20 77 69 74 68 20 64 61 74 61 74 79 70 65 73 20   with datatypes 
1df0: 6f 66 20 22 56 41 52 43 48 41 52 28 31 32 29 22  of "VARCHAR(12)"
1e00: 20 61 6e 64 20 22 49 4e 54 45 47 45 52 22 2e 0d   and "INTEGER"..
1e10: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
1e20: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
1e30: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
1e40: 20 20 2f 2f 2f 20 41 6e 20 65 78 61 6d 70 6c 65    /// An example
1e50: 20 75 73 65 20 6f 66 20 68 69 64 64 65 6e 20 63   use of hidden c
1e60: 6f 6c 75 6d 6e 73 20 63 61 6e 20 62 65 20 73 65  olumns can be se
1e70: 65 6e 20 69 6e 20 74 68 65 20 46 54 53 33 20 76  en in the FTS3 v
1e80: 69 72 74 75 61 6c 20 0d 0a 20 20 20 20 20 20 20  irtual ..       
1e90: 20 2f 2f 2f 20 74 61 62 6c 65 20 69 6d 70 6c 65   /// table imple
1ea0: 6d 65 6e 74 61 74 69 6f 6e 2c 20 77 68 65 72 65  mentation, where
1eb0: 20 65 76 65 72 79 20 46 54 53 20 76 69 72 74 75   every FTS virtu
1ec0: 61 6c 20 74 61 62 6c 65 0d 0a 20 20 20 20 20 20  al table..      
1ed0: 20 20 2f 2f 2f 20 63 6f 6e 74 61 69 6e 73 20 61    /// contains a
1ee0: 6e 20 46 54 53 20 68 69 64 64 65 6e 20 63 6f 6c  n FTS hidden col
1ef0: 75 6d 6e 20 74 68 61 74 20 69 73 20 75 73 65 64  umn that is used
1f00: 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61   to pass informa
1f10: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 0d 0a 20  tion from the.. 
1f20: 20 20 20 20 20 20 20 2f 2f 2f 20 76 69 72 74 75         /// virtu
1f30: 61 6c 20 74 61 62 6c 65 20 69 6e 74 6f 20 46 54  al table into FT
1f40: 53 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63  S auxiliary func
1f50: 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 74 68 65  tions and to the
1f60: 20 46 54 53 20 4d 41 54 43 48 20 6f 70 65 72 61   FTS MATCH opera
1f70: 74 6f 72 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  tor...        //
1f80: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
1f90: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
1fa0: 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 76 69 72         /// A vir
1fb0: 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
1fc0: 63 6f 6e 74 61 69 6e 73 20 68 69 64 64 65 6e 20  contains hidden 
1fd0: 63 6f 6c 75 6d 6e 73 20 63 61 6e 20 62 65 20 75  columns can be u
1fe0: 73 65 64 20 6c 69 6b 65 0d 0a 20 20 20 20 20 20  sed like..      
1ff0: 20 20 2f 2f 2f 20 61 20 74 61 62 6c 65 2d 76 61    /// a table-va
2000: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 69 6e  lued function in
2010: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2020: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
2030: 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20  tement...       
2040: 20 2f 2f 2f 20 54 68 65 20 61 72 67 75 6d 65 6e   /// The argumen
2050: 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2d  ts to the table-
2060: 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20  valued function 
2070: 62 65 63 6f 6d 65 20 63 6f 6e 73 74 72 61 69 6e  become constrain
2080: 74 73 20 6f 6e 20 0d 0a 20 20 20 20 20 20 20 20  ts on ..        
2090: 2f 2f 2f 20 74 68 65 20 48 49 44 44 45 4e 20 63  /// the HIDDEN c
20a0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69  olumns of the vi
20b0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a 20 20  rtual table...  
20c0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
20d0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
20e0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
20f0: 2f 2f 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  // For example, 
2100: 74 68 65 20 22 67 65 6e 65 72 61 74 65 5f 73 65  the "generate_se
2110: 72 69 65 73 22 20 65 78 74 65 6e 73 69 6f 6e 20  ries" extension 
2120: 28 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d  (located in the.
2130: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 65 78 74  .        /// ext
2140: 2f 6d 69 73 63 2f 73 65 72 69 65 73 2e 63 0d 0a  /misc/series.c..
2150: 20 20 20 20 20 20 20 20 2f 2f 2f 20 66 69 6c 65          /// file
2160: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
2170: 72 65 65 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ree)..        //
2180: 2f 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20  / implements an 
2190: 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
21a0: 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
21b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 68 65 6d   following schem
21c0: 61 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a:..        /// 
21d0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
21e0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65   /// <para><code
21f0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 43  >..        /// C
2200: 52 45 41 54 45 20 54 41 42 4c 45 20 67 65 6e 65  REATE TABLE gene
2210: 72 61 74 65 5f 73 65 72 69 65 73 28 0d 0a 20 20  rate_series(..  
2220: 20 20 20 20 20 20 2f 2f 2f 20 20 20 76 61 6c 75        ///   valu
2230: 65 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e,..        /// 
2240: 20 20 73 74 61 72 74 20 48 49 44 44 45 4e 2c 0d    start HIDDEN,.
2250: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 73  .        ///   s
2260: 74 6f 70 20 48 49 44 44 45 4e 2c 0d 0a 20 20 20  top HIDDEN,..   
2270: 20 20 20 20 20 2f 2f 2f 20 20 20 73 74 65 70 20       ///   step 
2280: 48 49 44 44 45 4e 0d 0a 20 20 20 20 20 20 20 20  HIDDEN..        
2290: 2f 2f 2f 20 29 3b 0d 0a 20 20 20 20 20 20 20 20  /// );..        
22a0: 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72  /// </code></par
22b0: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
22c0: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
22d0: 2f 2f 2f 20 54 68 65 20 73 71 6c 69 74 65 33 5f  /// The sqlite3_
22e0: 6d 6f 64 75 6c 65 2e 78 42 65 73 74 49 6e 64 65  module.xBestInde
22f0: 78 20 6d 65 74 68 6f 64 20 69 6e 20 74 68 65 20  x method in the 
2300: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2310: 66 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  f this..        
2320: 2f 2f 2f 20 74 61 62 6c 65 20 63 68 65 63 6b 73  /// table checks
2330: 20 66 6f 72 20 65 71 75 61 6c 69 74 79 20 63 6f   for equality co
2340: 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73  nstraints agains
2350: 74 20 74 68 65 20 48 49 44 44 45 4e 20 63 6f 6c  t the HIDDEN col
2360: 75 6d 6e 73 2c 20 61 6e 64 20 75 73 65 73 0d 0a  umns, and uses..
2370: 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 6f 73          /// thos
2380: 65 20 61 73 20 69 6e 70 75 74 20 70 61 72 61 6d  e as input param
2390: 65 74 65 72 73 20 74 6f 20 64 65 74 65 72 6d 69  eters to determi
23a0: 6e 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  ne the range of 
23b0: 69 6e 74 65 67 65 72 20 22 76 61 6c 75 65 22 20  integer "value" 
23c0: 6f 75 74 70 75 74 73 0d 0a 20 20 20 20 20 20 20  outputs..       
23d0: 20 2f 2f 2f 20 74 6f 20 67 65 6e 65 72 61 74 65   /// to generate
23e0: 2e 20 20 52 65 61 73 6f 6e 61 62 6c 65 20 64 65  .  Reasonable de
23f0: 66 61 75 6c 74 73 20 61 72 65 20 75 73 65 64 20  faults are used 
2400: 66 6f 72 20 61 6e 79 20 75 6e 63 6f 6e 73 74 72  for any unconstr
2410: 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 0d 0a  ained columns...
2420: 20 20 20 20 20 20 20 20 2f 2f 2f 20 46 6f 72 20          /// For 
2430: 65 78 61 6d 70 6c 65 2c 20 74 6f 20 6c 69 73 74  example, to list
2440: 20 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 62 65   all integers be
2450: 74 77 65 65 6e 20 35 20 61 6e 64 20 35 30 3a 0d  tween 5 and 50:.
2460: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
2470: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
2480: 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a  / <para><code>..
2490: 20 20 20 20 20 20 20 20 2f 2f 2f 20 53 45 4c 45          /// SELE
24a0: 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 67 65  CT value FROM ge
24b0: 6e 65 72 61 74 65 5f 73 65 72 69 65 73 28 35 2c  nerate_series(5,
24c0: 35 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  50);..        //
24d0: 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e  / </code></para>
24e0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
24f0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
2500: 2f 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 71  / The previous q
2510: 75 65 72 79 20 69 73 20 65 71 75 69 76 61 6c 65  uery is equivale
2520: 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nt to the follow
2530: 69 6e 67 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ing:..        //
2540: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
2550: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f     /// <para><co
2560: 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  de>..        ///
2570: 20 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52   SELECT value FR
2580: 4f 4d 20 67 65 6e 65 72 61 74 65 5f 73 65 72 69  OM generate_seri
2590: 65 73 20 57 48 45 52 45 20 73 74 61 72 74 3d 35  es WHERE start=5
25a0: 20 41 4e 44 20 73 74 6f 70 3d 35 30 3b 0d 0a 20   AND stop=50;.. 
25b0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64         /// </cod
25c0: 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  e></para>..     
25d0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
25e0: 20 20 20 20 20 20 20 2f 2f 2f 20 41 72 67 75 6d         /// Argum
25f0: 65 6e 74 73 20 6f 6e 20 74 68 65 20 76 69 72 74  ents on the virt
2600: 75 61 6c 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  ual table name a
2610: 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 68 69  re matched to hi
2620: 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 0d 0a 20 20  dden columns..  
2630: 20 20 20 20 20 20 2f 2f 2f 20 69 6e 20 6f 72 64        /// in ord
2640: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
2650: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 63 61 6e  of arguments can
2660: 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68   be less than th
2670: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6e  e..        /// n
2680: 75 6d 62 65 72 20 6f 66 20 68 69 64 64 65 6e 20  umber of hidden 
2690: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 20 77 68 69 63  columns, in whic
26a0: 68 20 63 61 73 65 20 74 68 65 20 6c 61 74 74 65  h case the latte
26b0: 72 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73  r hidden columns
26c0: 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f   are..        //
26d0: 2f 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2e  / unconstrained.
26e0: 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 20 65 72    However, an er
26f0: 72 6f 72 20 72 65 73 75 6c 74 73 20 69 66 20 74  ror results if t
2700: 68 65 72 65 20 61 72 65 20 6d 6f 72 65 20 61 72  here are more ar
2710: 67 75 6d 65 6e 74 73 0d 0a 20 20 20 20 20 20 20  guments..       
2720: 20 2f 2f 2f 20 74 68 61 6e 20 74 68 65 72 65 20   /// than there 
2730: 61 72 65 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d  are hidden colum
2740: 6e 73 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  ns in the virtua
2750: 6c 20 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  l table...      
2760: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
2770: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
2780: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 42  >..        /// B
2790: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 53 51  eginning with SQ
27a0: 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 33 2e 31  Lite version 3.1
27b0: 34 2e 30 20 28 32 30 31 36 2d 30 38 2d 30 38 29  4.0 (2016-08-08)
27c0: 2c 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  , ..        /// 
27d0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
27e0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0d   statement that.
27f0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 73 20  .        /// is 
2800: 70 61 73 73 65 64 20 69 6e 74 6f 20 73 71 6c 69  passed into sqli
2810: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
2820: 28 29 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  () may contain a
2830: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63   WITHOUT ROWID c
2840: 6c 61 75 73 65 2e 0d 0a 20 20 20 20 20 20 20 20  lause...        
2850: 2f 2f 2f 20 54 68 69 73 20 69 73 20 75 73 65 66  /// This is usef
2860: 75 6c 20 66 6f 72 20 63 61 73 65 73 20 77 68 65  ul for cases whe
2870: 72 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  re the virtual t
2880: 61 62 6c 65 20 72 6f 77 73 20 0d 0a 20 20 20 20  able rows ..    
2890: 20 20 20 20 2f 2f 2f 20 63 61 6e 6e 6f 74 20 65      /// cannot e
28a0: 61 73 69 6c 79 20 62 65 20 6d 61 70 70 65 64 20  asily be mapped 
28b0: 69 6e 74 6f 20 75 6e 69 71 75 65 20 69 6e 74 65  into unique inte
28c0: 67 65 72 73 2e 20 20 41 20 43 52 45 41 54 45 20  gers.  A CREATE 
28d0: 54 41 42 4c 45 0d 0a 20 20 20 20 20 20 20 20 2f  TABLE..        /
28e0: 2f 2f 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  // statement tha
28f0: 74 20 69 6e 63 6c 75 64 65 73 20 57 49 54 48 4f  t includes WITHO
2900: 55 54 20 52 4f 57 49 44 20 6d 75 73 74 20 64 65  UT ROWID must de
2910: 66 69 6e 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  fine one or more
2920: 20 63 6f 6c 75 6d 6e 73 20 61 73 0d 0a 20 20 20   columns as..   
2930: 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 50 52 49       /// the PRI
2940: 4d 41 52 59 20 4b 45 59 2e 20 20 45 76 65 72 79  MARY KEY.  Every
2950: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 50   column of the P
2960: 52 49 4d 41 52 59 20 4b 45 59 20 6d 75 73 74 20  RIMARY KEY must 
2970: 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 62 65 0d  individually be.
2980: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 4e 4f 54  .        /// NOT
2990: 20 4e 55 4c 4c 20 61 6e 64 20 61 6c 6c 20 63 6f   NULL and all co
29a0: 6c 75 6d 6e 73 20 66 6f 72 20 65 61 63 68 20 72  lumns for each r
29b0: 6f 77 20 6d 75 73 74 20 62 65 20 63 6f 6c 6c 65  ow must be colle
29c0: 63 74 69 76 65 6c 79 20 75 6e 69 71 75 65 2e 0d  ctively unique..
29d0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
29e0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
29f0: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
2a00: 20 20 2f 2f 2f 20 4e 6f 74 65 20 74 68 61 74 20    /// Note that 
2a10: 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20  SQLite does not 
2a20: 65 6e 66 6f 72 63 65 20 74 68 65 20 50 52 49 4d  enforce the PRIM
2a30: 41 52 59 20 4b 45 59 20 66 6f 72 20 61 20 57 49  ARY KEY for a WI
2a40: 54 48 4f 55 54 20 52 4f 57 49 44 0d 0a 20 20 20  THOUT ROWID..   
2a50: 20 20 20 20 20 2f 2f 2f 20 76 69 72 74 75 61 6c       /// virtual
2a60: 20 74 61 62 6c 65 2e 20 20 45 6e 66 6f 72 63 65   table.  Enforce
2a70: 6d 65 6e 74 20 69 73 20 74 68 65 20 72 65 73 70  ment is the resp
2a80: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
2a90: 65 20 75 6e 64 65 72 6c 79 69 6e 67 0d 0a 20 20  e underlying..  
2aa0: 20 20 20 20 20 20 2f 2f 2f 20 76 69 72 74 75 61        /// virtua
2ab0: 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e  l table implemen
2ac0: 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 53 51 4c  tation.  But SQL
2ad0: 69 74 65 20 64 6f 65 73 20 61 73 73 75 6d 65 20  ite does assume 
2ae0: 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59  that the PRIMARY
2af0: 20 4b 45 59 0d 0a 20 20 20 20 20 20 20 20 2f 2f   KEY..        //
2b00: 2f 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  / constraint is 
2b10: 76 61 6c 69 64 20 2d 20 74 68 61 74 20 74 68 65  valid - that the
2b20: 20 69 64 65 6e 74 69 66 69 65 64 20 63 6f 6c 75   identified colu
2b30: 6d 6e 73 20 72 65 61 6c 6c 79 20 61 72 65 20 55  mns really are U
2b40: 4e 49 51 55 45 20 61 6e 64 0d 0a 20 20 20 20 20  NIQUE and..     
2b50: 20 20 20 2f 2f 2f 20 4e 4f 54 20 4e 55 4c 4c 20     /// NOT NULL 
2b60: 2d 20 61 6e 64 20 69 74 20 75 73 65 73 20 74 68  - and it uses th
2b70: 61 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 74 6f  at assumption to
2b80: 20 6f 70 74 69 6d 69 7a 65 20 71 75 65 72 69 65   optimize querie
2b90: 73 20 61 67 61 69 6e 73 74 20 74 68 65 0d 0a 20  s against the.. 
2ba0: 20 20 20 20 20 20 20 2f 2f 2f 20 76 69 72 74 75         /// virtu
2bb0: 61 6c 20 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20  al table...     
2bc0: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
2bd0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
2be0: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
2bf0: 54 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  The rowid column
2c00: 20 69 73 20 6e 6f 74 20 61 63 63 65 73 73 69 62   is not accessib
2c10: 6c 65 20 6f 6e 20 61 0d 0a 20 20 20 20 20 20 20  le on a..       
2c20: 20 2f 2f 2f 20 57 49 54 48 4f 55 54 20 52 4f 57   /// WITHOUT ROW
2c30: 49 44 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ID virtual table
2c40: 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 0d 0a 20   (of course)... 
2c50: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
2c60: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
2c70: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
2c80: 2f 2f 2f 20 54 68 65 20 78 55 70 64 61 74 65 20  /// The xUpdate 
2c90: 6d 65 74 68 6f 64 20 77 61 73 20 6f 72 69 67 69  method was origi
2ca0: 6e 61 6c 6c 79 20 64 65 73 69 67 6e 65 64 20 61  nally designed a
2cb0: 72 6f 75 6e 64 20 68 61 76 69 6e 67 20 61 0d 0a  round having a..
2cc0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 52 4f 57 49          /// ROWI
2cd0: 44 20 61 73 20 61 20 73 69 6e 67 6c 65 20 76 61  D as a single va
2ce0: 6c 75 65 2e 20 20 54 68 65 20 78 55 70 64 61 74  lue.  The xUpdat
2cf0: 65 20 6d 65 74 68 6f 64 20 68 61 73 20 62 65 65  e method has bee
2d00: 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 0d 0a 20  n expanded to.. 
2d10: 20 20 20 20 20 20 20 2f 2f 2f 20 61 63 63 6f 6d         /// accom
2d20: 6d 6f 64 61 74 65 20 61 6e 20 61 72 62 69 74 72  modate an arbitr
2d30: 61 72 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20  ary PRIMARY KEY 
2d40: 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
2d50: 52 4f 57 49 44 2c 20 62 75 74 20 74 68 65 0d 0a  ROWID, but the..
2d60: 20 20 20 20 20 20 20 20 2f 2f 2f 20 50 52 49 4d          /// PRIM
2d70: 41 52 59 20 4b 45 59 20 6d 75 73 74 20 73 74 69  ARY KEY must sti
2d80: 6c 6c 20 62 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  ll be only one c
2d90: 6f 6c 75 6d 6e 2e 20 20 46 6f 72 20 74 68 69 73  olumn.  For this
2da0: 20 72 65 61 73 6f 6e 2c 20 53 51 4c 69 74 65 0d   reason, SQLite.
2db0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 77 69 6c  .        /// wil
2dc0: 6c 20 72 65 6a 65 63 74 20 61 6e 79 20 57 49 54  l reject any WIT
2dd0: 48 4f 55 54 20 52 4f 57 49 44 20 76 69 72 74 75  HOUT ROWID virtu
2de0: 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 68 61  al table that ha
2df0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0d  s more than one.
2e00: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 50 52 49  .        /// PRI
2e10: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
2e20: 61 6e 64 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 78  and a non-NULL x
2e30: 55 70 64 61 74 65 20 6d 65 74 68 6f 64 2e 0d 0a  Update method...
2e40: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
2e50: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
2e60: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
2e70: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
2e80: 6e 61 6d 65 3d 22 70 44 62 22 3e 0d 0a 20 20 20  name="pDb">..   
2e90: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74       /// The nat
2ea0: 69 76 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ive database con
2eb0: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 2e 0d  nection handle..
2ec0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
2ed0: 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f  aram>..        /
2ee0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
2ef0: 70 41 75 78 22 3e 0d 0a 20 20 20 20 20 20 20 20  pAux">..        
2f00: 2f 2f 2f 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  /// The original
2f10: 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20   native pointer 
2f20: 76 61 6c 75 65 20 74 68 61 74 20 77 61 73 20 70  value that was p
2f30: 72 6f 76 69 64 65 64 20 74 6f 20 74 68 65 0d 0a  rovided to the..
2f40: 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 71 6c 69          /// sqli
2f50: 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
2f60: 65 28 29 2c 20 73 71 6c 69 74 65 33 5f 63 72 65  e(), sqlite3_cre
2f70: 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 29 20  ate_module_v2() 
2f80: 6f 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  or..        /// 
2f90: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 64  sqlite3_create_d
2fa0: 69 73 70 6f 73 61 62 6c 65 5f 6d 6f 64 75 6c 65  isposable_module
2fb0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0d 0a 20  () functions... 
2fc0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
2fd0: 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  am>..        ///
2fe0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72   <param name="ar
2ff0: 67 63 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  gc">..        //
3000: 2f 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  / The number of 
3010: 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74  arguments from t
3020: 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
3030: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
3040: 74 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  t...        /// 
3050: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
3060: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
3070: 65 3d 22 61 72 67 76 22 3e 0d 0a 20 20 20 20 20  e="argv">..     
3080: 20 20 20 2f 2f 2f 20 54 68 65 20 61 72 72 61 79     /// The array
3090: 20 6f 66 20 73 74 72 69 6e 67 20 61 72 67 75 6d   of string argum
30a0: 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 43 52  ents from the CR
30b0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
30c0: 4c 45 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  LE..        /// 
30d0: 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20  statement...    
30e0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
30f0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
3100: 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74 61 62  aram name="pVtab
3110: 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ">..        /// 
3120: 55 70 6f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  Upon success, th
3130: 69 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  is parameter mus
3140: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 74 6f  t be modified to
3150: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
3160: 77 6c 79 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  wly..        ///
3170: 20 63 72 65 61 74 65 64 20 6e 61 74 69 76 65 20   created native 
3180: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 64 65 72  sqlite3_vtab der
3190: 69 76 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d  ived structure..
31a0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
31b0: 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f  aram>..        /
31c0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
31d0: 70 45 72 72 6f 72 22 3e 0d 0a 20 20 20 20 20 20  pError">..      
31e0: 20 20 2f 2f 2f 20 55 70 6f 6e 20 66 61 69 6c 75    /// Upon failu
31f0: 72 65 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74  re, this paramet
3200: 65 72 20 6d 75 73 74 20 62 65 20 6d 6f 64 69 66  er must be modif
3210: 69 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ied to point to 
3220: 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20  the error..     
3230: 20 20 20 2f 2f 2f 20 6d 65 73 73 61 67 65 2c 20     /// message, 
3240: 77 69 74 68 20 74 68 65 20 75 6e 64 65 72 6c 79  with the underly
3250: 69 6e 67 20 6d 65 6d 6f 72 79 20 68 61 76 69 6e  ing memory havin
3260: 67 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  g been obtained 
3270: 66 72 6f 6d 20 74 68 65 0d 0a 20 20 20 20 20 20  from the..      
3280: 20 20 2f 2f 2f 20 73 71 6c 69 74 65 33 5f 6d 61    /// sqlite3_ma
3290: 6c 6c 6f 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e  lloc() function.
32a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
32b0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20  param>..        
32c0: 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20  /// <returns>.. 
32d0: 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74 61         /// A sta
32e0: 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72 65 74  ndard SQLite ret
32f0: 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20  urn code...     
3300: 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73     /// </returns
3310: 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74  >..        SQLit
3320: 65 45 72 72 6f 72 43 6f 64 65 20 78 43 72 65 61  eErrorCode xCrea
3330: 74 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  te(..           
3340: 20 49 6e 74 50 74 72 20 70 44 62 2c 0d 0a 20 20   IntPtr pDb,..  
3350: 20 20 20 20 20 20 20 20 20 20 49 6e 74 50 74 72            IntPtr
3360: 20 70 41 75 78 2c 0d 0a 20 20 20 20 20 20 20 20   pAux,..        
3370: 20 20 20 20 69 6e 74 20 61 72 67 63 2c 0d 0a 20      int argc,.. 
3380: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 50 74             IntPt
3390: 72 20 61 72 67 76 2c 0d 0a 20 20 20 20 20 20 20  r argv,..       
33a0: 20 20 20 20 20 72 65 66 20 49 6e 74 50 74 72 20       ref IntPtr 
33b0: 70 56 74 61 62 2c 0d 0a 20 20 20 20 20 20 20 20  pVtab,..        
33c0: 20 20 20 20 72 65 66 20 49 6e 74 50 74 72 20 70      ref IntPtr p
33d0: 45 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  Error..         
33e0: 20 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20     );....       
33f0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
3400: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3430: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
3440: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
3450: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
3460: 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20  para><code>..   
3470: 20 20 20 20 20 2f 2f 2f 20 69 6e 74 20 28 2a 78       /// int (*x
3480: 43 6f 6e 6e 65 63 74 29 28 73 71 6c 69 74 65 33  Connect)(sqlite3
3490: 2a 2c 20 76 6f 69 64 20 2a 70 41 75 78 2c 0d 0a  *, void *pAux,..
34a0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20          ///     
34b0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 72 67           int arg
34c0: 63 2c 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  c, char *const*a
34d0: 72 67 76 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f  rgv,..        //
34e0: 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  /              s
34f0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
3500: 56 54 61 62 2c 0d 0a 20 20 20 20 20 20 20 20 2f  VTab,..        /
3510: 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  //              
3520: 63 68 61 72 20 2a 2a 70 7a 45 72 72 29 3b 0d 0a  char **pzErr);..
3530: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f          /// </co
3540: 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  de></para>..    
3550: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
3560: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
3570: 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 20  xConnect method 
3580: 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20  is very similar 
3590: 74 6f 20 78 43 72 65 61 74 65 2e 20 0d 0a 20 20  to xCreate. ..  
35a0: 20 20 20 20 20 20 2f 2f 2f 20 49 74 20 68 61 73        /// It has
35b0: 20 74 68 65 20 73 61 6d 65 20 70 61 72 61 6d 65   the same parame
35c0: 74 65 72 73 20 61 6e 64 20 63 6f 6e 73 74 72 75  ters and constru
35d0: 63 74 73 20 61 20 6e 65 77 20 73 71 6c 69 74 65  cts a new sqlite
35e0: 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65  3_vtab structure
35f0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6a   ..        /// j
3600: 75 73 74 20 6c 69 6b 65 20 78 43 72 65 61 74 65  ust like xCreate
3610: 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  . ..        /// 
3620: 41 6e 64 20 69 74 20 6d 75 73 74 20 61 6c 73 6f  And it must also
3630: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 64 65   call sqlite3_de
3640: 63 6c 61 72 65 5f 76 74 61 62 28 29 20 6c 69 6b  clare_vtab() lik
3650: 65 20 78 43 72 65 61 74 65 2e 0d 0a 20 20 20 20  e xCreate...    
3660: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
3670: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
3680: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
3690: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
36a0: 69 73 20 74 68 61 74 20 78 43 6f 6e 6e 65 63 74  is that xConnect
36b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73   is called to es
36c0: 74 61 62 6c 69 73 68 20 61 20 6e 65 77 20 0d 0a  tablish a new ..
36d0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 63 6f 6e 6e          /// conn
36e0: 65 63 74 69 6f 6e 20 74 6f 20 61 6e 20 65 78 69  ection to an exi
36f0: 73 74 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61  sting virtual ta
3700: 62 6c 65 20 77 68 65 72 65 61 73 20 78 43 72 65  ble whereas xCre
3710: 61 74 65 20 69 73 20 63 61 6c 6c 65 64 20 0d 0a  ate is called ..
3720: 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20 63          /// to c
3730: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
3740: 75 61 6c 20 74 61 62 6c 65 20 66 72 6f 6d 20 73  ual table from s
3750: 63 72 61 74 63 68 2e 0d 0a 20 20 20 20 20 20 20  cratch...       
3760: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
3770: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
3780: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
3790: 65 20 78 43 72 65 61 74 65 20 61 6e 64 20 78 43  e xCreate and xC
37a0: 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 73 20 61  onnect methods a
37b0: 72 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e  re only differen
37c0: 74 20 77 68 65 6e 20 74 68 65 0d 0a 20 20 20 20  t when the..    
37d0: 20 20 20 20 2f 2f 2f 20 76 69 72 74 75 61 6c 20      /// virtual 
37e0: 74 61 62 6c 65 20 68 61 73 20 73 6f 6d 65 20 6b  table has some k
37f0: 69 6e 64 20 6f 66 20 62 61 63 6b 69 6e 67 20 73  ind of backing s
3800: 74 6f 72 65 20 74 68 61 74 20 6d 75 73 74 20 62  tore that must b
3810: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0d 0a  e initialized ..
3820: 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20          /// the 
3830: 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 76  first time the v
3840: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
3850: 63 72 65 61 74 65 64 2e 20 54 68 65 20 78 43 72  created. The xCr
3860: 65 61 74 65 20 6d 65 74 68 6f 64 20 63 72 65 61  eate method crea
3870: 74 65 73 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  tes ..        //
3880: 2f 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  / and initialize
3890: 73 20 74 68 65 20 62 61 63 6b 69 6e 67 20 73 74  s the backing st
38a0: 6f 72 65 2e 20 54 68 65 20 78 43 6f 6e 6e 65 63  ore. The xConnec
38b0: 74 20 6d 65 74 68 6f 64 20 6a 75 73 74 20 63 6f  t method just co
38c0: 6e 6e 65 63 74 73 20 0d 0a 20 20 20 20 20 20 20  nnects ..       
38d0: 20 2f 2f 2f 20 74 6f 20 61 6e 20 65 78 69 73 74   /// to an exist
38e0: 69 6e 67 20 62 61 63 6b 69 6e 67 20 73 74 6f 72  ing backing stor
38f0: 65 2e 20 20 57 68 65 6e 20 78 43 72 65 61 74 65  e.  When xCreate
3900: 20 61 6e 64 20 78 43 6f 6e 6e 65 63 74 20 61 72   and xConnect ar
3910: 65 20 74 68 65 20 73 61 6d 65 2c 0d 0a 20 20 20  e the same,..   
3920: 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 74 61 62       /// the tab
3930: 6c 65 20 69 73 20 61 6e 20 65 70 6f 6e 79 6d 6f  le is an eponymo
3940: 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
3950: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
3960: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
3970: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
3980: 20 20 20 20 2f 2f 2f 20 41 73 20 61 6e 20 65 78      /// As an ex
3990: 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
39a0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
39b0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
39c0: 68 61 74 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  hat ..        //
39d0: 2f 20 70 72 6f 76 69 64 65 73 20 72 65 61 64 2d  / provides read-
39e0: 6f 6e 6c 79 20 61 63 63 65 73 73 20 74 6f 20 65  only access to e
39f0: 78 69 73 74 69 6e 67 20 63 6f 6d 6d 61 2d 73 65  xisting comma-se
3a00: 70 61 72 61 74 65 64 2d 76 61 6c 75 65 20 28 43  parated-value (C
3a10: 53 56 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  SV)..        ///
3a20: 20 66 69 6c 65 73 20 6f 6e 20 64 69 73 6b 2e 20   files on disk. 
3a30: 54 68 65 72 65 20 69 73 20 6e 6f 20 62 61 63 6b  There is no back
3a40: 69 6e 67 20 73 74 6f 72 65 20 74 68 61 74 20 6e  ing store that n
3a50: 65 65 64 73 20 74 6f 20 62 65 20 63 72 65 61 74  eeds to be creat
3a60: 65 64 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ed ..        ///
3a70: 20 6f 72 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   or initialized 
3a80: 66 6f 72 20 73 75 63 68 20 61 20 76 69 72 74 75  for such a virtu
3a90: 61 6c 20 74 61 62 6c 65 20 28 73 69 6e 63 65 20  al table (since 
3aa0: 74 68 65 20 43 53 56 20 66 69 6c 65 73 20 61 6c  the CSV files al
3ab0: 72 65 61 64 79 20 0d 0a 20 20 20 20 20 20 20 20  ready ..        
3ac0: 2f 2f 2f 20 65 78 69 73 74 20 6f 6e 20 64 69 73  /// exist on dis
3ad0: 6b 29 20 73 6f 20 74 68 65 20 78 43 72 65 61 74  k) so the xCreat
3ae0: 65 20 61 6e 64 20 78 43 6f 6e 6e 65 63 74 20 6d  e and xConnect m
3af0: 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 69  ethods will be i
3b00: 64 65 6e 74 69 63 61 6c 20 0d 0a 20 20 20 20 20  dentical ..     
3b10: 20 20 20 2f 2f 2f 20 66 6f 72 20 74 68 61 74 20     /// for that 
3b20: 6d 6f 64 75 6c 65 2e 0d 0a 20 20 20 20 20 20 20  module...       
3b30: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
3b40: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
3b50: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 6e  ..        /// An
3b60: 6f 74 68 65 72 20 65 78 61 6d 70 6c 65 20 69 73  other example is
3b70: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
3b80: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
3b90: 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64   a full-text ind
3ba0: 65 78 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ex. ..        //
3bb0: 2f 20 54 68 65 20 78 43 72 65 61 74 65 20 6d 65  / The xCreate me
3bc0: 74 68 6f 64 20 6d 75 73 74 20 63 72 65 61 74 65  thod must create
3bd0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
3be0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
3bf0: 74 6f 20 68 6f 6c 64 20 0d 0a 20 20 20 20 20 20  to hold ..      
3c00: 20 20 2f 2f 2f 20 74 68 65 20 64 69 63 74 69 6f    /// the dictio
3c10: 6e 61 72 79 20 61 6e 64 20 70 6f 73 74 69 6e 67  nary and posting
3c20: 20 6c 69 73 74 73 20 66 6f 72 20 74 68 61 74 20   lists for that 
3c30: 69 6e 64 65 78 2e 20 54 68 65 20 78 43 6f 6e 6e  index. The xConn
3c40: 65 63 74 20 6d 65 74 68 6f 64 2c 0d 0a 20 20 20  ect method,..   
3c50: 20 20 20 20 20 2f 2f 2f 20 6f 6e 20 74 68 65 20       /// on the 
3c60: 6f 74 68 65 72 20 68 61 6e 64 2c 20 6f 6e 6c 79  other hand, only
3c70: 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 61   has to locate a
3c80: 6e 64 20 75 73 65 20 61 6e 20 65 78 69 73 74 69  nd use an existi
3c90: 6e 67 20 64 69 63 74 69 6f 6e 61 72 79 20 0d 0a  ng dictionary ..
3ca0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 6e 64 20          /// and 
3cb0: 70 6f 73 74 69 6e 67 20 6c 69 73 74 73 20 74 68  posting lists th
3cc0: 61 74 20 77 65 72 65 20 63 72 65 61 74 65 64 20  at were created 
3cd0: 62 79 20 61 20 70 72 69 6f 72 20 78 43 72 65 61  by a prior xCrea
3ce0: 74 65 20 63 61 6c 6c 2e 0d 0a 20 20 20 20 20 20  te call...      
3cf0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
3d00: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
3d10: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
3d20: 68 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68  he xConnect meth
3d30: 6f 64 20 6d 75 73 74 20 72 65 74 75 72 6e 20 53  od must return S
3d40: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74 20 69  QLITE_OK if it i
3d50: 73 20 73 75 63 63 65 73 73 66 75 6c 20 0d 0a 20  s successful .. 
3d60: 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 20 63 72         /// in cr
3d70: 65 61 74 69 6e 67 20 74 68 65 20 6e 65 77 20 76  eating the new v
3d80: 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 6f 72  irtual table, or
3d90: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
3da0: 20 69 74 20 69 73 20 6e 6f 74 20 0d 0a 20 20 20   it is not ..   
3db0: 20 20 20 20 20 2f 2f 2f 20 73 75 63 63 65 73 73       /// success
3dc0: 66 75 6c 2e 20 49 66 20 6e 6f 74 20 73 75 63 63  ful. If not succ
3dd0: 65 73 73 66 75 6c 2c 20 74 68 65 20 73 71 6c 69  essful, the sqli
3de0: 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75  te3_vtab structu
3df0: 72 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 0d  re must not be .
3e00: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 6c 6c  .        /// all
3e10: 6f 63 61 74 65 64 2e 20 41 6e 20 65 72 72 6f 72  ocated. An error
3e20: 20 6d 65 73 73 61 67 65 20 6d 61 79 20 6f 70 74   message may opt
3e30: 69 6f 6e 61 6c 6c 79 20 62 65 20 72 65 74 75 72  ionally be retur
3e40: 6e 65 64 20 69 6e 20 2a 70 7a 45 72 72 20 69 66  ned in *pzErr if
3e50: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 75   ..        /// u
3e60: 6e 73 75 63 63 65 73 73 66 75 6c 2e 20 0d 0a 20  nsuccessful. .. 
3e70: 20 20 20 20 20 20 20 2f 2f 2f 20 53 70 61 63 65         /// Space
3e80: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 72 72   to hold the err
3e90: 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
3ea0: 67 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  g must be alloca
3eb0: 74 65 64 20 75 73 69 6e 67 0d 0a 20 20 20 20 20  ted using..     
3ec0: 20 20 20 2f 2f 2f 20 61 6e 20 53 51 4c 69 74 65     /// an SQLite
3ed0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
3ee0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65  on function like
3ef0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73   ..        /// s
3f00: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
3f10: 6f 72 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  or sqlite3_mprin
3f20: 74 66 28 29 20 61 73 20 74 68 65 20 53 51 4c 69  tf() as the SQLi
3f30: 74 65 20 63 6f 72 65 20 77 69 6c 6c 0d 0a 20 20  te core will..  
3f40: 20 20 20 20 20 20 2f 2f 2f 20 61 74 74 65 6d 70        /// attemp
3f50: 74 20 74 6f 20 66 72 65 65 20 74 68 65 20 73 70  t to free the sp
3f60: 61 63 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ace using sqlite
3f70: 33 5f 66 72 65 65 28 29 20 61 66 74 65 72 20 74  3_free() after t
3f80: 68 65 20 65 72 72 6f 72 20 68 61 73 0d 0a 20 20  he error has..  
3f90: 20 20 20 20 20 20 2f 2f 2f 20 62 65 65 6e 20 72        /// been r
3fa0: 65 70 6f 72 74 65 64 20 75 70 20 74 6f 20 74 68  eported up to th
3fb0: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0d 0a  e application...
3fc0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
3fd0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
3fe0: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
3ff0: 20 2f 2f 2f 20 54 68 65 20 78 43 6f 6e 6e 65 63   /// The xConnec
4000: 74 20 6d 65 74 68 6f 64 20 69 73 20 72 65 71 75  t method is requ
4010: 69 72 65 64 20 66 6f 72 20 65 76 65 72 79 20 76  ired for every v
4020: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70  irtual table imp
4030: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 0d 0a 20  lementation, .. 
4040: 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 6f 75 67         /// thoug
4050: 68 20 74 68 65 20 78 43 72 65 61 74 65 20 61 6e  h the xCreate an
4060: 64 20 78 43 6f 6e 6e 65 63 74 20 70 6f 69 6e 74  d xConnect point
4070: 65 72 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ers of the sqlit
4080: 65 33 5f 6d 6f 64 75 6c 65 20 6f 62 6a 65 63 74  e3_module object
4090: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d 61  ..        /// ma
40a0: 79 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  y point to the s
40b0: 61 6d 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  ame function if 
40c0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
40d0: 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
40e0: 74 6f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  to..        /// 
40f0: 69 6e 69 74 69 61 6c 69 7a 65 20 62 61 63 6b 69  initialize backi
4100: 6e 67 20 73 74 6f 72 65 2e 0d 0a 20 20 20 20 20  ng store...     
4110: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
4120: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75          /// </su
4130: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20  mmary>..        
4140: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
4150: 22 70 44 62 22 3e 0d 0a 20 20 20 20 20 20 20 20  "pDb">..        
4160: 2f 2f 2f 20 54 68 65 20 6e 61 74 69 76 65 20 64  /// The native d
4170: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
4180: 6f 6e 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  on handle...    
4190: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
41a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
41b0: 61 72 61 6d 20 6e 61 6d 65 3d 22 70 41 75 78 22  aram name="pAux"
41c0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
41d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6e 61 74 69  he original nati
41e0: 76 65 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65  ve pointer value
41f0: 20 74 68 61 74 20 77 61 73 20 70 72 6f 76 69 64   that was provid
4200: 65 64 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  ed to the..     
4210: 20 20 20 2f 2f 2f 20 73 71 6c 69 74 65 33 5f 63     /// sqlite3_c
4220: 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 29 2c 20  reate_module(), 
4230: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d  sqlite3_create_m
4240: 6f 64 75 6c 65 5f 76 32 28 29 20 6f 72 0d 0a 20  odule_v2() or.. 
4250: 20 20 20 20 20 20 20 2f 2f 2f 20 73 71 6c 69 74         /// sqlit
4260: 65 33 5f 63 72 65 61 74 65 5f 64 69 73 70 6f 73  e3_create_dispos
4270: 61 62 6c 65 5f 6d 6f 64 75 6c 65 28 29 20 66 75  able_module() fu
4280: 6e 63 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20  nctions...      
4290: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a    /// </param>..
42a0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
42b0: 61 6d 20 6e 61 6d 65 3d 22 61 72 67 63 22 3e 0d  am name="argc">.
42c0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
42d0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
42e0: 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 43 52  ents from the CR
42f0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
4300: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20  LE statement... 
4310: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
4320: 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  am>..        ///
4330: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72   <param name="ar
4340: 67 76 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  gv">..        //
4350: 2f 20 54 68 65 20 61 72 72 61 79 20 6f 66 20 73  / The array of s
4360: 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20  tring arguments 
4370: 66 72 6f 6d 20 74 68 65 20 43 52 45 41 54 45 20  from the CREATE 
4380: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 0d 0a 20  VIRTUAL TABLE.. 
4390: 20 20 20 20 20 20 20 2f 2f 2f 20 73 74 61 74 65         /// state
43a0: 6d 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 2f  ment...        /
43b0: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
43c0: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
43d0: 6e 61 6d 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20  name="pVtab">.. 
43e0: 20 20 20 20 20 20 20 2f 2f 2f 20 55 70 6f 6e 20         /// Upon 
43f0: 73 75 63 63 65 73 73 2c 20 74 68 69 73 20 70 61  success, this pa
4400: 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20  rameter must be 
4410: 6d 6f 64 69 66 69 65 64 20 74 6f 20 70 6f 69 6e  modified to poin
4420: 74 20 74 6f 20 74 68 65 20 6e 65 77 6c 79 0d 0a  t to the newly..
4430: 20 20 20 20 20 20 20 20 2f 2f 2f 20 63 72 65 61          /// crea
4440: 74 65 64 20 6e 61 74 69 76 65 20 73 71 6c 69 74  ted native sqlit
4450: 65 33 5f 76 74 61 62 20 64 65 72 69 76 65 64 20  e3_vtab derived 
4460: 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20 20  structure...    
4470: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
4480: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
4490: 61 72 61 6d 20 6e 61 6d 65 3d 22 70 45 72 72 6f  aram name="pErro
44a0: 72 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  r">..        ///
44b0: 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 74   Upon failure, t
44c0: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75  his parameter mu
44d0: 73 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 74  st be modified t
44e0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65  o point to the e
44f0: 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f  rror..        //
4500: 2f 20 6d 65 73 73 61 67 65 2c 20 77 69 74 68 20  / message, with 
4510: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  the underlying m
4520: 65 6d 6f 72 79 20 68 61 76 69 6e 67 20 62 65 65  emory having bee
4530: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  n obtained from 
4540: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  the..        ///
4550: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
4560: 29 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20  ) function...   
4570: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d       /// </param
4580: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
4590: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20  returns>..      
45a0: 20 20 2f 2f 2f 20 41 20 73 74 61 6e 64 61 72 64    /// A standard
45b0: 20 53 51 4c 69 74 65 20 72 65 74 75 72 6e 20 63   SQLite return c
45c0: 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ode...        //
45d0: 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  / </returns>..  
45e0: 20 20 20 20 20 20 53 51 4c 69 74 65 45 72 72 6f        SQLiteErro
45f0: 72 43 6f 64 65 20 78 43 6f 6e 6e 65 63 74 28 0d  rCode xConnect(.
4600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  .            Int
4610: 50 74 72 20 70 44 62 2c 0d 0a 20 20 20 20 20 20  Ptr pDb,..      
4620: 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 41 75        IntPtr pAu
4630: 78 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  x,..            
4640: 69 6e 74 20 61 72 67 63 2c 0d 0a 20 20 20 20 20  int argc,..     
4650: 20 20 20 20 20 20 20 49 6e 74 50 74 72 20 61 72         IntPtr ar
4660: 67 76 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  gv,..           
4670: 20 72 65 66 20 49 6e 74 50 74 72 20 70 56 74 61   ref IntPtr pVta
4680: 62 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  b,..            
4690: 72 65 66 20 49 6e 74 50 74 72 20 70 45 72 72 6f  ref IntPtr pErro
46a0: 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  r..            )
46b0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ;....        ///
46c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
46d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
46e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
46f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4700: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
4710: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
4720: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
4730: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 53  >..        /// S
4740: 51 4c 69 74 65 20 75 73 65 73 20 74 68 65 20 78  QLite uses the x
4750: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
4760: 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
4770: 62 6c 65 20 6d 6f 64 75 6c 65 20 74 6f 20 64 65  ble module to de
4780: 74 65 72 6d 69 6e 65 0d 0a 20 20 20 20 20 20 20  termine..       
4790: 20 2f 2f 2f 20 74 68 65 20 62 65 73 74 20 77 61   /// the best wa
47a0: 79 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  y to access the 
47b0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 0d  virtual table. .
47c0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
47d0: 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
47e0: 6f 64 20 68 61 73 20 61 20 70 72 6f 74 6f 74 79  od has a prototy
47f0: 70 65 20 6c 69 6b 65 20 74 68 69 73 3a 0d 0a 20  pe like this:.. 
4800: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
4810: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
4820: 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20  <para><code>..  
4830: 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74 20 28 2a        /// int (*
4840: 78 42 65 73 74 49 6e 64 65 78 29 28 73 71 6c 69  xBestIndex)(sqli
4850: 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c  te3_vtab *pVTab,
4860: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
4870: 6e 66 6f 2a 29 3b 0d 0a 20 20 20 20 20 20 20 20  nfo*);..        
4880: 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72  /// </code></par
4890: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
48a0: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
48b0: 2f 2f 2f 20 54 68 65 20 53 51 4c 69 74 65 20 63  /// The SQLite c
48c0: 6f 72 65 20 63 6f 6d 6d 75 6e 69 63 61 74 65 73  ore communicates
48d0: 20 77 69 74 68 20 74 68 65 20 78 42 65 73 74 49   with the xBestI
48e0: 6e 64 65 78 20 6d 65 74 68 6f 64 20 62 79 20 66  ndex method by f
48f0: 69 6c 6c 69 6e 67 20 0d 0a 20 20 20 20 20 20 20  illing ..       
4900: 20 2f 2f 2f 20 69 6e 20 63 65 72 74 61 69 6e 20   /// in certain 
4910: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 71  fields of the sq
4920: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
4930: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 70   structure and p
4940: 61 73 73 69 6e 67 20 61 20 0d 0a 20 20 20 20 20  assing a ..     
4950: 20 20 20 2f 2f 2f 20 70 6f 69 6e 74 65 72 20 74     /// pointer t
4960: 6f 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  o that structure
4970: 20 69 6e 74 6f 20 78 42 65 73 74 49 6e 64 65 78   into xBestIndex
4980: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
4990: 61 72 61 6d 65 74 65 72 2e 20 0d 0a 20 20 20 20  arameter. ..    
49a0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 42 65 73      /// The xBes
49b0: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 66 69  tIndex method fi
49c0: 6c 6c 73 20 6f 75 74 20 6f 74 68 65 72 20 66 69  lls out other fi
49d0: 65 6c 64 73 20 6f 66 20 74 68 69 73 20 73 74 72  elds of this str
49e0: 75 63 74 75 72 65 20 77 68 69 63 68 0d 0a 20 20  ucture which..  
49f0: 20 20 20 20 20 20 2f 2f 2f 20 66 6f 72 6d 73 20        /// forms 
4a00: 74 68 65 20 72 65 70 6c 79 2e 20 54 68 65 20 73  the reply. The s
4a10: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
4a20: 6f 20 73 74 72 75 63 74 75 72 65 20 6c 6f 6f 6b  o structure look
4a30: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0d 0a 20 20  s like this:..  
4a40: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
4a50: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
4a60: 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20  para><code>..   
4a70: 20 20 20 20 20 2f 2f 2f 20 73 74 72 75 63 74 20       /// struct 
4a80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
4a90: 66 6f 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  fo {..        //
4aa0: 2f 20 20 20 2f 2a 20 49 6e 70 75 74 73 20 2a 2f  /   /* Inputs */
4ab0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
4ac0: 63 6f 6e 73 74 20 69 6e 74 20 6e 43 6f 6e 73 74  const int nConst
4ad0: 72 61 69 6e 74 3b 20 20 20 20 20 2f 2a 20 4e 75  raint;     /* Nu
4ae0: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
4af0: 69 6e 20 61 43 6f 6e 73 74 72 61 69 6e 74 20 2a  in aConstraint *
4b00: 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20  /..        ///  
4b10: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
4b20: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
4b30: 74 72 61 69 6e 74 20 7b 0d 0a 20 20 20 20 20 20  traint {..      
4b40: 20 20 2f 2f 2f 20 20 20 20 20 20 69 6e 74 20 69    ///      int i
4b50: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
4b60: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
4b70: 6f 6e 73 74 72 61 69 6e 65 64 2e 20 20 2d 31 20  onstrained.  -1 
4b80: 66 6f 72 20 52 4f 57 49 44 20 2a 2f 0d 0a 20 20  for ROWID */..  
4b90: 20 20 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 75        ///      u
4ba0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 70 3b  nsigned char op;
4bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73           /* Cons
4bc0: 74 72 61 69 6e 74 20 6f 70 65 72 61 74 6f 72 20  traint operator 
4bd0: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  */..        /// 
4be0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
4bf0: 61 72 20 75 73 61 62 6c 65 3b 20 20 20 20 20 2f  ar usable;     /
4c00: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 63  * True if this c
4c10: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 75 73 61  onstraint is usa
4c20: 62 6c 65 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  ble */..        
4c30: 2f 2f 2f 20 20 20 20 20 20 69 6e 74 20 69 54 65  ///      int iTe
4c40: 72 6d 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  rmOffset;       
4c50: 20 20 20 2f 2a 20 55 73 65 64 20 69 6e 74 65 72     /* Used inter
4c60: 6e 61 6c 6c 79 20 2d 20 78 42 65 73 74 49 6e 64  nally - xBestInd
4c70: 65 78 20 73 68 6f 75 6c 64 20 69 67 6e 6f 72 65  ex should ignore
4c80: 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   */..        ///
4c90: 20 20 20 7d 20 2a 63 6f 6e 73 74 20 61 43 6f 6e     } *const aCon
4ca0: 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 2f 2a  straint;      /*
4cb0: 20 54 61 62 6c 65 20 6f 66 20 57 48 45 52 45 20   Table of WHERE 
4cc0: 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
4cd0: 74 73 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f  ts */..        /
4ce0: 2f 2f 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  //   const int n
4cf0: 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
4d00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
4d10: 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
4d20: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0d 0a 20 20  BY clause */..  
4d30: 20 20 20 20 20 20 2f 2f 2f 20 20 20 63 6f 6e 73        ///   cons
4d40: 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  t struct sqlite3
4d50: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 7b  _index_orderby {
4d60: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
4d70: 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20     int iColumn; 
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d90: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f  Column number */
4da0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
4db0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
4dc0: 20 64 65 73 63 3b 20 20 20 20 20 20 20 2f 2a 20   desc;       /* 
4dd0: 54 72 75 65 20 66 6f 72 20 44 45 53 43 2e 20 20  True for DESC.  
4de0: 46 61 6c 73 65 20 66 6f 72 20 41 53 43 2e 20 2a  False for ASC. *
4df0: 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20  /..        ///  
4e00: 20 7d 20 2a 63 6f 6e 73 74 20 61 4f 72 64 65 72   } *const aOrder
4e10: 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  By;         /* T
4e20: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
4e30: 73 65 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f  se */..        /
4e40: 2f 2f 20 20 20 2f 2a 20 4f 75 74 70 75 74 73 20  //   /* Outputs 
4e50: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  */..        /// 
4e60: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
4e70: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
4e80: 74 5f 75 73 61 67 65 20 7b 0d 0a 20 20 20 20 20  t_usage {..     
4e90: 20 20 20 2f 2f 2f 20 20 20 20 20 69 6e 74 20 61     ///     int a
4ea0: 72 67 76 49 6e 64 65 78 3b 20 20 20 20 20 20 20  rgvIndex;       
4eb0: 20 20 20 20 2f 2a 20 69 66 20 3e 30 2c 20 63 6f      /* if >0, co
4ec0: 6e 73 74 72 61 69 6e 74 20 69 73 20 70 61 72 74  nstraint is part
4ed0: 20 6f 66 20 61 72 67 76 20 74 6f 20 78 46 69 6c   of argv to xFil
4ee0: 74 65 72 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  ter */..        
4ef0: 2f 2f 2f 20 20 20 20 20 75 6e 73 69 67 6e 65 64  ///     unsigned
4f00: 20 63 68 61 72 20 6f 6d 69 74 3b 20 20 20 20 20   char omit;     
4f10: 20 2f 2a 20 44 6f 20 6e 6f 74 20 63 6f 64 65 20   /* Do not code 
4f20: 61 20 74 65 73 74 20 66 6f 72 20 74 68 69 73 20  a test for this 
4f30: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0d 0a 20  constraint */.. 
4f40: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 7d 20 2a         ///   } *
4f50: 63 6f 6e 73 74 20 61 43 6f 6e 73 74 72 61 69 6e  const aConstrain
4f60: 74 55 73 61 67 65 3b 0d 0a 20 20 20 20 20 20 20  tUsage;..       
4f70: 20 2f 2f 2f 20 20 20 69 6e 74 20 69 64 78 4e 75   ///   int idxNu
4f80: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4f90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 75 73 65 64    /* Number used
4fa0: 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65   to identify the
4fb0: 20 69 6e 64 65 78 20 2a 2f 0d 0a 20 20 20 20 20   index */..     
4fc0: 20 20 20 2f 2f 2f 20 20 20 63 68 61 72 20 2a 69     ///   char *i
4fd0: 64 78 53 74 72 3b 20 20 20 20 20 20 20 20 20 20  dxStr;          
4fe0: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 2c 20 70      /* String, p
4ff0: 6f 73 73 69 62 6c 79 20 6f 62 74 61 69 6e 65 64  ossibly obtained
5000: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
5010: 6c 6c 6f 63 20 2a 2f 0d 0a 20 20 20 20 20 20 20  lloc */..       
5020: 20 2f 2f 2f 20 20 20 69 6e 74 20 6e 65 65 64 54   ///   int needT
5030: 6f 46 72 65 65 49 64 78 53 74 72 3b 20 20 20 20  oFreeIdxStr;    
5040: 20 20 2f 2a 20 46 72 65 65 20 69 64 78 53 74 72    /* Free idxStr
5050: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
5060: 72 65 65 28 29 20 69 66 20 74 72 75 65 20 2a 2f  ree() if true */
5070: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20  ..        ///   
5080: 69 6e 74 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  int orderByConsu
5090: 6d 65 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  med;       /* Tr
50a0: 75 65 20 69 66 20 6f 75 74 70 75 74 20 69 73 20  ue if output is 
50b0: 61 6c 72 65 61 64 79 20 6f 72 64 65 72 65 64 20  already ordered 
50c0: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  */..        /// 
50d0: 20 20 64 6f 75 62 6c 65 20 65 73 74 69 6d 61 74    double estimat
50e0: 65 64 43 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20  edCost;      /* 
50f0: 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f  Estimated cost o
5100: 66 20 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64  f using this ind
5110: 65 78 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f  ex */..        /
5120: 2f 2f 20 20 20 3c 21 5b 43 44 41 54 41 5b 3c 62  //   <![CDATA[<b
5130: 3e 5d 5d 3e 2f 2a 20 46 69 65 6c 64 73 20 62 65  >]]>/* Fields be
5140: 6c 6f 77 20 61 72 65 20 6f 6e 6c 79 20 61 76 61  low are only ava
5150: 69 6c 61 62 6c 65 20 69 6e 20 53 51 4c 69 74 65  ilable in SQLite
5160: 20 33 2e 38 2e 32 20 61 6e 64 20 6c 61 74 65 72   3.8.2 and later
5170: 20 2a 2f 3c 21 5b 43 44 41 54 41 5b 3c 2f 62 3e   */<![CDATA[</b>
5180: 5d 5d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ]]>..        ///
5190: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
51a0: 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 3b 20   estimatedRows; 
51b0: 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
51c0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72  number of rows r
51d0: 65 74 75 72 6e 65 64 20 2a 2f 0d 0a 20 20 20 20  eturned */..    
51e0: 20 20 20 20 2f 2f 2f 20 20 20 3c 21 5b 43 44 41      ///   <![CDA
51f0: 54 41 5b 3c 62 3e 5d 5d 3e 2f 2a 20 46 69 65 6c  TA[<b>]]>/* Fiel
5200: 64 73 20 62 65 6c 6f 77 20 61 72 65 20 6f 6e 6c  ds below are onl
5210: 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 53  y available in S
5220: 51 4c 69 74 65 20 33 2e 39 2e 30 20 61 6e 64 20  QLite 3.9.0 and 
5230: 6c 61 74 65 72 20 2a 2f 3c 21 5b 43 44 41 54 41  later */<![CDATA
5240: 5b 3c 2f 62 3e 5d 5d 3e 0d 0a 20 20 20 20 20 20  [</b>]]>..      
5250: 20 20 2f 2f 2f 20 20 20 69 6e 74 20 69 64 78 46    ///   int idxF
5260: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
5270: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 53 51     /* Mask of SQ
5280: 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f  LITE_INDEX_SCAN_
5290: 2a 20 66 6c 61 67 73 20 2a 2f 0d 0a 20 20 20 20  * flags */..    
52a0: 20 20 20 20 2f 2f 2f 20 20 20 3c 21 5b 43 44 41      ///   <![CDA
52b0: 54 41 5b 3c 62 3e 5d 5d 3e 2f 2a 20 46 69 65 6c  TA[<b>]]>/* Fiel
52c0: 64 73 20 62 65 6c 6f 77 20 61 72 65 20 6f 6e 6c  ds below are onl
52d0: 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 53  y available in S
52e0: 51 4c 69 74 65 20 33 2e 31 30 2e 30 20 61 6e 64  QLite 3.10.0 and
52f0: 20 6c 61 74 65 72 20 2a 2f 3c 21 5b 43 44 41 54   later */<![CDAT
5300: 41 5b 3c 2f 62 3e 5d 5d 3e 0d 0a 20 20 20 20 20  A[</b>]]>..     
5310: 20 20 20 2f 2f 2f 20 20 20 73 71 6c 69 74 65 33     ///   sqlite3
5320: 5f 75 69 6e 74 36 34 20 63 6f 6c 55 73 65 64 3b  _uint64 colUsed;
5330: 20 20 20 20 2f 2a 20 49 6e 70 75 74 3a 20 4d 61      /* Input: Ma
5340: 73 6b 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73  sk of columns us
5350: 65 64 20 62 79 20 73 74 61 74 65 6d 65 6e 74 20  ed by statement 
5360: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  */..        /// 
5370: 7d 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  };..        /// 
5380: 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a  </code></para>..
5390: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
53a0: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
53b0: 4e 6f 74 65 20 74 68 65 20 77 61 72 6e 69 6e 67  Note the warning
53c0: 73 20 6f 6e 20 74 68 65 20 22 65 73 74 69 6d 61  s on the "estima
53d0: 74 65 64 52 6f 77 73 22 2c 20 22 69 64 78 46 6c  tedRows", "idxFl
53e0: 61 67 73 22 2c 20 61 6e 64 20 63 6f 6c 55 73 65  ags", and colUse
53f0: 64 20 66 69 65 6c 64 73 2e 0d 0a 20 20 20 20 20  d fields...     
5400: 20 20 20 2f 2f 2f 20 54 68 65 73 65 20 66 69 65     /// These fie
5410: 6c 64 73 20 77 65 72 65 20 61 64 64 65 64 20 77  lds were added w
5420: 69 74 68 20 53 51 4c 69 74 65 20 76 65 72 73 69  ith SQLite versi
5430: 6f 6e 73 20 33 2e 38 2e 32 2c 20 33 2e 39 2e 30  ons 3.8.2, 3.9.0
5440: 2c 20 61 6e 64 20 33 2e 31 30 2e 30 2c 20 72 65  , and 3.10.0, re
5450: 73 70 65 63 74 69 76 65 6c 79 2e 20 0d 0a 20 20  spectively. ..  
5460: 20 20 20 20 20 20 2f 2f 2f 20 41 6e 79 20 65 78        /// Any ex
5470: 74 65 6e 73 69 6f 6e 20 74 68 61 74 20 72 65 61  tension that rea
5480: 64 73 20 6f 72 20 77 72 69 74 65 73 20 74 68 65  ds or writes the
5490: 73 65 20 66 69 65 6c 64 73 20 6d 75 73 74 20 66  se fields must f
54a0: 69 72 73 74 20 63 68 65 63 6b 20 74 68 61 74 20  irst check that 
54b0: 74 68 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  the ..        //
54c0: 2f 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  / version of the
54d0: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
54e0: 69 6e 20 75 73 65 20 69 73 20 67 72 65 61 74 65  in use is greate
54f0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
5500: 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a  to appropriate..
5510: 20 20 20 20 20 20 20 20 2f 2f 2f 20 76 65 72 73          /// vers
5520: 69 6f 6e 20 2d 20 70 65 72 68 61 70 73 20 63 6f  ion - perhaps co
5530: 6d 70 61 72 69 6e 67 20 74 68 65 20 76 61 6c 75  mparing the valu
5540: 65 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  e returned from 
5550: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
5560: 6f 6e 5f 6e 75 6d 62 65 72 28 29 0d 0a 20 20 20  on_number()..   
5570: 20 20 20 20 20 2f 2f 2f 20 61 67 61 69 6e 73 74       /// against
5580: 20 63 6f 6e 73 74 61 6e 74 73 20 33 30 30 38 30   constants 30080
5590: 30 32 2c 20 33 30 30 39 30 30 30 2c 20 61 6e 64  02, 3009000, and
55a0: 2f 6f 72 20 33 30 31 30 30 30 30 2e 20 54 68 65  /or 3010000. The
55b0: 20 72 65 73 75 6c 74 20 6f 66 20 61 74 74 65 6d   result of attem
55c0: 70 74 69 6e 67 20 0d 0a 20 20 20 20 20 20 20 20  pting ..        
55d0: 2f 2f 2f 20 74 6f 20 61 63 63 65 73 73 20 74 68  /// to access th
55e0: 65 73 65 20 66 69 65 6c 64 73 20 69 6e 20 61 6e  ese fields in an
55f0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
5600: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 72  nfo structure cr
5610: 65 61 74 65 64 20 62 79 20 61 6e 20 0d 0a 20 20  eated by an ..  
5620: 20 20 20 20 20 20 2f 2f 2f 20 6f 6c 64 65 72 20        /// older 
5630: 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69 74  version of SQLit
5640: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
5650: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
5660: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
5670: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
5680: 20 20 20 2f 2f 2f 20 49 6e 20 61 64 64 69 74 69     /// In additi
5690: 6f 6e 2c 20 74 68 65 72 65 20 61 72 65 20 73 6f  on, there are so
56a0: 6d 65 20 64 65 66 69 6e 65 64 20 63 6f 6e 73 74  me defined const
56b0: 61 6e 74 73 3a 0d 0a 20 20 20 20 20 20 20 20 2f  ants:..        /
56c0: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
56d0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63      /// <para><c
56e0: 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ode>..        //
56f0: 2f 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  / #define SQLITE
5700: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
5710: 54 5f 45 51 20 20 20 20 20 20 20 20 20 32 0d 0a  T_EQ         2..
5720: 20 20 20 20 20 20 20 20 2f 2f 2f 20 23 64 65 66          /// #def
5730: 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ine SQLITE_INDEX
5740: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 20  _CONSTRAINT_GT  
5750: 20 20 20 20 20 20 20 34 0d 0a 20 20 20 20 20 20         4..      
5760: 20 20 2f 2f 2f 20 23 64 65 66 69 6e 65 20 53 51    /// #define SQ
5770: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
5780: 52 41 49 4e 54 5f 4c 45 20 20 20 20 20 20 20 20  RAINT_LE        
5790: 20 38 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20   8..        /// 
57a0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49  #define SQLITE_I
57b0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
57c0: 4c 54 20 20 20 20 20 20 20 20 31 36 0d 0a 20 20  LT        16..  
57d0: 20 20 20 20 20 20 2f 2f 2f 20 23 64 65 66 69 6e        /// #defin
57e0: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  e SQLITE_INDEX_C
57f0: 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 20 20 20  ONSTRAINT_GE    
5800: 20 20 20 20 33 32 0d 0a 20 20 20 20 20 20 20 20      32..        
5810: 2f 2f 2f 20 23 64 65 66 69 6e 65 20 53 51 4c 49  /// #define SQLI
5820: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
5830: 49 4e 54 5f 4d 41 54 43 48 20 20 20 20 20 36 34  INT_MATCH     64
5840: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 23 64  ..        /// #d
5850: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 44  efine SQLITE_IND
5860: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 49  EX_CONSTRAINT_LI
5870: 4b 45 20 20 20 20 20 20 36 35 20 20 2f 2a 20 33  KE      65  /* 3
5880: 2e 31 30 2e 30 20 61 6e 64 20 6c 61 74 65 72 20  .10.0 and later 
5890: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  */..        /// 
58a0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49  #define SQLITE_I
58b0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
58c0: 47 4c 4f 42 20 20 20 20 20 20 36 36 20 20 2f 2a  GLOB      66  /*
58d0: 20 33 2e 31 30 2e 30 20 61 6e 64 20 6c 61 74 65   3.10.0 and late
58e0: 72 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f  r */..        //
58f0: 2f 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  / #define SQLITE
5900: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
5910: 54 5f 52 45 47 45 58 50 20 20 20 20 36 37 20 20  T_REGEXP    67  
5920: 2f 2a 20 33 2e 31 30 2e 30 20 61 6e 64 20 6c 61  /* 3.10.0 and la
5930: 74 65 72 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  ter */..        
5940: 2f 2f 2f 20 23 64 65 66 69 6e 65 20 53 51 4c 49  /// #define SQLI
5950: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
5960: 49 4e 54 5f 4e 45 20 20 20 20 20 20 20 20 36 38  INT_NE        68
5970: 20 20 2f 2a 20 33 2e 32 31 2e 30 20 61 6e 64 20    /* 3.21.0 and 
5980: 6c 61 74 65 72 20 2a 2f 0d 0a 20 20 20 20 20 20  later */..      
5990: 20 20 2f 2f 2f 20 23 64 65 66 69 6e 65 20 53 51    /// #define SQ
59a0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
59b0: 52 41 49 4e 54 5f 49 53 4e 4f 54 20 20 20 20 20  RAINT_ISNOT     
59c0: 36 39 20 20 2f 2a 20 33 2e 32 31 2e 30 20 61 6e  69  /* 3.21.0 an
59d0: 64 20 6c 61 74 65 72 20 2a 2f 0d 0a 20 20 20 20  d later */..    
59e0: 20 20 20 20 2f 2f 2f 20 23 64 65 66 69 6e 65 20      /// #define 
59f0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
5a00: 53 54 52 41 49 4e 54 5f 49 53 4e 4f 54 4e 55 4c  STRAINT_ISNOTNUL
5a10: 4c 20 37 30 20 20 2f 2a 20 33 2e 32 31 2e 30 20  L 70  /* 3.21.0 
5a20: 61 6e 64 20 6c 61 74 65 72 20 2a 2f 0d 0a 20 20  and later */..  
5a30: 20 20 20 20 20 20 2f 2f 2f 20 23 64 65 66 69 6e        /// #defin
5a40: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  e SQLITE_INDEX_C
5a50: 4f 4e 53 54 52 41 49 4e 54 5f 49 53 4e 55 4c 4c  ONSTRAINT_ISNULL
5a60: 20 20 20 20 37 31 20 20 2f 2a 20 33 2e 32 31 2e      71  /* 3.21.
5a70: 30 20 61 6e 64 20 6c 61 74 65 72 20 2a 2f 0d 0a  0 and later */..
5a80: 20 20 20 20 20 20 20 20 2f 2f 2f 20 23 64 65 66          /// #def
5a90: 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ine SQLITE_INDEX
5aa0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 20 20  _CONSTRAINT_IS  
5ab0: 20 20 20 20 20 20 37 32 20 20 2f 2a 20 33 2e 32        72  /* 3.2
5ac0: 31 2e 30 20 61 6e 64 20 6c 61 74 65 72 20 2a 2f  1.0 and later */
5ad0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 23 64  ..        /// #d
5ae0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 44  efine SQLITE_IND
5af0: 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20 20  EX_SCAN_UNIQUE  
5b00: 20 20 20 20 20 20 20 20 20 31 20 20 2f 2a 20 53           1  /* S
5b10: 63 61 6e 20 76 69 73 69 74 73 20 61 74 20 6d 6f  can visits at mo
5b20: 73 74 20 31 20 72 6f 77 20 2a 2f 0d 0a 20 20 20  st 1 row */..   
5b30: 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e       /// </code>
5b40: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
5b50: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
5b60: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 53 51 4c       /// The SQL
5b70: 69 74 65 20 63 6f 72 65 20 63 61 6c 6c 73 20 74  ite core calls t
5b80: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
5b90: 74 68 6f 64 20 77 68 65 6e 20 69 74 20 69 73 20  thod when it is 
5ba0: 63 6f 6d 70 69 6c 69 6e 67 20 61 20 71 75 65 72  compiling a quer
5bb0: 79 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74  y..        /// t
5bc0: 68 61 74 20 69 6e 76 6f 6c 76 65 73 20 61 20 76  hat involves a v
5bd0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 49 6e  irtual table. In
5be0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 51   other words, SQ
5bf0: 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
5c00: 6d 65 74 68 6f 64 20 0d 0a 20 20 20 20 20 20 20  method ..       
5c10: 20 2f 2f 2f 20 77 68 65 6e 20 69 74 20 69 73 20   /// when it is 
5c20: 72 75 6e 6e 69 6e 67 20 73 71 6c 69 74 65 33 5f  running sqlite3_
5c30: 70 72 65 70 61 72 65 28 29 20 6f 72 20 74 68 65  prepare() or the
5c40: 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 0d 0a 20   equivalent. .. 
5c50: 20 20 20 20 20 20 20 2f 2f 2f 20 42 79 20 63 61         /// By ca
5c60: 6c 6c 69 6e 67 20 74 68 69 73 20 6d 65 74 68 6f  lling this metho
5c70: 64 2c 20 74 68 65 20 0d 0a 20 20 20 20 20 20 20  d, the ..       
5c80: 20 2f 2f 2f 20 53 51 4c 69 74 65 20 63 6f 72 65   /// SQLite core
5c90: 20 69 73 20 73 61 79 69 6e 67 20 74 6f 20 74 68   is saying to th
5ca0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
5cb0: 74 68 61 74 20 69 74 20 6e 65 65 64 73 20 74 6f  that it needs to
5cc0: 20 61 63 63 65 73 73 20 0d 0a 20 20 20 20 20 20   access ..      
5cd0: 20 20 2f 2f 2f 20 73 6f 6d 65 20 73 75 62 73 65    /// some subse
5ce0: 74 20 6f 66 20 74 68 65 20 72 6f 77 73 20 69 6e  t of the rows in
5cf0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
5d00: 6c 65 20 61 6e 64 20 69 74 20 77 61 6e 74 73 20  le and it wants 
5d10: 74 6f 20 6b 6e 6f 77 20 74 68 65 0d 0a 20 20 20  to know the..   
5d20: 20 20 20 20 20 2f 2f 2f 20 6d 6f 73 74 20 65 66       /// most ef
5d30: 66 69 63 69 65 6e 74 20 77 61 79 20 74 6f 20 64  ficient way to d
5d40: 6f 20 74 68 61 74 20 61 63 63 65 73 73 2e 20 54  o that access. T
5d50: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
5d60: 74 68 6f 64 20 72 65 70 6c 69 65 73 20 0d 0a 20  thod replies .. 
5d70: 20 20 20 20 20 20 20 2f 2f 2f 20 77 69 74 68 20         /// with 
5d80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
5d90: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
5da0: 20 63 61 6e 20 74 68 65 6e 20 75 73 65 20 74 6f   can then use to
5db0: 20 63 6f 6e 64 75 63 74 20 61 6e 20 0d 0a 20 20   conduct an ..  
5dc0: 20 20 20 20 20 20 2f 2f 2f 20 65 66 66 69 63 69        /// effici
5dd0: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 74 68  ent search of th
5de0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
5df0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
5e00: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
5e10: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
5e20: 20 20 20 2f 2f 2f 20 57 68 69 6c 65 20 63 6f 6d     /// While com
5e30: 70 69 6c 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  piling a single 
5e40: 53 51 4c 20 71 75 65 72 79 2c 20 74 68 65 20 53  SQL query, the S
5e50: 51 4c 69 74 65 20 63 6f 72 65 20 6d 69 67 68 74  QLite core might
5e60: 20 63 61 6c 6c 20 0d 0a 20 20 20 20 20 20 20 20   call ..        
5e70: 2f 2f 2f 20 78 42 65 73 74 49 6e 64 65 78 20 6d  /// xBestIndex m
5e80: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 77 69  ultiple times wi
5e90: 74 68 20 64 69 66 66 65 72 65 6e 74 20 73 65 74  th different set
5ea0: 74 69 6e 67 73 20 69 6e 20 73 71 6c 69 74 65 33  tings in sqlite3
5eb0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 2e 0d 0a 20 20  _index_info...  
5ec0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 53 51        /// The SQ
5ed0: 4c 69 74 65 20 63 6f 72 65 20 77 69 6c 6c 20 74  Lite core will t
5ee0: 68 65 6e 20 73 65 6c 65 63 74 20 74 68 65 20 63  hen select the c
5ef0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20  ombination that 
5f00: 61 70 70 65 61 72 73 20 74 6f 20 0d 0a 20 20 20  appears to ..   
5f10: 20 20 20 20 20 2f 2f 2f 20 67 69 76 65 20 74 68       /// give th
5f20: 65 20 62 65 73 74 20 70 65 72 66 6f 72 6d 61 6e  e best performan
5f30: 63 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ce...        ///
5f40: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
5f50: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
5f60: 20 20 20 20 20 20 2f 2f 2f 20 42 65 66 6f 72 65        /// Before
5f70: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 6d 65   calling this me
5f80: 74 68 6f 64 2c 20 74 68 65 20 53 51 4c 69 74 65  thod, the SQLite
5f90: 20 63 6f 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   core initialize
5fa0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 0d 0a  s an instance ..
5fb0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 6f 66 20 74          /// of t
5fc0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
5fd0: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
5fe0: 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  with information
5ff0: 20 61 62 6f 75 74 20 74 68 65 0d 0a 20 20 20 20   about the..    
6000: 20 20 20 20 2f 2f 2f 20 71 75 65 72 79 20 74 68      /// query th
6010: 61 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  at it is current
6020: 6c 79 20 74 72 79 69 6e 67 20 74 6f 20 70 72 6f  ly trying to pro
6030: 63 65 73 73 2e 20 54 68 69 73 20 69 6e 66 6f 72  cess. This infor
6040: 6d 61 74 69 6f 6e 20 0d 0a 20 20 20 20 20 20 20  mation ..       
6050: 20 2f 2f 2f 20 64 65 72 69 76 65 73 20 6d 61 69   /// derives mai
6060: 6e 6c 79 20 66 72 6f 6d 20 74 68 65 20 57 48 45  nly from the WHE
6070: 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 4f 52  RE clause and OR
6080: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
6090: 42 59 20 63 6c 61 75 73 65 73 20 0d 0a 20 20 20  BY clauses ..   
60a0: 20 20 20 20 20 2f 2f 2f 20 6f 66 20 74 68 65 20       /// of the 
60b0: 71 75 65 72 79 2c 20 62 75 74 20 61 6c 73 6f 20  query, but also 
60c0: 66 72 6f 6d 20 61 6e 79 20 4f 4e 20 6f 72 20 55  from any ON or U
60d0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 66 20  SING clauses if 
60e0: 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 0d  the query is a .
60f0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6a 6f 69  .        /// joi
6100: 6e 2e 20 54 68 65 20 69 6e 66 6f 72 6d 61 74 69  n. The informati
6110: 6f 6e 20 74 68 61 74 20 74 68 65 20 53 51 4c 69  on that the SQLi
6120: 74 65 20 63 6f 72 65 20 70 72 6f 76 69 64 65 73  te core provides
6130: 20 74 6f 20 74 68 65 20 78 42 65 73 74 49 6e 64   to the xBestInd
6140: 65 78 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ex ..        ///
6150: 20 6d 65 74 68 6f 64 20 69 73 20 68 65 6c 64 20   method is held 
6160: 69 6e 20 74 68 65 20 70 61 72 74 20 6f 66 20 74  in the part of t
6170: 68 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  he structure tha
6180: 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 22  t is marked as "
6190: 49 6e 70 75 74 73 22 2e 20 0d 0a 20 20 20 20 20  Inputs". ..     
61a0: 20 20 20 2f 2f 2f 20 54 68 65 20 22 4f 75 74 70     /// The "Outp
61b0: 75 74 73 22 20 73 65 63 74 69 6f 6e 20 69 73 20  uts" section is 
61c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
61d0: 65 72 6f 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ero...        //
61e0: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
61f0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
6200: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 69         /// The i
6210: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
6220: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
6230: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
6240: 73 20 65 70 68 65 6d 65 72 61 6c 0d 0a 20 20 20  s ephemeral..   
6250: 20 20 20 20 20 2f 2f 2f 20 61 6e 64 20 6d 61 79       /// and may
6260: 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
6270: 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61  or deallocated a
6280: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 78 42  s soon as the xB
6290: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0d  estIndex method.
62a0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 72 65 74  .        /// ret
62b0: 75 72 6e 73 2e 20 20 49 66 20 74 68 65 20 78 42  urns.  If the xB
62c0: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20  estIndex method 
62d0: 6e 65 65 64 73 20 74 6f 20 72 65 6d 65 6d 62 65  needs to remembe
62e0: 72 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  r any part of th
62f0: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73  e..        /// s
6300: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
6310: 6f 20 73 74 72 75 63 74 75 72 65 2c 20 69 74 20  o structure, it 
6320: 73 68 6f 75 6c 64 20 6d 61 6b 65 20 61 20 63 6f  should make a co
6330: 70 79 2e 20 20 43 61 72 65 20 6d 75 73 74 20 62  py.  Care must b
6340: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74  e..        /// t
6350: 61 6b 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ake to store the
6360: 20 63 6f 70 79 20 69 6e 20 61 20 70 6c 61 63 65   copy in a place
6370: 20 77 68 65 72 65 20 69 74 20 77 69 6c 6c 20 62   where it will b
6380: 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 20 73  e deallocated, s
6390: 75 63 68 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  uch..        ///
63a0: 20 61 73 20 69 6e 20 74 68 65 20 69 64 78 53 74   as in the idxSt
63b0: 72 20 66 69 65 6c 64 20 77 69 74 68 20 6e 65 65  r field with nee
63c0: 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 73 65  dToFreeIdxStr se
63d0: 74 20 74 6f 20 31 2e 0d 0a 20 20 20 20 20 20 20  t to 1...       
63e0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
63f0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
6400: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 4e 6f  ..        /// No
6410: 74 65 20 74 68 61 74 20 78 42 65 73 74 49 6e 64  te that xBestInd
6420: 65 78 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ex will always b
6430: 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
6440: 78 46 69 6c 74 65 72 2c 20 73 69 6e 63 65 0d 0a  xFilter, since..
6450: 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20          /// the 
6460: 69 64 78 4e 75 6d 20 61 6e 64 20 69 64 78 53 74  idxNum and idxSt
6470: 72 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 78  r outputs from x
6480: 42 65 73 74 49 6e 64 65 78 20 61 72 65 20 72 65  BestIndex are re
6490: 71 75 69 72 65 64 20 69 6e 70 75 74 73 20 74 6f  quired inputs to
64a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 78 46  ..        /// xF
64b0: 69 6c 74 65 72 2e 20 20 48 6f 77 65 76 65 72 2c  ilter.  However,
64c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
64d0: 72 61 6e 74 65 65 20 74 68 61 74 20 78 46 69 6c  rantee that xFil
64e0: 74 65 72 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ter will be call
64f0: 65 64 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ed..        /// 
6500: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 73 75 63 63  following a succ
6510: 65 73 73 66 75 6c 20 78 42 65 73 74 49 6e 64 65  essful xBestInde
6520: 78 2e 20 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  x.  ..        //
6530: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
6540: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
6550: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78         /// The x
6560: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
6570: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
6580: 20 65 76 65 72 79 20 76 69 72 74 75 61 6c 20 74   every virtual t
6590: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
65a0: 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ion...        //
65b0: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
65c0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
65d0: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6d         /// The m
65e0: 61 69 6e 20 74 68 69 6e 67 20 74 68 61 74 20 74  ain thing that t
65f0: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 69  he SQLite core i
6600: 73 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 6d  s trying to comm
6610: 75 6e 69 63 61 74 65 20 74 6f 20 0d 0a 20 20 20  unicate to ..   
6620: 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 76 69 72       /// the vir
6630: 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 74 68  tual table is th
6640: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  e constraints th
6650: 61 74 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  at are available
6660: 20 74 6f 20 6c 69 6d 69 74 20 0d 0a 20 20 20 20   to limit ..    
6670: 20 20 20 20 2f 2f 2f 20 74 68 65 20 6e 75 6d 62      /// the numb
6680: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
6690: 6e 65 65 64 20 74 6f 20 62 65 20 73 65 61 72 63  need to be searc
66a0: 68 65 64 2e 20 54 68 65 20 61 43 6f 6e 73 74 72  hed. The aConstr
66b0: 61 69 6e 74 5b 5d 20 61 72 72 61 79 20 0d 0a 20  aint[] array .. 
66c0: 20 20 20 20 20 20 20 2f 2f 2f 20 63 6f 6e 74 61         /// conta
66d0: 69 6e 73 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f  ins one entry fo
66e0: 72 20 65 61 63 68 20 63 6f 6e 73 74 72 61 69 6e  r each constrain
66f0: 74 2e 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65  t. There will be
6700: 20 65 78 61 63 74 6c 79 20 0d 0a 20 20 20 20 20   exactly ..     
6710: 20 20 20 2f 2f 2f 20 6e 43 6f 6e 73 74 72 61 69     /// nConstrai
6720: 6e 74 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  nt entries in th
6730: 61 74 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 20  at array...     
6740: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
6750: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
6760: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
6770: 45 61 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 20  Each constraint 
6780: 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20  will correspond 
6790: 74 6f 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  to a term in the
67a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 0d 0a 20   WHERE clause.. 
67b0: 20 20 20 20 20 20 20 2f 2f 2f 20 6f 72 20 69 6e         /// or in
67c0: 20 61 20 55 53 49 4e 47 20 6f 72 20 4f 4e 20 63   a USING or ON c
67d0: 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66  lause that is of
67e0: 20 74 68 65 20 66 6f 72 6d 0d 0a 20 20 20 20 20   the form..     
67f0: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
6800: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
6810: 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20  a><code>..      
6820: 20 20 2f 2f 2f 20 20 20 20 20 20 63 6f 6c 75 6d    ///      colum
6830: 6e 20 20 4f 50 20 20 45 58 50 52 0d 0a 20 20 20  n  OP  EXPR..   
6840: 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e       /// </code>
6850: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
6860: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
6870: 20 20 20 20 20 2f 2f 2f 20 57 68 65 72 65 20 22       /// Where "
6880: 63 6f 6c 75 6d 6e 22 20 69 73 20 61 20 63 6f 6c  column" is a col
6890: 75 6d 6e 20 69 6e 20 74 68 65 20 76 69 72 74 75  umn in the virtu
68a0: 61 6c 20 74 61 62 6c 65 2c 20 4f 50 20 69 73 20  al table, OP is 
68b0: 61 6e 20 6f 70 65 72 61 74 6f 72 20 0d 0a 20 20  an operator ..  
68c0: 20 20 20 20 20 20 2f 2f 2f 20 6c 69 6b 65 20 22        /// like "
68d0: 3d 22 20 6f 72 20 22 26 6c 74 3b 22 2c 20 61 6e  =" or "&lt;", an
68e0: 64 20 45 58 50 52 20 69 73 20 61 6e 20 61 72 62  d EXPR is an arb
68f0: 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
6900: 6e 2e 20 53 6f 2c 20 66 6f 72 20 65 78 61 6d 70  n. So, for examp
6910: 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  le,..        ///
6920: 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
6930: 61 75 73 65 20 63 6f 6e 74 61 69 6e 65 64 20 61  ause contained a
6940: 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a   term like this:
6950: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
6960: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
6970: 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d  // <para><code>.
6980: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 20 3d  .        /// a =
6990: 20 35 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20   5..        /// 
69a0: 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a  </code></para>..
69b0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
69c0: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
69d0: 54 68 65 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  Then one of the 
69e0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 6f 75 6c  constraints woul
69f0: 64 20 62 65 20 6f 6e 20 74 68 65 20 22 61 22 20  d be on the "a" 
6a00: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 0d 0a 20 20  column with ..  
6a10: 20 20 20 20 20 20 2f 2f 2f 20 6f 70 65 72 61 74        /// operat
6a20: 6f 72 20 22 3d 22 20 61 6e 64 20 61 6e 20 65 78  or "=" and an ex
6a30: 70 72 65 73 73 69 6f 6e 20 6f 66 20 22 35 22 2e  pression of "5".
6a40: 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 6e 65 65   Constraints nee
6a50: 64 20 6e 6f 74 20 68 61 76 65 20 61 0d 0a 20 20  d not have a..  
6a60: 20 20 20 20 20 20 2f 2f 2f 20 6c 69 74 65 72 61        /// litera
6a70: 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
6a80: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
6a90: 61 75 73 65 2e 20 54 68 65 20 71 75 65 72 79 20  ause. The query 
6aa0: 6f 70 74 69 6d 69 7a 65 72 20 6d 69 67 68 74 0d  optimizer might.
6ab0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d 61 6b  .        /// mak
6ac0: 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
6ad0: 73 20 74 6f 20 74 68 65 20 0d 0a 20 20 20 20 20  s to the ..     
6ae0: 20 20 20 2f 2f 2f 20 57 48 45 52 45 20 63 6c 61     /// WHERE cla
6af0: 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
6b00: 65 78 74 72 61 63 74 20 61 73 20 6d 61 6e 79 20  extract as many 
6b10: 63 6f 6e 73 74 72 61 69 6e 74 73 20 0d 0a 20 20  constraints ..  
6b20: 20 20 20 20 20 20 2f 2f 2f 20 61 73 20 69 74 20        /// as it 
6b30: 63 61 6e 2e 20 53 6f 2c 20 66 6f 72 20 65 78 61  can. So, for exa
6b40: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45  mple, if the WHE
6b50: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
6b60: 6e 65 64 20 73 6f 6d 65 74 68 69 6e 67 20 0d 0a  ned something ..
6b70: 20 20 20 20 20 20 20 20 2f 2f 2f 20 6c 69 6b 65          /// like
6b80: 20 74 68 69 73 3a 0d 0a 20 20 20 20 20 20 20 20   this:..        
6b90: 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
6ba0: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c       /// <para><
6bb0: 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f  code>..        /
6bc0: 2f 2f 20 78 20 42 45 54 57 45 45 4e 20 31 30 20  // x BETWEEN 10 
6bd0: 41 4e 44 20 31 30 30 20 41 4e 44 20 39 39 39 26  AND 100 AND 999&
6be0: 67 74 3b 79 0d 0a 20 20 20 20 20 20 20 20 2f 2f  gt;y..        //
6bf0: 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e  / </code></para>
6c00: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
6c10: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
6c20: 2f 20 54 68 65 20 71 75 65 72 79 20 6f 70 74 69  / The query opti
6c30: 6d 69 7a 65 72 20 6d 69 67 68 74 20 74 72 61 6e  mizer might tran
6c40: 73 6c 61 74 65 20 74 68 69 73 20 69 6e 74 6f 20  slate this into 
6c50: 74 68 72 65 65 20 73 65 70 61 72 61 74 65 20 63  three separate c
6c60: 6f 6e 73 74 72 61 69 6e 74 73 3a 0d 0a 20 20 20  onstraints:..   
6c70: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
6c80: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
6c90: 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20  ara><code>..    
6ca0: 20 20 20 20 2f 2f 2f 20 78 20 26 67 74 3b 3d 20      /// x &gt;= 
6cb0: 31 30 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  10..        /// 
6cc0: 78 20 26 6c 74 3b 3d 20 31 30 30 0d 0a 20 20 20  x &lt;= 100..   
6cd0: 20 20 20 20 20 2f 2f 2f 20 79 20 26 6c 74 3b 20       /// y &lt; 
6ce0: 39 39 39 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  999..        ///
6cf0: 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d   </code></para>.
6d00: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
6d10: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
6d20: 20 46 6f 72 20 65 61 63 68 20 63 6f 6e 73 74 72   For each constr
6d30: 61 69 6e 74 2c 20 74 68 65 20 61 43 6f 6e 73 74  aint, the aConst
6d40: 72 61 69 6e 74 5b 5d 2e 69 43 6f 6c 75 6d 6e 20  raint[].iColumn 
6d50: 66 69 65 6c 64 20 69 6e 64 69 63 61 74 65 73 20  field indicates 
6d60: 77 68 69 63 68 20 0d 0a 20 20 20 20 20 20 20 20  which ..        
6d70: 2f 2f 2f 20 63 6f 6c 75 6d 6e 20 61 70 70 65 61  /// column appea
6d80: 72 73 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d 68  rs on the left-h
6d90: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
6da0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20  constraint...   
6db0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 66 69 72       /// The fir
6dc0: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
6dd0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
6de0: 73 20 63 6f 6c 75 6d 6e 20 30 2e 20 0d 0a 20 20  s column 0. ..  
6df0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 72 6f        /// The ro
6e00: 77 69 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  wid of the virtu
6e10: 61 6c 20 74 61 62 6c 65 20 69 73 20 63 6f 6c 75  al table is colu
6e20: 6d 6e 20 2d 31 2e 20 0d 0a 20 20 20 20 20 20 20  mn -1. ..       
6e30: 20 2f 2f 2f 20 54 68 65 20 61 43 6f 6e 73 74 72   /// The aConstr
6e40: 61 69 6e 74 5b 5d 2e 6f 70 20 66 69 65 6c 64 20  aint[].op field 
6e50: 69 6e 64 69 63 61 74 65 73 20 77 68 69 63 68 20  indicates which 
6e60: 6f 70 65 72 61 74 6f 72 20 69 73 20 75 73 65 64  operator is used
6e70: 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  . ..        /// 
6e80: 54 68 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  The SQLITE_INDEX
6e90: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 2a 20 63 6f  _CONSTRAINT_* co
6ea0: 6e 73 74 61 6e 74 73 20 6d 61 70 20 69 6e 74 65  nstants map inte
6eb0: 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 20 0d 0a  ger constants ..
6ec0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74 6f          /// into
6ed0: 20 6f 70 65 72 61 74 6f 72 20 76 61 6c 75 65 73   operator values
6ee0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 43  ...        /// C
6ef0: 6f 6c 75 6d 6e 73 20 6f 63 63 75 72 20 69 6e 20  olumns occur in 
6f00: 74 68 65 20 6f 72 64 65 72 20 74 68 65 79 20 77  the order they w
6f10: 65 72 65 20 64 65 66 69 6e 65 64 20 62 79 20 74  ere defined by t
6f20: 68 65 20 63 61 6c 6c 20 74 6f 0d 0a 20 20 20 20  he call to..    
6f30: 20 20 20 20 2f 2f 2f 20 73 71 6c 69 74 65 33 5f      /// sqlite3_
6f40: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 69  declare_vtab() i
6f50: 6e 20 74 68 65 20 78 43 72 65 61 74 65 20 6f 72  n the xCreate or
6f60: 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64   xConnect method
6f70: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 48  ...        /// H
6f80: 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 61 72  idden columns ar
6f90: 65 20 63 6f 75 6e 74 65 64 20 77 68 65 6e 20 64  e counted when d
6fa0: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 63  etermining the c
6fb0: 6f 6c 75 6d 6e 20 69 6e 64 65 78 2e 0d 0a 20 20  olumn index...  
6fc0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
6fd0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
6fe0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
6ff0: 2f 2f 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69  // The aConstrai
7000: 6e 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  nt[] array conta
7010: 69 6e 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ins information 
7020: 61 62 6f 75 74 20 61 6c 6c 20 63 6f 6e 73 74 72  about all constr
7030: 61 69 6e 74 73 20 0d 0a 20 20 20 20 20 20 20 20  aints ..        
7040: 2f 2f 2f 20 74 68 61 74 20 61 70 70 6c 79 20 74  /// that apply t
7050: 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  o the virtual ta
7060: 62 6c 65 2e 20 42 75 74 20 73 6f 6d 65 20 6f 66  ble. But some of
7070: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
7080: 20 6d 69 67 68 74 0d 0a 20 20 20 20 20 20 20 20   might..        
7090: 2f 2f 2f 20 6e 6f 74 20 62 65 20 75 73 61 62 6c  /// not be usabl
70a0: 65 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  e because of the
70b0: 20 77 61 79 20 74 61 62 6c 65 73 20 61 72 65 20   way tables are 
70c0: 6f 72 64 65 72 65 64 20 69 6e 20 61 20 6a 6f 69  ordered in a joi
70d0: 6e 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  n. ..        ///
70e0: 20 54 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   The xBestIndex 
70f0: 6d 65 74 68 6f 64 20 6d 75 73 74 20 74 68 65 72  method must ther
7100: 65 66 6f 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  efore only consi
7110: 64 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  der constraints 
7120: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
7130: 61 74 20 68 61 76 65 20 61 6e 20 61 43 6f 6e 73  at have an aCons
7140: 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20  traint[].usable 
7150: 66 6c 61 67 20 77 68 69 63 68 20 69 73 20 74 72  flag which is tr
7160: 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ue...        ///
7170: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
7180: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
7190: 20 20 20 20 20 20 2f 2f 2f 20 49 6e 20 61 64 64        /// In add
71a0: 69 74 69 6f 6e 20 74 6f 20 57 48 45 52 45 20 63  ition to WHERE c
71b0: 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
71c0: 73 2c 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  s, the SQLite co
71d0: 72 65 20 61 6c 73 6f 20 0d 0a 20 20 20 20 20 20  re also ..      
71e0: 20 20 2f 2f 2f 20 74 65 6c 6c 73 20 74 68 65 20    /// tells the 
71f0: 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
7200: 64 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44 45  d about the ORDE
7210: 52 20 42 59 20 63 6c 61 75 73 65 2e 20 0d 0a 20  R BY clause. .. 
7220: 20 20 20 20 20 20 20 2f 2f 2f 20 28 49 6e 20 61         /// (In a
7230: 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
7240: 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  y, the SQLite co
7250: 72 65 20 6d 69 67 68 74 20 70 75 74 20 69 6e 20  re might put in 
7260: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
7270: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e  ..        /// in
7280: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 70 6c 61  formation in pla
7290: 63 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ce of the ORDER 
72a0: 42 59 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d  BY clause inform
72b0: 61 74 69 6f 6e 2c 20 62 75 74 20 74 68 69 73 20  ation, but this 
72c0: 66 61 63 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f  fact..        //
72d0: 2f 20 73 68 6f 75 6c 64 20 6e 6f 74 20 6d 61 6b  / should not mak
72e0: 65 20 61 6e 79 20 64 69 66 66 65 72 65 6e 63 65  e any difference
72f0: 20 74 6f 20 74 68 65 20 78 42 65 73 74 49 6e 64   to the xBestInd
7300: 65 78 20 6d 65 74 68 6f 64 2e 29 20 0d 0a 20 20  ex method.) ..  
7310: 20 20 20 20 20 20 2f 2f 2f 20 49 66 20 61 6c 6c        /// If all
7320: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
7330: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
7340: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
7350: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
7360: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
7370: 65 6e 20 6e 4f 72 64 65 72 42 79 20 77 69 6c 6c  en nOrderBy will
7380: 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
7390: 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
73a0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0d  RDER BY clause .
73b0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 6e 64  .        /// and
73c0: 20 74 68 65 20 61 4f 72 64 65 72 42 79 5b 5d 20   the aOrderBy[] 
73d0: 61 72 72 61 79 20 77 69 6c 6c 20 69 64 65 6e 74  array will ident
73e0: 69 66 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66  ify the column f
73f0: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 0d 0a 20  or each term .. 
7400: 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 20 74 68         /// in th
7410: 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73  e order by claus
7420: 65 20 61 6e 64 20 77 68 65 74 68 65 72 20 6f 72  e and whether or
7430: 20 6e 6f 74 20 74 68 61 74 20 63 6f 6c 75 6d 6e   not that column
7440: 20 69 73 20 41 53 43 20 6f 72 20 44 45 53 43 2e   is ASC or DESC.
7450: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
7460: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
7470: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
7480: 20 20 20 2f 2f 2f 20 49 6e 20 53 51 4c 69 74 65     /// In SQLite
7490: 20 76 65 72 73 69 6f 6e 20 33 2e 31 30 2e 30 20   version 3.10.0 
74a0: 28 32 30 31 36 2d 30 31 2d 30 36 29 20 61 6e 64  (2016-01-06) and
74b0: 20 6c 61 74 65 72 2c 20 0d 0a 20 20 20 20 20 20   later, ..      
74c0: 20 20 2f 2f 2f 20 74 68 65 20 63 6f 6c 55 73 65    /// the colUse
74d0: 64 20 66 69 65 6c 64 20 69 73 20 61 76 61 69 6c  d field is avail
74e0: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f  able..        //
74f0: 2f 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  / to indicate wh
7500: 69 63 68 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ich fields of th
7510: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
7520: 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65  are actually use
7530: 64 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20  d by the..      
7540: 20 20 2f 2f 2f 20 73 74 61 74 65 6d 65 6e 74 20    /// statement 
7550: 62 65 69 6e 67 20 70 72 65 70 61 72 65 64 2e 20  being prepared. 
7560: 20 49 66 20 74 68 65 20 6c 6f 77 65 73 74 20 62   If the lowest b
7570: 69 74 20 6f 66 20 63 6f 6c 55 73 65 64 20 69 73  it of colUsed is
7580: 20 73 65 74 2c 20 74 68 61 74 0d 0a 20 20 20 20   set, that..    
7590: 20 20 20 20 2f 2f 2f 20 6d 65 61 6e 73 20 74 68      /// means th
75a0: 61 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c  at the first col
75b0: 75 6d 6e 20 69 73 20 75 73 65 64 2e 20 20 54 68  umn is used.  Th
75c0: 65 20 73 65 63 6f 6e 64 20 6c 6f 77 65 73 74 20  e second lowest 
75d0: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 0d  bit corresponds.
75e0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20  .        /// to 
75f0: 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6c 75 6d  the second colum
7600: 6e 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  n.  And so forth
7610: 2e 20 20 49 66 20 74 68 65 20 6d 6f 73 74 20 73  .  If the most s
7620: 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74 20 6f  ignificant bit o
7630: 66 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 63  f..        /// c
7640: 6f 6c 55 73 65 64 20 69 73 20 73 65 74 2c 20 74  olUsed is set, t
7650: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  hat means that o
7660: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d  ne or more colum
7670: 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ns other than th
7680: 65 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e ..        /// 
7690: 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
76a0: 20 61 72 65 20 75 73 65 64 2e 20 20 49 66 20 63   are used.  If c
76b0: 6f 6c 75 6d 6e 20 75 73 61 67 65 20 69 6e 66 6f  olumn usage info
76c0: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
76d0: 64 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20  d by the..      
76e0: 20 20 2f 2f 2f 20 78 46 69 6c 74 65 72 20 6d 65    /// xFilter me
76f0: 74 68 6f 64 2c 20 74 68 65 6e 20 74 68 65 20 72  thod, then the r
7700: 65 71 75 69 72 65 64 20 62 69 74 73 20 6d 75 73  equired bits mus
7710: 74 20 62 65 20 65 6e 63 6f 64 65 64 20 69 6e 74  t be encoded int
7720: 6f 20 65 69 74 68 65 72 0d 0a 20 20 20 20 20 20  o either..      
7730: 20 20 2f 2f 2f 20 74 68 65 20 69 64 78 4e 75 6d    /// the idxNum
7740: 20 6f 72 20 69 64 78 53 74 72 20 6f 75 74 70 75   or idxStr outpu
7750: 74 20 66 69 65 6c 64 73 2e 0d 0a 20 20 20 20 20  t fields...     
7760: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
7770: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
7780: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
7790: 47 69 76 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65  Given all of the
77a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
77b0: 76 65 2c 20 74 68 65 20 6a 6f 62 20 6f 66 20 74  ve, the job of t
77c0: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 0d 0a  he xBestIndex ..
77d0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d 65 74 68          /// meth
77e0: 6f 64 20 69 74 20 74 6f 20 66 69 67 75 72 65 20  od it to figure 
77f0: 6f 75 74 20 74 68 65 20 62 65 73 74 20 77 61 79  out the best way
7800: 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 76   to search the v
7810: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a 20  irtual table... 
7820: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
7830: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
7840: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
7850: 2f 2f 2f 20 54 68 65 20 78 42 65 73 74 49 6e 64  /// The xBestInd
7860: 65 78 20 6d 65 74 68 6f 64 20 66 69 6c 6c 73 20  ex method fills 
7870: 74 68 65 20 69 64 78 4e 75 6d 20 61 6e 64 20 69  the idxNum and i
7880: 64 78 53 74 72 20 66 69 65 6c 64 73 20 77 69 74  dxStr fields wit
7890: 68 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  h ..        /// 
78a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
78b0: 20 63 6f 6d 6d 75 6e 69 63 61 74 65 73 20 61 6e   communicates an
78c0: 20 69 6e 64 65 78 69 6e 67 20 73 74 72 61 74 65   indexing strate
78d0: 67 79 20 74 6f 20 74 68 65 20 78 46 69 6c 74 65  gy to the xFilte
78e0: 72 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  r ..        /// 
78f0: 6d 65 74 68 6f 64 2e 20 54 68 65 20 69 6e 66 6f  method. The info
7900: 72 6d 61 74 69 6f 6e 20 69 6e 20 69 64 78 4e 75  rmation in idxNu
7910: 6d 20 61 6e 64 20 69 64 78 53 74 72 20 69 73 20  m and idxStr is 
7920: 61 72 62 69 74 72 61 72 79 20 61 73 20 66 61 72  arbitrary as far
7930: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61   ..        /// a
7940: 73 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  s the SQLite cor
7950: 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2e 20  e is concerned. 
7960: 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  The SQLite core 
7970: 6a 75 73 74 20 63 6f 70 69 65 73 20 74 68 65 20  just copies the 
7980: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e  ..        /// in
7990: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 72 6f 75 67  formation throug
79a0: 68 20 74 6f 20 74 68 65 20 78 46 69 6c 74 65 72  h to the xFilter
79b0: 20 6d 65 74 68 6f 64 2e 20 41 6e 79 20 64 65 73   method. Any des
79c0: 69 72 65 64 20 6d 65 61 6e 69 6e 67 20 63 61 6e  ired meaning can
79d0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 62   ..        /// b
79e0: 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 69 64  e assigned to id
79f0: 78 4e 75 6d 20 61 6e 64 20 69 64 78 53 74 72 20  xNum and idxStr 
7a00: 61 73 20 6c 6f 6e 67 20 61 73 20 78 42 65 73 74  as long as xBest
7a10: 49 6e 64 65 78 20 61 6e 64 20 78 46 69 6c 74 65  Index and xFilte
7a20: 72 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  r ..        /// 
7a30: 61 67 72 65 65 20 6f 6e 20 77 68 61 74 20 74 68  agree on what th
7a40: 61 74 20 6d 65 61 6e 69 6e 67 20 69 73 2e 0d 0a  at meaning is...
7a50: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
7a60: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
7a70: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
7a80: 20 2f 2f 2f 20 54 68 65 20 69 64 78 53 74 72 20   /// The idxStr 
7a90: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 61 20 73  value may be a s
7aa0: 74 72 69 6e 67 20 6f 62 74 61 69 6e 65 64 20 66  tring obtained f
7ab0: 72 6f 6d 20 61 6e 20 53 51 4c 69 74 65 0d 0a 20  rom an SQLite.. 
7ac0: 20 20 20 20 20 20 20 2f 2f 2f 20 6d 65 6d 6f 72         /// memor
7ad0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e  y allocation fun
7ae0: 63 74 69 6f 6e 20 73 75 63 68 20 61 73 20 73 71  ction such as sq
7af0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 29 2e  lite3_mprintf().
7b00: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 49   ..        /// I
7b10: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
7b20: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 65  se, then the nee
7b30: 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 66 6c  dToFreeIdxStr fl
7b40: 61 67 20 6d 75 73 74 20 62 65 20 73 65 74 20 74  ag must be set t
7b50: 6f 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  o ..        /// 
7b60: 74 72 75 65 20 73 6f 20 74 68 61 74 20 74 68 65  true so that the
7b70: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 69 6c   SQLite core wil
7b80: 6c 20 6b 6e 6f 77 20 74 6f 20 63 61 6c 6c 20 73  l know to call s
7b90: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
7ba0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74   ..        /// t
7bb0: 68 61 74 20 73 74 72 69 6e 67 20 77 68 65 6e 20  hat string when 
7bc0: 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  it has finished 
7bd0: 77 69 74 68 20 69 74 2c 20 61 6e 64 20 74 68 75  with it, and thu
7be0: 73 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  s avoid a memory
7bf0: 20 6c 65 61 6b 2e 0d 0a 20 20 20 20 20 20 20 20   leak...        
7c00: 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
7c10: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
7c20: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 49 66 20  .        /// If 
7c30: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
7c40: 65 20 77 69 6c 6c 20 6f 75 74 70 75 74 20 72 6f  e will output ro
7c50: 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ws in the order 
7c60: 73 70 65 63 69 66 69 65 64 20 62 79 20 0d 0a 20  specified by .. 
7c70: 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 4f         /// the O
7c80: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
7c90: 74 68 65 6e 20 74 68 65 20 6f 72 64 65 72 42 79  then the orderBy
7ca0: 43 6f 6e 73 75 6d 65 64 20 66 6c 61 67 20 6d 61  Consumed flag ma
7cb0: 79 20 62 65 20 73 65 74 20 74 6f 20 0d 0a 20 20  y be set to ..  
7cc0: 20 20 20 20 20 20 2f 2f 2f 20 74 72 75 65 2e 20        /// true. 
7cd0: 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
7ce0: 20 6e 6f 74 20 61 75 74 6f 6d 61 74 69 63 61 6c   not automatical
7cf0: 6c 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ly in the correc
7d00: 74 20 6f 72 64 65 72 20 0d 0a 20 20 20 20 20 20  t order ..      
7d10: 20 20 2f 2f 2f 20 74 68 65 6e 20 6f 72 64 65 72    /// then order
7d20: 42 79 43 6f 6e 73 75 6d 65 64 20 6d 75 73 74 20  ByConsumed must 
7d30: 62 65 20 6c 65 66 74 20 69 6e 20 69 74 73 20 64  be left in its d
7d40: 65 66 61 75 6c 74 20 66 61 6c 73 65 20 73 65 74  efault false set
7d50: 74 69 6e 67 2e 20 0d 0a 20 20 20 20 20 20 20 20  ting. ..        
7d60: 2f 2f 2f 20 54 68 69 73 20 77 69 6c 6c 20 69 6e  /// This will in
7d70: 64 69 63 61 74 65 20 74 6f 20 74 68 65 20 53 51  dicate to the SQ
7d80: 4c 69 74 65 20 63 6f 72 65 20 74 68 61 74 20 69  Lite core that i
7d90: 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 64  t will need to d
7da0: 6f 20 61 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  o a ..        //
7db0: 2f 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 69  / separate sorti
7dc0: 6e 67 20 70 61 73 73 20 6f 76 65 72 20 74 68 65  ng pass over the
7dd0: 20 64 61 74 61 20 61 66 74 65 72 20 69 74 20 63   data after it c
7de0: 6f 6d 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  omes out of the 
7df0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a  virtual table...
7e00: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
7e10: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
7e20: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
7e30: 20 2f 2f 2f 20 54 68 65 20 65 73 74 69 6d 61 74   /// The estimat
7e40: 65 64 43 6f 73 74 20 66 69 65 6c 64 20 73 68 6f  edCost field sho
7e50: 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 74 68  uld be set to th
7e60: 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
7e70: 65 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  er..        /// 
7e80: 6f 66 20 64 69 73 6b 20 61 63 63 65 73 73 20 6f  of disk access o
7e90: 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72  perations requir
7ea0: 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  ed to execute th
7eb0: 69 73 20 71 75 65 72 79 20 61 67 61 69 6e 73 74  is query against
7ec0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74   ..        /// t
7ed0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
7ee0: 2e 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72  . The SQLite cor
7ef0: 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 63 61 6c  e will often cal
7f00: 6c 20 78 42 65 73 74 49 6e 64 65 78 20 0d 0a 20  l xBestIndex .. 
7f10: 20 20 20 20 20 20 20 2f 2f 2f 20 6d 75 6c 74 69         /// multi
7f20: 70 6c 65 20 74 69 6d 65 73 20 77 69 74 68 20 64  ple times with d
7f30: 69 66 66 65 72 65 6e 74 20 63 6f 6e 73 74 72 61  ifferent constra
7f40: 69 6e 74 73 2c 20 6f 62 74 61 69 6e 20 6d 75 6c  ints, obtain mul
7f50: 74 69 70 6c 65 20 63 6f 73 74 0d 0a 20 20 20 20  tiple cost..    
7f60: 20 20 20 20 2f 2f 2f 20 65 73 74 69 6d 61 74 65      /// estimate
7f70: 73 2c 20 74 68 65 6e 20 63 68 6f 6f 73 65 20 74  s, then choose t
7f80: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 74 68  he query plan th
7f90: 61 74 20 67 69 76 65 73 20 74 68 65 20 6c 6f 77  at gives the low
7fa0: 65 73 74 20 65 73 74 69 6d 61 74 65 2e 0d 0a 20  est estimate... 
7fb0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
7fc0: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
7fd0: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
7fe0: 2f 2f 2f 20 49 66 20 74 68 65 20 63 75 72 72 65  /// If the curre
7ff0: 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51  nt version of SQ
8000: 4c 69 74 65 20 69 73 20 33 2e 38 2e 32 20 6f 72  Lite is 3.8.2 or
8010: 20 67 72 65 61 74 65 72 2c 20 74 68 65 20 65 73   greater, the es
8020: 74 69 6d 61 74 65 64 52 6f 77 73 0d 0a 20 20 20  timatedRows..   
8030: 20 20 20 20 20 2f 2f 2f 20 66 69 65 6c 64 20 6d       /// field m
8040: 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
8050: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
8060: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72  number of rows r
8070: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0d 0a  eturned by the..
8080: 20 20 20 20 20 20 20 20 2f 2f 2f 20 70 72 6f 70          /// prop
8090: 6f 73 65 64 20 71 75 65 72 79 20 70 6c 61 6e 2e  osed query plan.
80a0: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
80b0: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
80c0: 20 73 65 74 2c 20 74 68 65 20 64 65 66 61 75 6c   set, the defaul
80d0: 74 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  t ..        /// 
80e0: 65 73 74 69 6d 61 74 65 20 6f 66 20 32 35 20 72  estimate of 25 r
80f0: 6f 77 73 20 69 73 20 75 73 65 64 2e 0d 0a 20 20  ows is used...  
8100: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
8110: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
8120: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
8130: 2f 2f 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  // If the curren
8140: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  t version of SQL
8150: 69 74 65 20 69 73 20 33 2e 39 2e 30 20 6f 72 20  ite is 3.9.0 or 
8160: 67 72 65 61 74 65 72 2c 20 74 68 65 20 69 64 78  greater, the idx
8170: 46 6c 61 67 73 20 66 69 65 6c 64 0d 0a 20 20 20  Flags field..   
8180: 20 20 20 20 20 2f 2f 2f 20 6d 61 79 20 62 65 20       /// may be 
8190: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4e  set to SQLITE_IN
81a0: 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20  DEX_SCAN_UNIQUE 
81b0: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
81c0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
81d0: 6c 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  le..        /// 
81e0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 6f 6e 6c 79  will return only
81f0: 20 7a 65 72 6f 20 6f 72 20 6f 6e 65 20 72 6f 77   zero or one row
8200: 73 20 67 69 76 65 6e 20 74 68 65 20 69 6e 70 75  s given the inpu
8210: 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  t constraints.  
8220: 41 64 64 69 74 69 6f 6e 61 6c 0d 0a 20 20 20 20  Additional..    
8230: 20 20 20 20 2f 2f 2f 20 62 69 74 73 20 6f 66 20      /// bits of 
8240: 74 68 65 20 69 64 78 46 6c 61 67 73 20 66 69 65  the idxFlags fie
8250: 6c 64 20 6d 69 67 68 74 20 62 65 20 75 6e 64 65  ld might be unde
8260: 72 73 74 6f 6f 64 20 69 6e 20 6c 61 74 65 72 20  rstood in later 
8270: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
8280: 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  te...        ///
8290: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
82a0: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
82b0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 61 43        /// The aC
82c0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 5d  onstraintUsage[]
82d0: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
82e0: 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20  one element for 
82f0: 65 61 63 68 20 6f 66 20 0d 0a 20 20 20 20 20 20  each of ..      
8300: 20 20 2f 2f 2f 20 74 68 65 20 6e 43 6f 6e 73 74    /// the nConst
8310: 72 61 69 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  raint constraint
8320: 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 73 20  s in the inputs 
8330: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 0d  section of the .
8340: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 71 6c  .        /// sql
8350: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
8360: 73 74 72 75 63 74 75 72 65 2e 20 0d 0a 20 20 20  structure. ..   
8370: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 61 43 6f       /// The aCo
8380: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 5d 20  nstraintUsage[] 
8390: 61 72 72 61 79 20 69 73 20 75 73 65 64 20 62 79  array is used by
83a0: 20 78 42 65 73 74 49 6e 64 65 78 20 74 6f 20 74   xBestIndex to t
83b0: 65 6c 6c 20 74 68 65 20 0d 0a 20 20 20 20 20 20  ell the ..      
83c0: 20 20 2f 2f 2f 20 63 6f 72 65 20 68 6f 77 20 69    /// core how i
83d0: 74 20 69 73 20 75 73 69 6e 67 20 74 68 65 20 63  t is using the c
83e0: 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20  onstraints...   
83f0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
8400: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
8410: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
8420: 2f 20 54 68 65 20 78 42 65 73 74 49 6e 64 65 78  / The xBestIndex
8430: 20 6d 65 74 68 6f 64 20 6d 61 79 20 73 65 74 20   method may set 
8440: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
8450: 5b 5d 2e 61 72 67 76 49 6e 64 65 78 20 0d 0a 20  [].argvIndex .. 
8460: 20 20 20 20 20 20 20 2f 2f 2f 20 65 6e 74 72 69         /// entri
8470: 65 73 20 74 6f 20 76 61 6c 75 65 73 20 67 72 65  es to values gre
8480: 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20  ater than zero. 
8490: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 45 78  ..        /// Ex
84a0: 61 63 74 6c 79 20 6f 6e 65 20 65 6e 74 72 79 20  actly one entry 
84b0: 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f  should be set to
84c0: 20 31 2c 20 61 6e 6f 74 68 65 72 20 74 6f 20 32   1, another to 2
84d0: 2c 20 61 6e 6f 74 68 65 72 20 74 6f 20 33 2c 20  , another to 3, 
84e0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 6e  ..        /// an
84f0: 64 20 73 6f 20 66 6f 72 74 68 20 75 70 20 74 6f  d so forth up to
8500: 20 61 73 20 6d 61 6e 79 20 6f 72 20 61 73 20 66   as many or as f
8510: 65 77 20 61 73 20 74 68 65 20 78 42 65 73 74 49  ew as the xBestI
8520: 6e 64 65 78 20 6d 65 74 68 6f 64 20 77 61 6e 74  ndex method want
8530: 73 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  s. ..        ///
8540: 20 54 68 65 20 45 58 50 52 20 6f 66 20 74 68 65   The EXPR of the
8550: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
8560: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
8570: 74 68 65 6e 20 62 65 20 70 61 73 73 65 64 20 0d  then be passed .
8580: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 20  .        /// in 
8590: 61 73 20 74 68 65 20 61 72 67 76 5b 5d 20 70 61  as the argv[] pa
85a0: 72 61 6d 65 74 65 72 73 20 74 6f 20 78 46 69 6c  rameters to xFil
85b0: 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ter...        //
85c0: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
85d0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
85e0: 20 20 20 20 20 20 20 2f 2f 2f 20 46 6f 72 20 65         /// For e
85f0: 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 61  xample, if the a
8600: 43 6f 6e 73 74 72 61 69 6e 74 5b 33 5d 2e 61 72  Constraint[3].ar
8610: 67 76 49 6e 64 65 78 20 69 73 20 73 65 74 20 74  gvIndex is set t
8620: 6f 20 31 2c 20 74 68 65 6e 20 0d 0a 20 20 20 20  o 1, then ..    
8630: 20 20 20 20 2f 2f 2f 20 77 68 65 6e 20 78 46 69      /// when xFi
8640: 6c 74 65 72 20 69 73 20 63 61 6c 6c 65 64 2c 20  lter is called, 
8650: 74 68 65 20 61 72 67 76 5b 30 5d 20 70 61 73 73  the argv[0] pass
8660: 65 64 20 74 6f 20 78 46 69 6c 74 65 72 20 77 69  ed to xFilter wi
8670: 6c 6c 20 68 61 76 65 20 0d 0a 20 20 20 20 20 20  ll have ..      
8680: 20 20 2f 2f 2f 20 74 68 65 20 45 58 50 52 20 76    /// the EXPR v
8690: 61 6c 75 65 20 6f 66 20 74 68 65 20 61 43 6f 6e  alue of the aCon
86a0: 73 74 72 61 69 6e 74 5b 33 5d 20 63 6f 6e 73 74  straint[3] const
86b0: 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20  raint...        
86c0: 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
86d0: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
86e0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 42 79 20  .        /// By 
86f0: 64 65 66 61 75 6c 74 2c 20 74 68 65 20 53 51 4c  default, the SQL
8700: 69 74 65 20 63 6f 72 65 20 64 6f 75 62 6c 65 20  ite core double 
8710: 63 68 65 63 6b 73 20 61 6c 6c 20 63 6f 6e 73 74  checks all const
8720: 72 61 69 6e 74 73 20 6f 6e 20 0d 0a 20 20 20 20  raints on ..    
8730: 20 20 20 20 2f 2f 2f 20 65 61 63 68 20 72 6f 77      /// each row
8740: 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
8750: 74 61 62 6c 65 20 74 68 61 74 20 69 74 20 72 65  table that it re
8760: 63 65 69 76 65 73 2e 20 49 66 20 73 75 63 68 20  ceives. If such 
8770: 61 20 63 68 65 63 6b 20 0d 0a 20 20 20 20 20 20  a check ..      
8780: 20 20 2f 2f 2f 20 69 73 20 72 65 64 75 6e 64 61    /// is redunda
8790: 6e 74 2c 20 74 68 65 20 78 42 65 73 74 46 69 6c  nt, the xBestFil
87a0: 74 65 72 20 6d 65 74 68 6f 64 20 63 61 6e 20 73  ter method can s
87b0: 75 70 70 72 65 73 73 20 74 68 61 74 20 64 6f 75  uppress that dou
87c0: 62 6c 65 2d 63 68 65 63 6b 20 62 79 20 0d 0a 20  ble-check by .. 
87d0: 20 20 20 20 20 20 20 2f 2f 2f 20 73 65 74 74 69         /// setti
87e0: 6e 67 20 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  ng aConstraintUs
87f0: 61 67 65 5b 5d 2e 6f 6d 69 74 2e 0d 0a 20 20 20  age[].omit...   
8800: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
8810: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
8820: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
8830: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
8840: 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20 20 20 20  e="pVtab">..    
8850: 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69      /// The nati
8860: 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ve pointer to th
8870: 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 64  e sqlite3_vtab d
8880: 65 72 69 76 65 64 20 73 74 72 75 63 74 75 72 65  erived structure
8890: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
88a0: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
88b0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
88c0: 3d 22 70 49 6e 64 65 78 22 3e 0d 0a 20 20 20 20  ="pIndex">..    
88d0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69      /// The nati
88e0: 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ve pointer to th
88f0: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
8900: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0d  info structure..
8910: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
8920: 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f  aram>..        /
8930: 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20  // <returns>..  
8940: 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74 61 6e        /// A stan
8950: 64 61 72 64 20 53 51 4c 69 74 65 20 72 65 74 75  dard SQLite retu
8960: 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20  rn code...      
8970: 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e    /// </returns>
8980: 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65  ..        SQLite
8990: 45 72 72 6f 72 43 6f 64 65 20 78 42 65 73 74 49  ErrorCode xBestI
89a0: 6e 64 65 78 28 0d 0a 20 20 20 20 20 20 20 20 20  ndex(..         
89b0: 20 20 20 49 6e 74 50 74 72 20 70 56 74 61 62 2c     IntPtr pVtab,
89c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  ..            In
89d0: 74 50 74 72 20 70 49 6e 64 65 78 0d 0a 20 20 20  tPtr pIndex..   
89e0: 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a 20           );.... 
89f0: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
8a00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8a10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8a20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8a30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
8a40: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73  ..        /// <s
8a50: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20  ummary>..       
8a60: 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65   /// <para><code
8a70: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69  >..        /// i
8a80: 6e 74 20 28 2a 78 44 69 73 63 6f 6e 6e 65 63 74  nt (*xDisconnect
8a90: 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  )(sqlite3_vtab *
8aa0: 70 56 54 61 62 29 3b 0d 0a 20 20 20 20 20 20 20  pVTab);..       
8ab0: 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61   /// </code></pa
8ac0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
8ad0: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
8ae0: 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f 64   /// This method
8af0: 20 72 65 6c 65 61 73 65 73 20 61 20 63 6f 6e 6e   releases a conn
8b00: 65 63 74 69 6f 6e 20 74 6f 20 61 20 76 69 72 74  ection to a virt
8b10: 75 61 6c 20 74 61 62 6c 65 2e 20 0d 0a 20 20 20  ual table. ..   
8b20: 20 20 20 20 20 2f 2f 2f 20 4f 6e 6c 79 20 74 68       /// Only th
8b30: 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f  e sqlite3_vtab o
8b40: 62 6a 65 63 74 20 69 73 20 64 65 73 74 72 6f 79  bject is destroy
8b50: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ed...        ///
8b60: 20 54 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   The virtual tab
8b70: 6c 65 20 69 73 20 6e 6f 74 20 64 65 73 74 72 6f  le is not destro
8b80: 79 65 64 20 61 6e 64 20 61 6e 79 20 62 61 63 6b  yed and any back
8b90: 69 6e 67 20 73 74 6f 72 65 20 0d 0a 20 20 20 20  ing store ..    
8ba0: 20 20 20 20 2f 2f 2f 20 61 73 73 6f 63 69 61 74      /// associat
8bb0: 65 64 20 77 69 74 68 20 74 68 65 20 76 69 72 74  ed with the virt
8bc0: 75 61 6c 20 74 61 62 6c 65 20 70 65 72 73 69 73  ual table persis
8bd0: 74 73 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ts. ..        //
8be0: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
8bf0: 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68     /// This meth
8c00: 6f 64 20 75 6e 64 6f 65 73 20 74 68 65 20 77 6f  od undoes the wo
8c10: 72 6b 20 6f 66 20 78 43 6f 6e 6e 65 63 74 2e 0d  rk of xConnect..
8c20: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
8c30: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
8c40: 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20   This method is 
8c50: 61 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  a destructor for
8c60: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
8c70: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
8c80: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  le...        ///
8c90: 20 43 6f 6e 74 72 61 73 74 20 74 68 69 73 20 6d   Contrast this m
8ca0: 65 74 68 6f 64 20 77 69 74 68 20 78 44 65 73 74  ethod with xDest
8cb0: 72 6f 79 2e 20 20 54 68 65 20 78 44 65 73 74 72  roy.  The xDestr
8cc0: 6f 79 20 69 73 20 61 20 64 65 73 74 72 75 63 74  oy is a destruct
8cd0: 6f 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  or..        /// 
8ce0: 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 76  for the entire v
8cf0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a 20  irtual table... 
8d00: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
8d10: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
8d20: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
8d30: 2f 2f 2f 20 54 68 65 20 78 44 69 73 63 6f 6e 6e  /// The xDisconn
8d40: 65 63 74 20 6d 65 74 68 6f 64 20 69 73 20 72 65  ect method is re
8d50: 71 75 69 72 65 64 20 66 6f 72 20 65 76 65 72 79  quired for every
8d60: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
8d70: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 0d 0a  mplementation,..
8d80: 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 6f 75          /// thou
8d90: 67 68 20 69 74 20 69 73 20 61 63 63 65 70 74 61  gh it is accepta
8da0: 62 6c 65 20 66 6f 72 20 74 68 65 20 78 44 69 73  ble for the xDis
8db0: 63 6f 6e 6e 65 63 74 20 61 6e 64 20 78 44 65 73  connect and xDes
8dc0: 74 72 6f 79 20 6d 65 74 68 6f 64 73 20 74 6f 20  troy methods to 
8dd0: 62 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  be..        /// 
8de0: 74 68 65 20 73 61 6d 65 20 66 75 6e 63 74 69 6f  the same functio
8df0: 6e 20 69 66 20 74 68 61 74 20 6d 61 6b 65 73 20  n if that makes 
8e00: 73 65 6e 73 65 20 66 6f 72 20 74 68 65 20 70 61  sense for the pa
8e10: 72 74 69 63 75 6c 61 72 20 76 69 72 74 75 61 6c  rticular virtual
8e20: 20 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20   table...       
8e30: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
8e40: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d        /// </summ
8e50: 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ary>..        //
8e60: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70  / <param name="p
8e70: 56 74 61 62 22 3e 0d 0a 20 20 20 20 20 20 20 20  Vtab">..        
8e80: 2f 2f 2f 20 54 68 65 20 6e 61 74 69 76 65 20 70  /// The native p
8e90: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 71  ointer to the sq
8ea0: 6c 69 74 65 33 5f 76 74 61 62 20 64 65 72 69 76  lite3_vtab deriv
8eb0: 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20  ed structure... 
8ec0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
8ed0: 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  am>..        ///
8ee0: 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20   <returns>..    
8ef0: 20 20 20 20 2f 2f 2f 20 41 20 73 74 61 6e 64 61      /// A standa
8f00: 72 64 20 53 51 4c 69 74 65 20 72 65 74 75 72 6e  rd SQLite return
8f10: 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20   code...        
8f20: 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a  /// </returns>..
8f30: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 45 72          SQLiteEr
8f40: 72 6f 72 43 6f 64 65 20 78 44 69 73 63 6f 6e 6e  rorCode xDisconn
8f50: 65 63 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ect(..          
8f60: 20 20 49 6e 74 50 74 72 20 70 56 74 61 62 0d 0a    IntPtr pVtab..
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a              );..
8f80: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
8f90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8fa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8fc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8fd0: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  /....        ///
8fe0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
8ff0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63      /// <para><c
9000: 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ode>..        //
9010: 2f 20 69 6e 74 20 28 2a 78 44 65 73 74 72 6f 79  / int (*xDestroy
9020: 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  )(sqlite3_vtab *
9030: 70 56 54 61 62 29 3b 0d 0a 20 20 20 20 20 20 20  pVTab);..       
9040: 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61   /// </code></pa
9050: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
9060: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
9070: 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f 64   /// This method
9080: 20 72 65 6c 65 61 73 65 73 20 61 20 63 6f 6e 6e   releases a conn
9090: 65 63 74 69 6f 6e 20 74 6f 20 61 20 76 69 72 74  ection to a virt
90a0: 75 61 6c 20 74 61 62 6c 65 2c 20 6a 75 73 74 20  ual table, just 
90b0: 6c 69 6b 65 20 0d 0a 20 20 20 20 20 20 20 20 2f  like ..        /
90c0: 2f 2f 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65  // the xDisconne
90d0: 63 74 20 6d 65 74 68 6f 64 2c 20 61 6e 64 20 69  ct method, and i
90e0: 74 20 61 6c 73 6f 20 64 65 73 74 72 6f 79 73 20  t also destroys 
90f0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0d  the underlying .
9100: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 61 62  .        /// tab
9110: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
9120: 6e 2e 20 54 68 69 73 20 6d 65 74 68 6f 64 20 75  n. This method u
9130: 6e 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f  ndoes the work o
9140: 66 20 78 43 72 65 61 74 65 2e 0d 0a 20 20 20 20  f xCreate...    
9150: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
9160: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
9170: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
9180: 20 54 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   The xDisconnect
9190: 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c 65   method is calle
91a0: 64 20 77 68 65 6e 65 76 65 72 20 61 20 64 61 74  d whenever a dat
91b0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
91c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
91d0: 61 74 20 75 73 65 73 20 61 20 76 69 72 74 75 61  at uses a virtua
91e0: 6c 20 74 61 62 6c 65 20 69 73 20 63 6c 6f 73 65  l table is close
91f0: 64 2e 20 54 68 65 20 78 44 65 73 74 72 6f 79 20  d. The xDestroy 
9200: 6d 65 74 68 6f 64 20 69 73 20 6f 6e 6c 79 20 0d  method is only .
9210: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 63 61 6c  .        /// cal
9220: 6c 65 64 20 77 68 65 6e 20 61 20 44 52 4f 50 20  led when a DROP 
9230: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
9240: 69 73 20 65 78 65 63 75 74 65 64 20 61 67 61 69  is executed agai
9250: 6e 73 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  nst the virtual 
9260: 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  table...        
9270: 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
9280: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
9290: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
92a0: 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68 6f 64   xDestroy method
92b0: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
92c0: 20 65 76 65 72 79 20 76 69 72 74 75 61 6c 20 74   every virtual t
92d0: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
92e0: 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ion,..        //
92f0: 2f 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61  / though it is a
9300: 63 63 65 70 74 61 62 6c 65 20 66 6f 72 20 74 68  cceptable for th
9310: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 61 6e  e xDisconnect an
9320: 64 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68 6f  d xDestroy metho
9330: 64 73 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20  ds to be..      
9340: 20 20 2f 2f 2f 20 74 68 65 20 73 61 6d 65 20 66    /// the same f
9350: 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 61 74 20  unction if that 
9360: 6d 61 6b 65 73 20 73 65 6e 73 65 20 66 6f 72 20  makes sense for 
9370: 74 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 76  the particular v
9380: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a 20  irtual table... 
9390: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
93a0: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
93b0: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
93c0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
93d0: 61 6d 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20 20  ame="pVtab">..  
93e0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61        /// The na
93f0: 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  tive pointer to 
9400: 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62  the sqlite3_vtab
9410: 20 64 65 72 69 76 65 64 20 73 74 72 75 63 74 75   derived structu
9420: 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  re...        ///
9430: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
9440: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
9450: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20  ..        /// A 
9460: 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20  standard SQLite 
9470: 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20  return code...  
9480: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75        /// </retu
9490: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51  rns>..        SQ
94a0: 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78 44  LiteErrorCode xD
94b0: 65 73 74 72 6f 79 28 0d 0a 20 20 20 20 20 20 20  estroy(..       
94c0: 20 20 20 20 20 49 6e 74 50 74 72 20 70 56 74 61       IntPtr pVta
94d0: 62 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  b..            )
94e0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ;....        ///
94f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9520: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9530: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
9540: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
9550: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
9560: 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20  ><code>..       
9570: 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 4f 70 65 6e   /// int (*xOpen
9580: 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  )(sqlite3_vtab *
9590: 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76  pVTab, sqlite3_v
95a0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43  tab_cursor **ppC
95b0: 75 72 73 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20  ursor);..       
95c0: 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61   /// </code></pa
95d0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
95e0: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
95f0: 20 2f 2f 2f 20 54 68 65 20 78 4f 70 65 6e 20 6d   /// The xOpen m
9600: 65 74 68 6f 64 20 63 72 65 61 74 65 73 20 61 20  ethod creates a 
9610: 6e 65 77 20 63 75 72 73 6f 72 20 75 73 65 64 20  new cursor used 
9620: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 28 72  for accessing (r
9630: 65 61 64 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20  ead and/or..    
9640: 20 20 20 20 2f 2f 2f 20 77 72 69 74 69 6e 67 29      /// writing)
9650: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
9660: 2e 20 20 41 20 73 75 63 63 65 73 73 66 75 6c 20  .  A successful 
9670: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
9680: 69 73 20 6d 65 74 68 6f 64 20 0d 0a 20 20 20 20  is method ..    
9690: 20 20 20 20 2f 2f 2f 20 77 69 6c 6c 20 61 6c 6c      /// will all
96a0: 6f 63 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79  ocate the memory
96b0: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
96c0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 28 6f 72  _vtab_cursor (or
96d0: 20 61 20 73 75 62 63 6c 61 73 73 29 2c 0d 0a 20   a subclass),.. 
96e0: 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 69 74 69         /// initi
96f0: 61 6c 69 7a 65 20 74 68 65 20 6e 65 77 20 6f 62  alize the new ob
9700: 6a 65 63 74 2c 20 61 6e 64 20 6d 61 6b 65 20 2a  ject, and make *
9710: 70 70 43 75 72 73 6f 72 20 70 6f 69 6e 74 20 74  ppCursor point t
9720: 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
9730: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  ...        /// T
9740: 68 65 20 73 75 63 63 65 73 73 66 75 6c 20 63 61  he successful ca
9750: 6c 6c 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20  ll then returns 
9760: 53 51 4c 49 54 45 5f 4f 4b 2e 0d 0a 20 20 20 20  SQLITE_OK...    
9770: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
9780: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
9790: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
97a0: 20 46 6f 72 20 65 76 65 72 79 20 73 75 63 63 65   For every succe
97b0: 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 20 74 68  ssful call to th
97c0: 69 73 20 6d 65 74 68 6f 64 2c 20 74 68 65 20 53  is method, the S
97d0: 51 4c 69 74 65 20 63 6f 72 65 20 77 69 6c 6c 0d  QLite core will.
97e0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6c 61 74  .        /// lat
97f0: 65 72 20 69 6e 76 6f 6b 65 20 74 68 65 20 78 43  er invoke the xC
9800: 6c 6f 73 65 20 6d 65 74 68 6f 64 20 74 6f 20 64  lose method to d
9810: 65 73 74 72 6f 79 20 0d 0a 20 20 20 20 20 20 20  estroy ..       
9820: 20 2f 2f 2f 20 74 68 65 20 61 6c 6c 6f 63 61 74   /// the allocat
9830: 65 64 20 63 75 72 73 6f 72 2e 0d 0a 20 20 20 20  ed cursor...    
9840: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
9850: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
9860: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
9870: 20 54 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f   The xOpen metho
9880: 64 20 6e 65 65 64 20 6e 6f 74 20 69 6e 69 74 69  d need not initi
9890: 61 6c 69 7a 65 20 74 68 65 20 70 56 74 61 62 20  alize the pVtab 
98a0: 66 69 65 6c 64 20 6f 66 20 74 68 65 0d 0a 20 20  field of the..  
98b0: 20 20 20 20 20 20 2f 2f 2f 20 73 71 6c 69 74 65        /// sqlite
98c0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 73 74  3_vtab_cursor st
98d0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 53 51  ructure.  The SQ
98e0: 4c 69 74 65 20 63 6f 72 65 20 77 69 6c 6c 20 74  Lite core will t
98f0: 61 6b 65 20 63 61 72 65 0d 0a 20 20 20 20 20 20  ake care..      
9900: 20 20 2f 2f 2f 20 6f 66 20 74 68 61 74 20 63 68    /// of that ch
9910: 6f 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ore automaticall
9920: 79 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  y...        /// 
9930: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
9940: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
9950: 20 20 20 20 20 2f 2f 2f 20 41 20 76 69 72 74 75       /// A virtu
9960: 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65  al table impleme
9970: 6e 74 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ntation must be 
9980: 61 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20  able to support 
9990: 61 6e 20 61 72 62 69 74 72 61 72 79 0d 0a 20 20  an arbitrary..  
99a0: 20 20 20 20 20 20 2f 2f 2f 20 6e 75 6d 62 65 72        /// number
99b0: 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73   of simultaneous
99c0: 6c 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  ly open cursors.
99d0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
99e0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
99f0: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
9a00: 20 20 20 2f 2f 2f 20 57 68 65 6e 20 69 6e 69 74     /// When init
9a10: 69 61 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 74 68  ially opened, th
9a20: 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 61  e cursor is in a
9a30: 6e 20 75 6e 64 65 66 69 6e 65 64 20 73 74 61 74  n undefined stat
9a40: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
9a50: 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  The SQLite core 
9a60: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
9a70: 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 0d 0a  xFilter method..
9a80: 20 20 20 20 20 20 20 20 2f 2f 2f 20 6f 6e 20 74          /// on t
9a90: 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20  he cursor prior 
9aa0: 74 6f 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74  to any attempt t
9ab0: 6f 20 70 6f 73 69 74 69 6f 6e 20 6f 72 20 72 65  o position or re
9ac0: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 73  ad from the curs
9ad0: 6f 72 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  or...        ///
9ae0: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
9af0: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
9b00: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 4f        /// The xO
9b10: 70 65 6e 20 6d 65 74 68 6f 64 20 69 73 20 72 65  pen method is re
9b20: 71 75 69 72 65 64 20 66 6f 72 20 65 76 65 72 79  quired for every
9b30: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
9b40: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a  mplementation...
9b50: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
9b60: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
9b70: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
9b80: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
9b90: 6e 61 6d 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20  name="pVtab">.. 
9ba0: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
9bb0: 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f  ative pointer to
9bc0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
9bd0: 62 20 64 65 72 69 76 65 64 20 73 74 72 75 63 74  b derived struct
9be0: 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ure...        //
9bf0: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
9c00: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
9c10: 61 6d 65 3d 22 70 43 75 72 73 6f 72 22 3e 0d 0a  ame="pCursor">..
9c20: 20 20 20 20 20 20 20 20 2f 2f 2f 20 55 70 6f 6e          /// Upon
9c30: 20 73 75 63 63 65 73 73 2c 20 74 68 69 73 20 70   success, this p
9c40: 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65  arameter must be
9c50: 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 70 6f 69   modified to poi
9c60: 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 6c 79 0d  nt to the newly.
9c70: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 63 72 65  .        /// cre
9c80: 61 74 65 64 20 6e 61 74 69 76 65 20 73 71 6c 69  ated native sqli
9c90: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
9ca0: 64 65 72 69 76 65 64 20 73 74 72 75 63 74 75 72  derived structur
9cb0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
9cc0: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
9cd0: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d    /// <returns>.
9ce0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73  .        /// A s
9cf0: 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72  tandard SQLite r
9d00: 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20  eturn code...   
9d10: 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72       /// </retur
9d20: 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c  ns>..        SQL
9d30: 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78 4f 70  iteErrorCode xOp
9d40: 65 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  en(..           
9d50: 20 49 6e 74 50 74 72 20 70 56 74 61 62 2c 0d 0a   IntPtr pVtab,..
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20              ref 
9d70: 49 6e 74 50 74 72 20 70 43 75 72 73 6f 72 0d 0a  IntPtr pCursor..
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a              );..
9d90: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
9da0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9db0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9dc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9dd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9de0: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  /....        ///
9df0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
9e00: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63      /// <para><c
9e10: 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ode>..        //
9e20: 2f 20 69 6e 74 20 28 2a 78 43 6c 6f 73 65 29 28  / int (*xClose)(
9e30: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
9e40: 73 6f 72 2a 29 3b 0d 0a 20 20 20 20 20 20 20 20  sor*);..        
9e50: 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72  /// </code></par
9e60: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
9e70: 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  <para>..        
9e80: 2f 2f 2f 20 54 68 65 20 78 43 6c 6f 73 65 20 6d  /// The xClose m
9e90: 65 74 68 6f 64 20 63 6c 6f 73 65 73 20 61 20 63  ethod closes a c
9ea0: 75 72 73 6f 72 20 70 72 65 76 69 6f 75 73 6c 79  ursor previously
9eb0: 20 6f 70 65 6e 65 64 20 62 79 20 0d 0a 20 20 20   opened by ..   
9ec0: 20 20 20 20 20 2f 2f 2f 20 78 4f 70 65 6e 2e 20       /// xOpen. 
9ed0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
9ee0: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 69  e SQLite core wi
9ef0: 6c 6c 20 61 6c 77 61 79 73 20 63 61 6c 6c 20 78  ll always call x
9f00: 43 6c 6f 73 65 20 6f 6e 63 65 20 66 6f 72 20 65  Close once for e
9f10: 61 63 68 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  ach cursor opene
9f20: 64 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  d ..        /// 
9f30: 75 73 69 6e 67 20 78 4f 70 65 6e 2e 0d 0a 20 20  using xOpen...  
9f40: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
9f50: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
9f60: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
9f70: 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20 6d  // This method m
9f80: 75 73 74 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  ust release all 
9f90: 72 65 73 6f 75 72 63 65 73 20 61 6c 6c 6f 63 61  resources alloca
9fa0: 74 65 64 20 62 79 20 74 68 65 0d 0a 20 20 20 20  ted by the..    
9fb0: 20 20 20 20 2f 2f 2f 20 63 6f 72 72 65 73 70 6f      /// correspo
9fc0: 6e 64 69 6e 67 20 78 4f 70 65 6e 20 63 61 6c 6c  nding xOpen call
9fd0: 2e 20 54 68 65 20 72 6f 75 74 69 6e 65 20 77 69  . The routine wi
9fe0: 6c 6c 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ll not be called
9ff0: 20 61 67 61 69 6e 20 65 76 65 6e 20 69 66 20 69   again even if i
a000: 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 72  t..        /// r
a010: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e  eturns an error.
a020: 20 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72    The SQLite cor
a030: 65 20 77 69 6c 6c 20 6e 6f 74 20 75 73 65 20 74  e will not use t
a040: 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  he..        /// 
a050: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
a060: 73 6f 72 20 61 67 61 69 6e 20 61 66 74 65 72 20  sor again after 
a070: 69 74 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  it has been clos
a080: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ed...        ///
a090: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
a0a0: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
a0b0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 43        /// The xC
a0c0: 6c 6f 73 65 20 6d 65 74 68 6f 64 20 69 73 20 72  lose method is r
a0d0: 65 71 75 69 72 65 64 20 66 6f 72 20 65 76 65 72  equired for ever
a0e0: 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  y virtual table 
a0f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d  implementation..
a100: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
a110: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
a120: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
a130: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
a140: 20 6e 61 6d 65 3d 22 70 43 75 72 73 6f 72 22 3e   name="pCursor">
a150: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
a160: 65 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72  e native pointer
a170: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
a180: 76 74 61 62 5f 63 75 72 73 6f 72 20 64 65 72 69  vtab_cursor deri
a190: 76 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a  ved structure...
a1a0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
a1b0: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ram>..        //
a1c0: 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  / <returns>..   
a1d0: 20 20 20 20 20 2f 2f 2f 20 41 20 73 74 61 6e 64       /// A stand
a1e0: 61 72 64 20 53 51 4c 69 74 65 20 72 65 74 75 72  ard SQLite retur
a1f0: 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20  n code...       
a200: 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d   /// </returns>.
a210: 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 45  .        SQLiteE
a220: 72 72 6f 72 43 6f 64 65 20 78 43 6c 6f 73 65 28  rrorCode xClose(
a230: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  ..            In
a240: 74 50 74 72 20 70 43 75 72 73 6f 72 0d 0a 20 20  tPtr pCursor..  
a250: 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a            );....
a260: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
a270: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a2a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
a2b0: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
a2c0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
a2d0: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64    /// <para><cod
a2e0: 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e>..        /// 
a2f0: 69 6e 74 20 28 2a 78 46 69 6c 74 65 72 29 28 73  int (*xFilter)(s
a300: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
a310: 6f 72 2a 2c 20 69 6e 74 20 69 64 78 4e 75 6d 2c  or*, int idxNum,
a320: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78   const char *idx
a330: 53 74 72 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f  Str,..        //
a340: 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
a350: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
a360: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 3b  3_value **argv);
a370: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
a380: 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20  code></para>..  
a390: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
a3a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
a3b0: 69 73 20 6d 65 74 68 6f 64 20 62 65 67 69 6e 73  is method begins
a3c0: 20 61 20 73 65 61 72 63 68 20 6f 66 20 61 20 76   a search of a v
a3d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 0d 0a  irtual table. ..
a3e0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
a3f0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
a400: 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  s a cursor opene
a410: 64 20 62 79 20 78 4f 70 65 6e 2e 20 0d 0a 20 20  d by xOpen. ..  
a420: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 65        /// The ne
a430: 78 74 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  xt two arguments
a440: 20 64 65 66 69 6e 65 20 61 20 70 61 72 74 69 63   define a partic
a450: 75 6c 61 72 20 73 65 61 72 63 68 20 69 6e 64 65  ular search inde
a460: 78 20 70 72 65 76 69 6f 75 73 6c 79 20 0d 0a 20  x previously .. 
a470: 20 20 20 20 20 20 20 2f 2f 2f 20 63 68 6f 73 65         /// chose
a480: 6e 20 62 79 20 78 42 65 73 74 49 6e 64 65 78 2e  n by xBestIndex.
a490: 20 54 68 65 20 73 70 65 63 69 66 69 63 20 6d 65   The specific me
a4a0: 61 6e 69 6e 67 73 20 6f 66 20 69 64 78 4e 75 6d  anings of idxNum
a4b0: 20 61 6e 64 20 69 64 78 53 74 72 20 0d 0a 20 20   and idxStr ..  
a4c0: 20 20 20 20 20 20 2f 2f 2f 20 61 72 65 20 75 6e        /// are un
a4d0: 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 6c 6f 6e  important as lon
a4e0: 67 20 61 73 20 78 46 69 6c 74 65 72 20 61 6e 64  g as xFilter and
a4f0: 20 78 42 65 73 74 49 6e 64 65 78 20 61 67 72 65   xBestIndex agre
a500: 65 20 6f 6e 20 77 68 61 74 20 0d 0a 20 20 20 20  e on what ..    
a510: 20 20 20 20 2f 2f 2f 20 74 68 61 74 20 6d 65 61      /// that mea
a520: 6e 69 6e 67 20 69 73 2e 0d 0a 20 20 20 20 20 20  ning is...      
a530: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
a540: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
a550: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
a560: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 66 75  he xBestIndex fu
a570: 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61 76 65 20  nction may have 
a580: 72 65 71 75 65 73 74 65 64 20 74 68 65 20 76 61  requested the va
a590: 6c 75 65 73 20 6f 66 20 0d 0a 20 20 20 20 20 20  lues of ..      
a5a0: 20 20 2f 2f 2f 20 63 65 72 74 61 69 6e 20 65 78    /// certain ex
a5b0: 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20  pressions using 
a5c0: 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 55  the aConstraintU
a5d0: 73 61 67 65 5b 5d 2e 61 72 67 76 49 6e 64 65 78  sage[].argvIndex
a5e0: 20 76 61 6c 75 65 73 20 0d 0a 20 20 20 20 20 20   values ..      
a5f0: 20 20 2f 2f 2f 20 6f 66 20 74 68 65 20 73 71 6c    /// of the sql
a600: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
a610: 73 74 72 75 63 74 75 72 65 2e 20 0d 0a 20 20 20  structure. ..   
a620: 20 20 20 20 20 2f 2f 2f 20 54 68 6f 73 65 20 76       /// Those v
a630: 61 6c 75 65 73 20 61 72 65 20 70 61 73 73 65 64  alues are passed
a640: 20 74 6f 20 78 46 69 6c 74 65 72 20 75 73 69 6e   to xFilter usin
a650: 67 20 74 68 65 20 61 72 67 63 20 61 6e 64 20 61  g the argc and a
a660: 72 67 76 20 70 61 72 61 6d 65 74 65 72 73 2e 0d  rgv parameters..
a670: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
a680: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
a690: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
a6a0: 20 20 2f 2f 2f 20 49 66 20 74 68 65 20 76 69 72    /// If the vir
a6b0: 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e 74 61  tual table conta
a6c0: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
a6d0: 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
a6e0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  the..        ///
a6f0: 20 73 65 61 72 63 68 20 63 72 69 74 65 72 69 61   search criteria
a700: 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
a710: 72 20 6d 75 73 74 20 62 65 20 6c 65 66 74 20 70  r must be left p
a720: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
a730: 74 20 72 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  t row...        
a740: 2f 2f 2f 20 53 75 62 73 65 71 75 65 6e 74 20 63  /// Subsequent c
a750: 61 6c 6c 73 20 74 6f 20 78 45 6f 66 20 6d 75 73  alls to xEof mus
a760: 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20 28  t return false (
a770: 7a 65 72 6f 29 2e 0d 0a 20 20 20 20 20 20 20 20  zero)...        
a780: 2f 2f 2f 20 49 66 20 74 68 65 72 65 20 61 72 65  /// If there are
a790: 20 6e 6f 20 72 6f 77 73 20 6d 61 74 63 68 2c 20   no rows match, 
a7a0: 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
a7b0: 6d 75 73 74 20 62 65 20 6c 65 66 74 20 69 6e 20  must be left in 
a7c0: 61 20 73 74 61 74 65 20 0d 0a 20 20 20 20 20 20  a state ..      
a7d0: 20 20 2f 2f 2f 20 74 68 61 74 20 77 69 6c 6c 20    /// that will 
a7e0: 63 61 75 73 65 20 74 68 65 20 78 45 6f 66 20 74  cause the xEof t
a7f0: 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 28 6e  o return true (n
a800: 6f 6e 2d 7a 65 72 6f 29 2e 0d 0a 20 20 20 20 20  on-zero)...     
a810: 20 20 20 2f 2f 2f 20 54 68 65 20 53 51 4c 69 74     /// The SQLit
a820: 65 20 65 6e 67 69 6e 65 20 77 69 6c 6c 20 75 73  e engine will us
a830: 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74  e..        /// t
a840: 68 65 20 78 43 6f 6c 75 6d 6e 20 61 6e 64 20 78  he xColumn and x
a850: 52 6f 77 69 64 20 6d 65 74 68 6f 64 73 20 74 6f  Rowid methods to
a860: 20 61 63 63 65 73 73 20 74 68 61 74 20 72 6f 77   access that row
a870: 20 63 6f 6e 74 65 6e 74 2e 0d 0a 20 20 20 20 20   content...     
a880: 20 20 20 2f 2f 2f 20 54 68 65 20 78 4e 65 78 74     /// The xNext
a890: 20 6d 65 74 68 6f 64 20 77 69 6c 6c 20 62 65 20   method will be 
a8a0: 75 73 65 64 20 74 6f 20 61 64 76 61 6e 63 65 20  used to advance 
a8b0: 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e  to the next row.
a8c0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
a8d0: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
a8e0: 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20  // <para>..     
a8f0: 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68     /// This meth
a900: 6f 64 20 6d 75 73 74 20 72 65 74 75 72 6e 20 53  od must return S
a910: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
a920: 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 73 71  essful, or an sq
a930: 6c 69 74 65 20 0d 0a 20 20 20 20 20 20 20 20 2f  lite ..        /
a940: 2f 2f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  // error code if
a950: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
a960: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
a970: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
a980: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
a990: 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 46 69 6c      /// The xFil
a9a0: 74 65 72 20 6d 65 74 68 6f 64 20 69 73 20 72 65  ter method is re
a9b0: 71 75 69 72 65 64 20 66 6f 72 20 65 76 65 72 79  quired for every
a9c0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
a9d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a  mplementation...
a9e0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
a9f0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
aa00: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
aa10: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
aa20: 6e 61 6d 65 3d 22 70 43 75 72 73 6f 72 22 3e 0d  name="pCursor">.
aa30: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  .        /// The
aa40: 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20   native pointer 
aa50: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
aa60: 74 61 62 5f 63 75 72 73 6f 72 20 64 65 72 69 76  tab_cursor deriv
aa70: 65 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20  ed structure... 
aa80: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
aa90: 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  am>..        ///
aaa0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69 64   <param name="id
aab0: 78 4e 75 6d 22 3e 0d 0a 20 20 20 20 20 20 20 20  xNum">..        
aac0: 2f 2f 2f 20 4e 75 6d 62 65 72 20 75 73 65 64 20  /// Number used 
aad0: 74 6f 20 68 65 6c 70 20 69 64 65 6e 74 69 66 79  to help identify
aae0: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 69 6e   the selected in
aaf0: 64 65 78 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  dex...        //
ab00: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
ab10: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
ab20: 61 6d 65 3d 22 69 64 78 53 74 72 22 3e 0d 0a 20  ame="idxStr">.. 
ab30: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
ab40: 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f  ative pointer to
ab50: 20 74 68 65 20 55 54 46 2d 38 20 65 6e 63 6f 64   the UTF-8 encod
ab60: 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ed string contai
ab70: 6e 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20  ning the..      
ab80: 20 20 2f 2f 2f 20 73 74 72 69 6e 67 20 75 73 65    /// string use
ab90: 64 20 74 6f 20 68 65 6c 70 20 69 64 65 6e 74 69  d to help identi
aba0: 66 79 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  fy the selected 
abb0: 69 6e 64 65 78 2e 0d 0a 20 20 20 20 20 20 20 20  index...        
abc0: 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
abd0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
abe0: 20 6e 61 6d 65 3d 22 61 72 67 63 22 3e 0d 0a 20   name="argc">.. 
abf0: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
ac00: 75 6d 62 65 72 20 6f 66 20 6e 61 74 69 76 65 20  umber of native 
ac10: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 71 6c 69  pointers to sqli
ac20: 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
ac30: 75 72 65 73 20 73 70 65 63 69 66 69 65 64 0d 0a  ures specified..
ac40: 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 20 3c          /// in <
ac50: 70 61 72 61 6d 72 65 66 20 6e 61 6d 65 3d 22 61  paramref name="a
ac60: 72 67 76 22 20 2f 3e 2e 0d 0a 20 20 20 20 20 20  rgv" />...      
ac70: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a    /// </param>..
ac80: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
ac90: 61 6d 20 6e 61 6d 65 3d 22 61 72 67 76 22 3e 0d  am name="argv">.
aca0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 6e 20  .        /// An 
acb0: 61 72 72 61 79 20 6f 66 20 6e 61 74 69 76 65 20  array of native 
acc0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 71 6c 69  pointers to sqli
acd0: 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
ace0: 75 72 65 73 20 63 6f 6e 74 61 69 6e 69 6e 67 0d  ures containing.
acf0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 66 69 6c  .        /// fil
ad00: 74 65 72 69 6e 67 20 63 72 69 74 65 72 69 61 20  tering criteria 
ad10: 66 6f 72 20 74 68 65 20 73 65 6c 65 63 74 65 64  for the selected
ad20: 20 69 6e 64 65 78 2e 0d 0a 20 20 20 20 20 20 20   index...       
ad30: 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20   /// </param>.. 
ad40: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75         /// <retu
ad50: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  rns>..        //
ad60: 2f 20 41 20 73 74 61 6e 64 61 72 64 20 53 51 4c  / A standard SQL
ad70: 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ite return code.
ad80: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
ad90: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20  returns>..      
ada0: 20 20 53 51 4c 69 74 65 45 72 72 6f 72 43 6f 64    SQLiteErrorCod
adb0: 65 20 78 46 69 6c 74 65 72 28 0d 0a 20 20 20 20  e xFilter(..    
adc0: 20 20 20 20 20 20 20 20 49 6e 74 50 74 72 20 70          IntPtr p
add0: 43 75 72 73 6f 72 2c 0d 0a 20 20 20 20 20 20 20  Cursor,..       
ade0: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c       int idxNum,
adf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  ..            In
ae00: 74 50 74 72 20 69 64 78 53 74 72 2c 0d 0a 20 20  tPtr idxStr,..  
ae10: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 72            int ar
ae20: 67 63 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  gc,..           
ae30: 20 49 6e 74 50 74 72 20 61 72 67 76 0d 0a 20 20   IntPtr argv..  
ae40: 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a            );....
ae50: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
ae60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
aea0: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
aeb0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
aec0: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64    /// <para><cod
aed0: 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e>..        /// 
aee0: 69 6e 74 20 28 2a 78 4e 65 78 74 29 28 73 71 6c  int (*xNext)(sql
aef0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
af00: 2a 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  *);..        ///
af10: 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d   </code></para>.
af20: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
af30: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
af40: 20 54 68 65 20 78 4e 65 78 74 20 6d 65 74 68 6f   The xNext metho
af50: 64 20 61 64 76 61 6e 63 65 73 20 61 20 76 69 72  d advances a vir
af60: 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f  tual table curso
af70: 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74  r..        /// t
af80: 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f  o the next row o
af90: 66 20 61 20 72 65 73 75 6c 74 20 73 65 74 20 69  f a result set i
afa0: 6e 69 74 69 61 74 65 64 20 62 79 20 78 46 69 6c  nitiated by xFil
afb0: 74 65 72 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f  ter. ..        /
afc0: 2f 2f 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  // If the cursor
afd0: 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
afe0: 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73 74  ting at the last
aff0: 20 72 6f 77 20 77 68 65 6e 20 74 68 69 73 20 0d   row when this .
b000: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 72 6f 75  .        /// rou
b010: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
b020: 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
b030: 6e 6f 20 6c 6f 6e 67 65 72 20 70 6f 69 6e 74 73  no longer points
b040: 20 74 6f 20 76 61 6c 69 64 20 0d 0a 20 20 20 20   to valid ..    
b050: 20 20 20 20 2f 2f 2f 20 64 61 74 61 20 61 6e 64      /// data and
b060: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
b070: 6c 6c 20 74 6f 20 74 68 65 20 78 45 6f 66 20 6d  ll to the xEof m
b080: 65 74 68 6f 64 20 6d 75 73 74 20 72 65 74 75 72  ethod must retur
b090: 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f  n true (non-zero
b0a0: 29 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ). ..        ///
b0b0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
b0c0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  s successfully a
b0d0: 64 76 61 6e 63 65 64 20 74 6f 20 61 6e 6f 74 68  dvanced to anoth
b0e0: 65 72 20 72 6f 77 20 6f 66 20 63 6f 6e 74 65 6e  er row of conten
b0f0: 74 2c 20 74 68 65 6e 0d 0a 20 20 20 20 20 20 20  t, then..       
b100: 20 2f 2f 2f 20 73 75 62 73 65 71 75 65 6e 74 20   /// subsequent 
b110: 63 61 6c 6c 73 20 74 6f 20 78 45 6f 66 20 6d 75  calls to xEof mu
b120: 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20  st return false 
b130: 28 7a 65 72 6f 29 2e 0d 0a 20 20 20 20 20 20 20  (zero)...       
b140: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
b150: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
b160: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
b170: 69 73 20 6d 65 74 68 6f 64 20 6d 75 73 74 20 72  is method must r
b180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
b190: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
b1a0: 72 20 61 6e 20 73 71 6c 69 74 65 20 0d 0a 20 20  r an sqlite ..  
b1b0: 20 20 20 20 20 20 2f 2f 2f 20 65 72 72 6f 72 20        /// error 
b1c0: 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
b1d0: 20 6f 63 63 75 72 73 2e 0d 0a 20 20 20 20 20 20   occurs...      
b1e0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
b1f0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
b200: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
b210: 68 65 20 78 4e 65 78 74 20 6d 65 74 68 6f 64 20  he xNext method 
b220: 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
b230: 65 76 65 72 79 20 76 69 72 74 75 61 6c 20 74 61  every virtual ta
b240: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
b250: 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  on...        ///
b260: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
b270: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
b280: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
b290: 61 72 61 6d 20 6e 61 6d 65 3d 22 70 43 75 72 73  aram name="pCurs
b2a0: 6f 72 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  or">..        //
b2b0: 2f 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f 69  / The native poi
b2c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69  nter to the sqli
b2d0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
b2e0: 64 65 72 69 76 65 64 20 73 74 72 75 63 74 75 72  derived structur
b2f0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
b300: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
b310: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d    /// <returns>.
b320: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73  .        /// A s
b330: 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72  tandard SQLite r
b340: 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20  eturn code...   
b350: 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72       /// </retur
b360: 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c  ns>..        SQL
b370: 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78 4e 65  iteErrorCode xNe
b380: 78 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  xt(..           
b390: 20 49 6e 74 50 74 72 20 70 43 75 72 73 6f 72 0d   IntPtr pCursor.
b3a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d  .            );.
b3b0: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  ...        /////
b3c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b3d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b3e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b3f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b400: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  //....        //
b410: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
b420: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c       /// <para><
b430: 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f  code>..        /
b440: 2f 2f 20 69 6e 74 20 28 2a 78 45 6f 66 29 28 73  // int (*xEof)(s
b450: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
b460: 6f 72 2a 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f  or*);..        /
b470: 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61  // </code></para
b480: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
b490: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
b4a0: 2f 2f 20 54 68 65 20 78 45 6f 66 20 6d 65 74 68  // The xEof meth
b4b0: 6f 64 20 6d 75 73 74 20 72 65 74 75 72 6e 20 66  od must return f
b4c0: 61 6c 73 65 20 28 7a 65 72 6f 29 20 69 66 20 74  alse (zero) if t
b4d0: 68 65 20 73 70 65 63 69 66 69 65 64 20 63 75 72  he specified cur
b4e0: 73 6f 72 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  sor ..        //
b4f0: 2f 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  / currently poin
b500: 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ts to a valid ro
b510: 77 20 6f 66 20 64 61 74 61 2c 20 6f 72 20 74 72  w of data, or tr
b520: 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 6f 74  ue (non-zero) ot
b530: 68 65 72 77 69 73 65 2e 20 0d 0a 20 20 20 20 20  herwise. ..     
b540: 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68     /// This meth
b550: 6f 64 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  od is called by 
b560: 74 68 65 20 53 51 4c 20 65 6e 67 69 6e 65 20 69  the SQL engine i
b570: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
b580: 20 65 61 63 68 20 0d 0a 20 20 20 20 20 20 20 20   each ..        
b590: 2f 2f 2f 20 78 46 69 6c 74 65 72 20 61 6e 64 20  /// xFilter and 
b5a0: 78 4e 65 78 74 20 69 6e 76 6f 63 61 74 69 6f 6e  xNext invocation
b5b0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
b5c0: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
b5d0: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
b5e0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 45 6f 66      /// The xEof
b5f0: 20 6d 65 74 68 6f 64 20 69 73 20 72 65 71 75 69   method is requi
b600: 72 65 64 20 66 6f 72 20 65 76 65 72 79 20 76 69  red for every vi
b610: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c  rtual table impl
b620: 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 20 20  ementation...   
b630: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
b640: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
b650: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
b660: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
b670: 65 3d 22 70 43 75 72 73 6f 72 22 3e 0d 0a 20 20  e="pCursor">..  
b680: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61        /// The na
b690: 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  tive pointer to 
b6a0: 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62  the sqlite3_vtab
b6b0: 5f 63 75 72 73 6f 72 20 64 65 72 69 76 65 64 20  _cursor derived 
b6c0: 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20 20  structure...    
b6d0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
b6e0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72  ..        /// <r
b6f0: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20  eturns>..       
b700: 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66   /// Non-zero if
b710: 20 6e 6f 20 6d 6f 72 65 20 72 6f 77 73 20 61 72   no more rows ar
b720: 65 20 61 76 61 69 6c 61 62 6c 65 3b 20 7a 65 72  e available; zer
b730: 6f 20 6f 74 68 65 72 77 69 73 65 2e 0d 0a 20 20  o otherwise...  
b740: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75        /// </retu
b750: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 69 6e  rns>..        in
b760: 74 20 78 45 6f 66 28 0d 0a 20 20 20 20 20 20 20  t xEof(..       
b770: 20 20 20 20 20 49 6e 74 50 74 72 20 70 43 75 72       IntPtr pCur
b780: 73 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  sor..           
b790: 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f   );....        /
b7a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b7b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b7c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b7d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b7e0: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
b7f0: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
b800: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
b810: 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20  ra><code>..     
b820: 20 20 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 43 6f     /// int (*xCo
b830: 6c 75 6d 6e 29 28 73 71 6c 69 74 65 33 5f 76 74  lumn)(sqlite3_vt
b840: 61 62 5f 63 75 72 73 6f 72 2a 2c 20 73 71 6c 69  ab_cursor*, sqli
b850: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 69 6e  te3_context*, in
b860: 74 20 4e 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f  t N);..        /
b870: 2f 2f 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61  // </code></para
b880: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
b890: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
b8a0: 2f 2f 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f  // The SQLite co
b8b0: 72 65 20 69 6e 76 6f 6b 65 73 20 74 68 69 73 20  re invokes this 
b8c0: 6d 65 74 68 6f 64 20 69 6e 20 6f 72 64 65 72 20  method in order 
b8d0: 74 6f 20 66 69 6e 64 20 74 68 65 20 76 61 6c 75  to find the valu
b8e0: 65 20 66 6f 72 20 0d 0a 20 20 20 20 20 20 20 20  e for ..        
b8f0: 2f 2f 2f 20 74 68 65 20 4e 2d 74 68 20 63 6f 6c  /// the N-th col
b900: 75 6d 6e 20 6f 66 20 74 68 65 20 63 75 72 72 65  umn of the curre
b910: 6e 74 20 72 6f 77 2e 20 4e 20 69 73 20 7a 65 72  nt row. N is zer
b920: 6f 2d 62 61 73 65 64 20 73 6f 20 74 68 65 20 66  o-based so the f
b930: 69 72 73 74 20 63 6f 6c 75 6d 6e 20 0d 0a 20 20  irst column ..  
b940: 20 20 20 20 20 20 2f 2f 2f 20 69 73 20 6e 75 6d        /// is num
b950: 62 65 72 65 64 20 30 2e 20 0d 0a 20 20 20 20 20  bered 0. ..     
b960: 20 20 20 2f 2f 2f 20 54 68 65 20 78 43 6f 6c 75     /// The xColu
b970: 6d 6e 20 6d 65 74 68 6f 64 20 6d 61 79 20 72 65  mn method may re
b980: 74 75 72 6e 20 69 74 73 20 72 65 73 75 6c 74 20  turn its result 
b990: 62 61 63 6b 20 74 6f 20 53 51 4c 69 74 65 20 75  back to SQLite u
b9a0: 73 69 6e 67 20 6f 6e 65 20 6f 66 20 74 68 65 0d  sing one of the.
b9b0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 66 6f 6c  .        /// fol
b9c0: 6c 6f 77 69 6e 67 20 69 6e 74 65 72 66 61 63 65  lowing interface
b9d0: 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  :..        /// <
b9e0: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
b9f0: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
ba00: 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41      /// <![CDATA
ba10: 5b 3c 75 6c 3e 5d 5d 3e 0d 0a 20 20 20 20 20 20  [<ul>]]>..      
ba20: 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c    /// <![CDATA[<
ba30: 6c 69 3e 5d 5d 3e 20 73 71 6c 69 74 65 33 5f 72  li>]]> sqlite3_r
ba40: 65 73 75 6c 74 5f 62 6c 6f 62 28 29 0d 0a 20 20  esult_blob()..  
ba50: 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41        /// <![CDA
ba60: 54 41 5b 3c 2f 6c 69 3e 5d 5d 3e 3c 21 5b 43 44  TA[</li>]]><![CD
ba70: 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 73 71 6c 69  ATA[<li>]]> sqli
ba80: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
ba90: 65 28 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  e()..        ///
baa0: 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 6c 69 3e 5d   <![CDATA[</li>]
bab0: 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 6c 69 3e 5d  ]><![CDATA[<li>]
bac0: 5d 3e 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ]> sqlite3_resul
bad0: 74 5f 69 6e 74 28 29 0d 0a 20 20 20 20 20 20 20  t_int()..       
bae0: 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f   /// <![CDATA[</
baf0: 6c 69 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c  li>]]><![CDATA[<
bb00: 6c 69 3e 5d 5d 3e 20 73 71 6c 69 74 65 33 5f 72  li>]]> sqlite3_r
bb10: 65 73 75 6c 74 5f 69 6e 74 36 34 28 29 0d 0a 20  esult_int64().. 
bb20: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44         /// <![CD
bb30: 41 54 41 5b 3c 2f 6c 69 3e 5d 5d 3e 3c 21 5b 43  ATA[</li>]]><![C
bb40: 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 73 71 6c  DATA[<li>]]> sql
bb50: 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
bb60: 28 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ()..        /// 
bb70: 3c 21 5b 43 44 41 54 41 5b 3c 2f 6c 69 3e 5d 5d  <![CDATA[</li>]]
bb80: 3e 3c 21 5b 43 44 41 54 41 5b 3c 6c 69 3e 5d 5d  ><![CDATA[<li>]]
bb90: 3e 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  > sqlite3_result
bba0: 5f 74 65 78 74 28 29 0d 0a 20 20 20 20 20 20 20  _text()..       
bbb0: 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f   /// <![CDATA[</
bbc0: 6c 69 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c  li>]]><![CDATA[<
bbd0: 6c 69 3e 5d 5d 3e 20 73 71 6c 69 74 65 33 5f 72  li>]]> sqlite3_r
bbe0: 65 73 75 6c 74 5f 74 65 78 74 31 36 28 29 0d 0a  esult_text16()..
bbf0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43          /// <![C
bc00: 44 41 54 41 5b 3c 2f 6c 69 3e 5d 5d 3e 3c 21 5b  DATA[</li>]]><![
bc10: 43 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20 73 71  CDATA[<li>]]> sq
bc20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
bc30: 74 31 36 6c 65 28 29 0d 0a 20 20 20 20 20 20 20  t16le()..       
bc40: 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f   /// <![CDATA[</
bc50: 6c 69 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c  li>]]><![CDATA[<
bc60: 6c 69 3e 5d 5d 3e 20 73 71 6c 69 74 65 33 5f 72  li>]]> sqlite3_r
bc70: 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 29  esult_text16be()
bc80: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21  ..        /// <!
bc90: 5b 43 44 41 54 41 5b 3c 2f 6c 69 3e 5d 5d 3e 3c  [CDATA[</li>]]><
bca0: 21 5b 43 44 41 54 41 5b 3c 6c 69 3e 5d 5d 3e 20  ![CDATA[<li>]]> 
bcb0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 7a  sqlite3_result_z
bcc0: 65 72 6f 62 6c 6f 62 28 29 0d 0a 20 20 20 20 20  eroblob()..     
bcd0: 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b     /// <![CDATA[
bce0: 3c 2f 6c 69 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41  </li>]]><![CDATA
bcf0: 5b 3c 2f 75 6c 3e 5d 5d 3e 0d 0a 20 20 20 20 20  [</ul>]]>..     
bd00: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
bd10: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
bd20: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
bd30: 49 66 20 74 68 65 20 78 43 6f 6c 75 6d 6e 20 6d  If the xColumn m
bd40: 65 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61  ethod implementa
bd50: 74 69 6f 6e 20 63 61 6c 6c 73 20 6e 6f 6e 65 20  tion calls none 
bd60: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73  of the functions
bd70: 20 61 62 6f 76 65 2c 0d 0a 20 20 20 20 20 20 20   above,..       
bd80: 20 2f 2f 2f 20 74 68 65 6e 20 74 68 65 20 76 61   /// then the va
bd90: 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  lue of the colum
bda0: 6e 20 64 65 66 61 75 6c 74 73 20 74 6f 20 61 6e  n defaults to an
bdb0: 20 53 51 4c 20 4e 55 4c 4c 2e 0d 0a 20 20 20 20   SQL NULL...    
bdc0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d      /// </para>.
bdd0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
bde0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
bdf0: 20 54 6f 20 72 61 69 73 65 20 61 6e 20 65 72 72   To raise an err
be00: 6f 72 2c 20 74 68 65 20 78 43 6f 6c 75 6d 6e 20  or, the xColumn 
be10: 6d 65 74 68 6f 64 20 73 68 6f 75 6c 64 20 75 73  method should us
be20: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 65 73  e one of the res
be30: 75 6c 74 5f 74 65 78 74 28 29 20 0d 0a 20 20 20  ult_text() ..   
be40: 20 20 20 20 20 2f 2f 2f 20 6d 65 74 68 6f 64 73       /// methods
be50: 20 74 6f 20 73 65 74 20 74 68 65 20 65 72 72 6f   to set the erro
be60: 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 2c 20  r message text, 
be70: 74 68 65 6e 20 72 65 74 75 72 6e 20 61 6e 20 61  then return an a
be80: 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20 20 20  ppropriate..    
be90: 20 20 20 20 2f 2f 2f 20 65 72 72 6f 72 20 63 6f      /// error co
bea0: 64 65 2e 20 20 54 68 65 20 78 43 6f 6c 75 6d 6e  de.  The xColumn
beb0: 20 6d 65 74 68 6f 64 20 6d 75 73 74 20 72 65 74   method must ret
bec0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
bed0: 20 73 75 63 63 65 73 73 2e 0d 0a 20 20 20 20 20   success...     
bee0: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a     /// </para>..
bef0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
bf00: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
bf10: 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68  The xColumn meth
bf20: 6f 64 20 69 73 20 72 65 71 75 69 72 65 64 20 66  od is required f
bf30: 6f 72 20 65 76 65 72 79 20 76 69 72 74 75 61 6c  or every virtual
bf40: 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74   table implement
bf50: 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ation...        
bf60: 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
bf70: 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61       /// </summa
bf80: 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ry>..        ///
bf90: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 43   <param name="pC
bfa0: 75 72 73 6f 72 22 3e 0d 0a 20 20 20 20 20 20 20  ursor">..       
bfb0: 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69 76 65 20   /// The native 
bfc0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
bfd0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
bfe0: 6f 72 20 64 65 72 69 76 65 64 20 73 74 72 75 63  or derived struc
bff0: 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f  ture...        /
c000: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
c010: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
c020: 6e 61 6d 65 3d 22 70 43 6f 6e 74 65 78 74 22 3e  name="pContext">
c030: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
c040: 65 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72  e native pointer
c050: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
c060: 63 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  context structur
c070: 65 20 74 6f 20 62 65 20 75 73 65 64 0d 0a 20 20  e to be used..  
c080: 20 20 20 20 20 20 2f 2f 2f 20 66 6f 72 20 72 65        /// for re
c090: 74 75 72 6e 69 6e 67 20 74 68 65 20 73 70 65 63  turning the spec
c0a0: 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c  ified column val
c0b0: 75 65 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  ue to the SQLite
c0c0: 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 2f   core..        /
c0d0: 2f 2f 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20  // library...   
c0e0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d       /// </param
c0f0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
c100: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69 6e 64 65  param name="inde
c110: 78 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  x">..        ///
c120: 20 54 68 65 20 7a 65 72 6f 2d 62 61 73 65 64 20   The zero-based 
c130: 69 6e 64 65 78 20 63 6f 72 72 65 73 70 6f 6e 64  index correspond
c140: 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  ing to the colum
c150: 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  n containing the
c160: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 76 61  ..        /// va
c170: 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
c180: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ed...        ///
c190: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
c1a0: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
c1b0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20  ..        /// A 
c1c0: 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20  standard SQLite 
c1d0: 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20  return code...  
c1e0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75        /// </retu
c1f0: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51  rns>..        SQ
c200: 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78 43  LiteErrorCode xC
c210: 6f 6c 75 6d 6e 28 0d 0a 20 20 20 20 20 20 20 20  olumn(..        
c220: 20 20 20 20 49 6e 74 50 74 72 20 70 43 75 72 73      IntPtr pCurs
c230: 6f 72 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  or,..           
c240: 20 49 6e 74 50 74 72 20 70 43 6f 6e 74 65 78 74   IntPtr pContext
c250: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ,..            i
c260: 6e 74 20 69 6e 64 65 78 0d 0a 20 20 20 20 20 20  nt index..      
c270: 20 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20 20        );....    
c280: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
c290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c2a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c2b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c2c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
c2d0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d         /// <summ
c2e0: 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ary>..        //
c2f0: 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a  / <para><code>..
c300: 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74 20          /// int 
c310: 28 2a 78 52 6f 77 69 64 29 28 73 71 6c 69 74 65  (*xRowid)(sqlite
c320: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
c330: 43 75 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36  Cur, sqlite_int6
c340: 34 20 2a 70 52 6f 77 69 64 29 3b 0d 0a 20 20 20  4 *pRowid);..   
c350: 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e       /// </code>
c360: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
c370: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
c380: 20 20 20 20 20 2f 2f 2f 20 41 20 73 75 63 63 65       /// A succe
c390: 73 73 66 75 6c 20 69 6e 76 6f 63 61 74 69 6f 6e  ssful invocation
c3a0: 20 6f 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20   of this method 
c3b0: 77 69 6c 6c 20 63 61 75 73 65 20 2a 70 52 6f 77  will cause *pRow
c3c0: 69 64 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20  id to be..      
c3d0: 20 20 2f 2f 2f 20 66 69 6c 6c 65 64 20 77 69 74    /// filled wit
c3e0: 68 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 72  h the rowid of r
c3f0: 6f 77 20 74 68 61 74 20 74 68 65 0d 0a 20 20 20  ow that the..   
c400: 20 20 20 20 20 2f 2f 2f 20 76 69 72 74 75 61 6c       /// virtual
c410: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 70 43   table cursor pC
c420: 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ur is currently 
c430: 70 6f 69 6e 74 69 6e 67 20 61 74 2e 0d 0a 20 20  pointing at...  
c440: 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d        /// This m
c450: 65 74 68 6f 64 20 72 65 74 75 72 6e 73 20 53 51  ethod returns SQ
c460: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
c470: 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ss...        ///
c480: 20 49 74 20 72 65 74 75 72 6e 73 20 61 6e 20 61   It returns an a
c490: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
c4a0: 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
c4b0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
c4c0: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
c4d0: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
c4e0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 52 6f 77      /// The xRow
c4f0: 69 64 20 6d 65 74 68 6f 64 20 69 73 20 72 65 71  id method is req
c500: 75 69 72 65 64 20 66 6f 72 20 65 76 65 72 79 20  uired for every 
c510: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6d  virtual table im
c520: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20  plementation... 
c530: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72         /// </par
c540: 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  a>..        /// 
c550: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
c560: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
c570: 61 6d 65 3d 22 70 43 75 72 73 6f 72 22 3e 0d 0a  ame="pCursor">..
c580: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
c590: 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74  native pointer t
c5a0: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74  o the sqlite3_vt
c5b0: 61 62 5f 63 75 72 73 6f 72 20 64 65 72 69 76 65  ab_cursor derive
c5c0: 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20  d structure...  
c5d0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
c5e0: 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  m>..        /// 
c5f0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 72 6f 77  <param name="row
c600: 49 64 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  Id">..        //
c610: 2f 20 55 70 6f 6e 20 73 75 63 63 65 73 73 2c 20  / Upon success, 
c620: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 6d  this parameter m
c630: 75 73 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20  ust be modified 
c640: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 75  to contain the u
c650: 6e 69 71 75 65 0d 0a 20 20 20 20 20 20 20 20 2f  nique..        /
c660: 2f 2f 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69  // integer row i
c670: 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68  dentifier for th
c680: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 66 6f  e current row fo
c690: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
c6a0: 63 75 72 73 6f 72 2e 0d 0a 20 20 20 20 20 20 20  cursor...       
c6b0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20   /// </param>.. 
c6c0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75         /// <retu
c6d0: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  rns>..        //
c6e0: 2f 20 41 20 73 74 61 6e 64 61 72 64 20 53 51 4c  / A standard SQL
c6f0: 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ite return code.
c700: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
c710: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20  returns>..      
c720: 20 20 53 51 4c 69 74 65 45 72 72 6f 72 43 6f 64    SQLiteErrorCod
c730: 65 20 78 52 6f 77 49 64 28 0d 0a 20 20 20 20 20  e xRowId(..     
c740: 20 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 43         IntPtr pC
c750: 75 72 73 6f 72 2c 0d 0a 20 20 20 20 20 20 20 20  ursor,..        
c760: 20 20 20 20 72 65 66 20 6c 6f 6e 67 20 72 6f 77      ref long row
c770: 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  Id..            
c780: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  );....        //
c790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c7a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c7b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c7c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c7d0: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
c7e0: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
c7f0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
c800: 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20  a><code>..      
c810: 20 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 55 70 64    /// int (*xUpd
c820: 61 74 65 29 28 0d 0a 20 20 20 20 20 20 20 20 2f  ate)(..        /
c830: 2f 2f 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61  //   sqlite3_vta
c840: 62 20 2a 70 56 54 61 62 2c 0d 0a 20 20 20 20 20  b *pVTab,..     
c850: 20 20 20 2f 2f 2f 20 20 20 69 6e 74 20 61 72 67     ///   int arg
c860: 63 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  c,..        /// 
c870: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
c880: 2a 2a 61 72 67 76 2c 0d 0a 20 20 20 20 20 20 20  **argv,..       
c890: 20 2f 2f 2f 20 20 20 73 71 6c 69 74 65 5f 69 6e   ///   sqlite_in
c8a0: 74 36 34 20 2a 70 52 6f 77 69 64 0d 0a 20 20 20  t64 *pRowid..   
c8b0: 20 20 20 20 20 2f 2f 2f 20 29 3b 0d 0a 20 20 20       /// );..   
c8c0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e       /// </code>
c8d0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
c8e0: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
c8f0: 20 20 20 20 20 2f 2f 2f 20 41 6c 6c 20 63 68 61       /// All cha
c900: 6e 67 65 73 20 74 6f 20 61 20 76 69 72 74 75 61  nges to a virtua
c910: 6c 20 74 61 62 6c 65 20 61 72 65 20 6d 61 64 65  l table are made
c920: 20 75 73 69 6e 67 20 74 68 65 20 78 55 70 64 61   using the xUpda
c930: 74 65 20 6d 65 74 68 6f 64 2e 0d 0a 20 20 20 20  te method...    
c940: 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6f 6e 65      /// This one
c950: 20 6d 65 74 68 6f 64 20 63 61 6e 20 62 65 20 75   method can be u
c960: 73 65 64 20 74 6f 20 69 6e 73 65 72 74 2c 20 64  sed to insert, d
c970: 65 6c 65 74 65 2c 20 6f 72 20 75 70 64 61 74 65  elete, or update
c980: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
c990: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
c9a0: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
c9b0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 61 72 67 63      /// The argc
c9c0: 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
c9d0: 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
c9e0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
c9f0: 65 20 61 72 67 76 20 61 72 72 61 79 2e 20 0d 0a  e argv array. ..
ca00: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
ca10: 76 61 6c 75 65 20 6f 66 20 61 72 67 63 20 77 69  value of argc wi
ca20: 6c 6c 20 62 65 20 31 20 66 6f 72 20 61 20 70 75  ll be 1 for a pu
ca30: 72 65 20 64 65 6c 65 74 65 20 6f 70 65 72 61 74  re delete operat
ca40: 69 6f 6e 20 6f 72 20 4e 2b 32 20 66 6f 72 20 61  ion or N+2 for a
ca50: 6e 20 69 6e 73 65 72 74 0d 0a 20 20 20 20 20 20  n insert..      
ca60: 20 20 2f 2f 2f 20 6f 72 20 72 65 70 6c 61 63 65    /// or replace
ca70: 20 6f 72 20 75 70 64 61 74 65 20 77 68 65 72 65   or update where
ca80: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
ca90: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
caa0: 68 65 20 74 61 62 6c 65 2e 20 20 0d 0a 20 20 20  he table.  ..   
cab0: 20 20 20 20 20 2f 2f 2f 20 49 6e 20 74 68 65 20       /// In the 
cac0: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
cad0: 65 2c 20 4e 20 69 6e 63 6c 75 64 65 73 20 61 6e  e, N includes an
cae0: 79 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73  y hidden columns
caf0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
cb00: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
cb10: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
cb20: 20 20 20 20 2f 2f 2f 20 45 76 65 72 79 20 61 72      /// Every ar
cb30: 67 76 20 65 6e 74 72 79 20 77 69 6c 6c 20 68 61  gv entry will ha
cb40: 76 65 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  ve a non-NULL va
cb50: 6c 75 65 20 69 6e 20 43 20 62 75 74 20 6d 61 79  lue in C but may
cb60: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 0d 0a 20   contain the .. 
cb70: 20 20 20 20 20 20 20 2f 2f 2f 20 53 51 4c 20 76         /// SQL v
cb80: 61 6c 75 65 20 4e 55 4c 4c 2e 20 20 49 6e 20 6f  alue NULL.  In o
cb90: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 69  ther words, it i
cba0: 73 20 61 6c 77 61 79 73 20 74 72 75 65 20 74 68  s always true th
cbb0: 61 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  at..        /// 
cbc0: 3c 21 5b 43 44 41 54 41 5b 3c 74 74 3e 5d 5d 3e  <![CDATA[<tt>]]>
cbd0: 61 72 67 76 5b 69 5d 21 3d 30 3c 21 5b 43 44 41  argv[i]!=0<![CDA
cbe0: 54 41 5b 3c 2f 74 74 3e 5d 5d 3e 20 66 6f 72 20  TA[</tt>]]> for 
cbf0: 3c 21 5b 43 44 41 54 41 5b 3c 62 3e 5d 5d 3e 69  <![CDATA[<b>]]>i
cc00: 3c 21 5b 43 44 41 54 41 5b 3c 2f 62 3e 5d 5d 3e  <![CDATA[</b>]]>
cc10: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 3c   between 0 and <
cc20: 21 5b 43 44 41 54 41 5b 3c 74 74 3e 5d 5d 3e 61  ![CDATA[<tt>]]>a
cc30: 72 67 63 2d 31 3c 21 5b 43 44 41 54 41 5b 3c 2f  rgc-1<![CDATA[</
cc40: 74 74 3e 5d 5d 3e 2e 0d 0a 20 20 20 20 20 20 20  tt>]]>...       
cc50: 20 2f 2f 2f 20 48 6f 77 65 76 65 72 2c 20 69 74   /// However, it
cc60: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
cc70: 73 65 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20  se that..       
cc80: 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 74   /// <![CDATA[<t
cc90: 74 3e 5d 5d 3e 73 71 6c 69 74 65 33 5f 76 61 6c  t>]]>sqlite3_val
cca0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29  ue_type(argv[i])
ccb0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 3c 21 5b  ==SQLITE_NULL<![
ccc0: 43 44 41 54 41 5b 3c 2f 74 74 3e 5d 5d 3e 2e 0d  CDATA[</tt>]]>..
ccd0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
cce0: 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
ccf0: 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20  / <para>..      
cd00: 20 20 2f 2f 2f 20 54 68 65 20 61 72 67 76 5b 30    /// The argv[0
cd10: 5d 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  ] parameter is t
cd20: 68 65 20 72 6f 77 69 64 20 6f 66 20 61 20 72 6f  he rowid of a ro
cd30: 77 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  w in the virtual
cd40: 20 74 61 62 6c 65 20 0d 0a 20 20 20 20 20 20 20   table ..       
cd50: 20 2f 2f 2f 20 74 6f 20 62 65 20 64 65 6c 65 74   /// to be delet
cd60: 65 64 2e 20 49 66 20 61 72 67 76 5b 30 5d 20 69  ed. If argv[0] i
cd70: 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 74  s an SQL NULL, t
cd80: 68 65 6e 20 6e 6f 20 64 65 6c 65 74 69 6f 6e 20  hen no deletion 
cd90: 6f 63 63 75 72 73 2e 0d 0a 20 20 20 20 20 20 20  occurs...       
cda0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
cdb0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
cdc0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
cdd0: 65 20 61 72 67 76 5b 31 5d 20 70 61 72 61 6d 65  e argv[1] parame
cde0: 74 65 72 20 69 73 20 74 68 65 20 72 6f 77 69 64  ter is the rowid
cdf0: 20 6f 66 20 61 20 6e 65 77 20 72 6f 77 20 74 6f   of a new row to
ce00: 20 62 65 20 69 6e 73 65 72 74 65 64 20 0d 0a 20   be inserted .. 
ce10: 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74 6f 20         /// into 
ce20: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
ce30: 65 2e 20 49 66 20 61 72 67 76 5b 31 5d 20 69 73  e. If argv[1] is
ce40: 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 74 68   an SQL NULL, th
ce50: 65 6e 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  en the implement
ce60: 61 74 69 6f 6e 20 0d 0a 20 20 20 20 20 20 20 20  ation ..        
ce70: 2f 2f 2f 20 6d 75 73 74 20 63 68 6f 6f 73 65 20  /// must choose 
ce80: 61 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  a rowid for the 
ce90: 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20 72  newly inserted r
cea0: 6f 77 2e 20 53 75 62 73 65 71 75 65 6e 74 20 61  ow. Subsequent a
ceb0: 72 67 76 5b 5d 20 0d 0a 20 20 20 20 20 20 20 20  rgv[] ..        
cec0: 2f 2f 2f 20 65 6e 74 72 69 65 73 20 63 6f 6e 74  /// entries cont
ced0: 61 69 6e 20 76 61 6c 75 65 73 20 6f 66 20 74 68  ain values of th
cee0: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
cef0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
cf00: 69 6e 20 74 68 65 20 0d 0a 20 20 20 20 20 20 20  in the ..       
cf10: 20 2f 2f 2f 20 6f 72 64 65 72 20 74 68 61 74 20   /// order that 
cf20: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 77 65 72 65  the columns were
cf30: 20 64 65 63 6c 61 72 65 64 2e 20 54 68 65 20 6e   declared. The n
cf40: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
cf50: 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20 20 20 2f   will..        /
cf60: 2f 2f 20 6d 61 74 63 68 20 74 68 65 20 74 61 62  // match the tab
cf70: 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  le declaration t
cf80: 68 61 74 20 74 68 65 20 78 43 6f 6e 6e 65 63 74  hat the xConnect
cf90: 20 6f 72 20 78 43 72 65 61 74 65 20 6d 65 74 68   or xCreate meth
cfa0: 6f 64 20 6d 61 64 65 20 0d 0a 20 20 20 20 20 20  od made ..      
cfb0: 20 20 2f 2f 2f 20 75 73 69 6e 67 20 74 68 65 20    /// using the 
cfc0: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
cfd0: 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 20 41 6c  vtab() call.  Al
cfe0: 6c 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73  l hidden columns
cff0: 20 61 72 65 20 69 6e 63 6c 75 64 65 64 2e 0d 0a   are included...
d000: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
d010: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
d020: 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
d030: 20 2f 2f 2f 20 57 68 65 6e 20 64 6f 69 6e 67 20   /// When doing 
d040: 61 6e 20 69 6e 73 65 72 74 20 77 69 74 68 6f 75  an insert withou
d050: 74 20 61 20 72 6f 77 69 64 20 28 61 72 67 63 3e  t a rowid (argc>
d060: 31 2c 20 61 72 67 76 5b 31 5d 20 69 73 20 61 6e  1, argv[1] is an
d070: 20 53 51 4c 20 4e 55 4c 4c 29 2c 0d 0a 20 20 20   SQL NULL),..   
d080: 20 20 20 20 20 2f 2f 2f 20 6f 6e 20 61 20 76 69       /// on a vi
d090: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74  rtual table that
d0a0: 20 75 73 65 73 20 52 4f 57 49 44 20 28 62 75 74   uses ROWID (but
d0b0: 20 6e 6f 74 20 6f 6e 20 61 20 57 49 54 48 4f 55   not on a WITHOU
d0c0: 54 20 52 4f 57 49 44 20 76 69 72 74 75 61 6c 20  T ROWID virtual 
d0d0: 74 61 62 6c 65 29 2c 0d 0a 20 20 20 20 20 20 20  table),..       
d0e0: 20 2f 2f 2f 20 74 68 65 20 69 6d 70 6c 65 6d 65   /// the impleme
d0f0: 6e 74 61 74 69 6f 6e 20 6d 75 73 74 20 73 65 74  ntation must set
d100: 20 2a 70 52 6f 77 69 64 20 74 6f 20 74 68 65 20   *pRowid to the 
d110: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65 77  rowid of the new
d120: 6c 79 20 69 6e 73 65 72 74 65 64 20 72 6f 77 3b  ly inserted row;
d130: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74   ..        /// t
d140: 68 69 73 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  his will become 
d150: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
d160: 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ed by the sqlite
d170: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
d180: 77 69 64 28 29 0d 0a 20 20 20 20 20 20 20 20 2f  wid()..        /
d190: 2f 2f 20 66 75 6e 63 74 69 6f 6e 2e 20 53 65 74  // function. Set
d1a0: 74 69 6e 67 20 74 68 69 73 20 76 61 6c 75 65 20  ting this value 
d1b0: 69 6e 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  in all the other
d1c0: 20 63 61 73 65 73 20 69 73 20 61 20 68 61 72 6d   cases is a harm
d1d0: 6c 65 73 73 20 6e 6f 2d 6f 70 3b 0d 0a 20 20 20  less no-op;..   
d1e0: 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 53 51 4c       /// the SQL
d1f0: 69 74 65 20 65 6e 67 69 6e 65 20 69 67 6e 6f 72  ite engine ignor
d200: 65 73 20 74 68 65 20 2a 70 52 6f 77 69 64 20 72  es the *pRowid r
d210: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 66 20 61  eturn value if a
d220: 72 67 63 3d 3d 31 20 6f 72 20 0d 0a 20 20 20 20  rgc==1 or ..    
d230: 20 20 20 20 2f 2f 2f 20 61 72 67 76 5b 31 5d 20      /// argv[1] 
d240: 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 4e 55  is not an SQL NU
d250: 4c 4c 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  LL...        ///
d260: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
d270: 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20    /// <para>..  
d280: 20 20 20 20 20 20 2f 2f 2f 20 45 61 63 68 20 63        /// Each c
d290: 61 6c 6c 20 74 6f 20 78 55 70 64 61 74 65 20 77  all to xUpdate w
d2a0: 69 6c 6c 20 66 61 6c 6c 20 69 6e 74 6f 20 6f 6e  ill fall into on
d2b0: 65 20 6f 66 20 63 61 73 65 73 20 73 68 6f 77 6e  e of cases shown
d2c0: 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 20   below...       
d2d0: 20 2f 2f 2f 20 4e 6f 74 20 74 68 61 74 20 72 65   /// Not that re
d2e0: 66 65 72 65 6e 63 65 73 20 74 6f 20 3c 21 5b 43  ferences to <![C
d2f0: 44 41 54 41 5b 3c 62 3e 5d 5d 3e 61 72 67 76 5b  DATA[<b>]]>argv[
d300: 69 5d 3c 21 5b 43 44 41 54 41 5b 3c 2f 62 3e 5d  i]<![CDATA[</b>]
d310: 5d 3e 20 6d 65 61 6e 20 74 68 65 20 53 51 4c 20  ]> mean the SQL 
d320: 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 2f  value..        /
d330: 2f 2f 20 68 65 6c 64 20 77 69 74 68 69 6e 20 74  // held within t
d340: 68 65 20 61 72 67 76 5b 69 5d 20 6f 62 6a 65 63  he argv[i] objec
d350: 74 2c 20 6e 6f 74 20 74 68 65 20 61 72 67 76 5b  t, not the argv[
d360: 69 5d 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  i]..        /// 
d370: 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0d 0a  object itself...
d380: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
d390: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
d3a0: 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20   <para><code>.. 
d3b0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44         /// <![CD
d3c0: 41 54 41 5b 3c 64 6c 3e 5d 5d 3e 0d 0a 20 20 20  ATA[<dl>]]>..   
d3d0: 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54       /// <![CDAT
d3e0: 41 5b 3c 64 74 3e 5d 5d 3e 3c 21 5b 43 44 41 54  A[<dt>]]><![CDAT
d3f0: 41 5b 3c 62 3e 5d 5d 3e 61 72 67 63 20 3d 20 31  A[<b>]]>argc = 1
d400: 20 3c 21 5b 43 44 41 54 41 5b 3c 62 72 3e 5d 5d   <![CDATA[<br>]]
d410: 3e 20 61 72 67 76 5b 30 5d 20 26 23 38 38 30 30  > argv[0] &#8800
d420: 3b 20 4e 55 4c 4c 3c 21 5b 43 44 41 54 41 5b 3c  ; NULL<![CDATA[<
d430: 2f 62 3e 5d 5d 3e 0d 0a 20 20 20 20 20 20 20 20  /b>]]>..        
d440: 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f 64  /// <![CDATA[</d
d450: 74 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c 64  t>]]><![CDATA[<d
d460: 64 3e 5d 5d 3e 0d 0a 20 20 20 20 20 20 20 20 2f  d>]]>..        /
d470: 2f 2f 20 44 45 4c 45 54 45 3a 20 54 68 65 20 73  // DELETE: The s
d480: 69 6e 67 6c 65 20 72 6f 77 20 77 69 74 68 20 72  ingle row with r
d490: 6f 77 69 64 20 6f 72 20 50 52 49 4d 41 52 59 20  owid or PRIMARY 
d4a0: 4b 45 59 20 65 71 75 61 6c 20 74 6f 20 61 72 67  KEY equal to arg
d4b0: 76 5b 30 5d 20 69 73 20 64 65 6c 65 74 65 64 2e  v[0] is deleted.
d4c0: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 4e   ..        /// N
d4d0: 6f 20 69 6e 73 65 72 74 20 6f 63 63 75 72 73 2e  o insert occurs.
d4e0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21  ..        /// <!
d4f0: 5b 43 44 41 54 41 5b 3c 2f 64 64 3e 5d 5d 3e 3c  [CDATA[</dd>]]><
d500: 21 5b 43 44 41 54 41 5b 3c 64 74 3e 5d 5d 3e 3c  ![CDATA[<dt>]]><
d510: 21 5b 43 44 41 54 41 5b 3c 62 3e 5d 5d 3e 61 72  ![CDATA[<b>]]>ar
d520: 67 63 20 26 67 74 3b 20 31 20 3c 21 5b 43 44 41  gc &gt; 1 <![CDA
d530: 54 41 5b 3c 62 72 3e 5d 5d 3e 20 61 72 67 76 5b  TA[<br>]]> argv[
d540: 30 5d 20 3d 20 4e 55 4c 4c 3c 21 5b 43 44 41 54  0] = NULL<![CDAT
d550: 41 5b 3c 2f 62 3e 5d 5d 3e 0d 0a 20 20 20 20 20  A[</b>]]>..     
d560: 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b     /// <![CDATA[
d570: 3c 2f 64 74 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41  </dt>]]><![CDATA
d580: 5b 3c 64 64 3e 5d 5d 3e 0d 0a 20 20 20 20 20 20  [<dd>]]>..      
d590: 20 20 2f 2f 2f 20 49 4e 53 45 52 54 3a 20 41 20    /// INSERT: A 
d5a0: 6e 65 77 20 72 6f 77 20 69 73 20 69 6e 73 65 72  new row is inser
d5b0: 74 65 64 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20  ted with column 
d5c0: 76 61 6c 75 65 73 20 74 61 6b 65 6e 20 66 72 6f  values taken fro
d5d0: 6d 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61  m..        /// a
d5e0: 72 67 76 5b 32 5d 20 61 6e 64 20 66 6f 6c 6c 6f  rgv[2] and follo
d5f0: 77 69 6e 67 2e 20 20 49 6e 20 61 20 72 6f 77 69  wing.  In a rowi
d600: 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  d virtual table,
d610: 20 69 66 20 61 72 67 76 5b 31 5d 20 69 73 20 61   if argv[1] is a
d620: 6e 20 53 51 4c 20 4e 55 4c 4c 2c 0d 0a 20 20 20  n SQL NULL,..   
d630: 20 20 20 20 20 2f 2f 2f 20 74 68 65 6e 20 61 20       /// then a 
d640: 6e 65 77 20 75 6e 69 71 75 65 20 72 6f 77 69 64  new unique rowid
d650: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 75   is generated au
d660: 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 54 68  tomatically.  Th
d670: 65 20 61 72 67 76 5b 31 5d 20 77 69 6c 6c 20 62  e argv[1] will b
d680: 65 20 4e 55 4c 4c 0d 0a 20 20 20 20 20 20 20 20  e NULL..        
d690: 2f 2f 2f 20 66 6f 72 20 61 20 57 49 54 48 4f 55  /// for a WITHOU
d6a0: 54 20 52 4f 57 49 44 20 76 69 72 74 75 61 6c 20  T ROWID virtual 
d6b0: 74 61 62 6c 65 2c 20 69 6e 20 77 68 69 63 68 20  table, in which 
d6c0: 63 61 73 65 20 74 68 65 20 69 6d 70 6c 65 6d 65  case the impleme
d6d0: 6e 74 61 74 69 6f 6e 20 73 68 6f 75 6c 64 0d 0a  ntation should..
d6e0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 61 6b 65          /// take
d6f0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d700: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
d710: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 75  appropriate colu
d720: 6d 6e 20 69 6e 20 61 72 67 76 5b 32 5d 20 61 6e  mn in argv[2] an
d730: 64 20 66 6f 6c 6c 6f 77 69 6e 67 2e 0d 0a 20 20  d following...  
d740: 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41        /// <![CDA
d750: 54 41 5b 3c 2f 64 64 3e 5d 5d 3e 3c 21 5b 43 44  TA[</dd>]]><![CD
d760: 41 54 41 5b 3c 64 74 3e 5d 5d 3e 3c 21 5b 43 44  ATA[<dt>]]><![CD
d770: 41 54 41 5b 3c 62 3e 5d 5d 3e 61 72 67 63 20 26  ATA[<b>]]>argc &
d780: 67 74 3b 20 31 20 3c 21 5b 43 44 41 54 41 5b 3c  gt; 1 <![CDATA[<
d790: 62 72 3e 5d 5d 3e 20 61 72 67 76 5b 30 5d 20 26  br>]]> argv[0] &
d7a0: 23 38 38 30 30 3b 20 4e 55 4c 4c 20 3c 21 5b 43  #8800; NULL <![C
d7b0: 44 41 54 41 5b 3c 62 72 3e 5d 5d 3e 20 61 72 67  DATA[<br>]]> arg
d7c0: 76 5b 30 5d 20 3d 20 61 72 67 76 5b 31 5d 3c 21  v[0] = argv[1]<!
d7d0: 5b 43 44 41 54 41 5b 3c 2f 62 3e 5d 5d 3e 0d 0a  [CDATA[</b>]]>..
d7e0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b 43          /// <![C
d7f0: 44 41 54 41 5b 3c 2f 64 74 3e 5d 5d 3e 3c 21 5b  DATA[</dt>]]><![
d800: 43 44 41 54 41 5b 3c 64 64 3e 5d 5d 3e 0d 0a 20  CDATA[<dd>]]>.. 
d810: 20 20 20 20 20 20 20 2f 2f 2f 20 55 50 44 41 54         /// UPDAT
d820: 45 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  E:..        /// 
d830: 54 68 65 20 72 6f 77 20 77 69 74 68 20 72 6f 77  The row with row
d840: 69 64 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  id or PRIMARY KE
d850: 59 20 61 72 67 76 5b 30 5d 20 69 73 20 75 70 64  Y argv[0] is upd
d860: 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 76 61  ated with new va
d870: 6c 75 65 73 20 0d 0a 20 20 20 20 20 20 20 20 2f  lues ..        /
d880: 2f 2f 20 69 6e 20 61 72 67 76 5b 32 5d 20 61 6e  // in argv[2] an
d890: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  d following para
d8a0: 6d 65 74 65 72 73 2e 0d 0a 20 20 20 20 20 20 20  meters...       
d8b0: 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41 5b 3c 2f   /// <![CDATA[</
d8c0: 64 64 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c  dd>]]><![CDATA[<
d8d0: 64 74 3e 5d 5d 3e 3c 21 5b 43 44 41 54 41 5b 3c  dt>]]><![CDATA[<
d8e0: 62 3e 5d 5d 3e 61 72 67 63 20 26 67 74 3b 20 31  b>]]>argc &gt; 1
d8f0: 20 3c 21 5b 43 44 41 54 41 5b 3c 62 72 3e 5d 5d   <![CDATA[<br>]]
d900: 3e 20 61 72 67 76 5b 30 5d 20 26 23 38 38 30 30  > argv[0] &#8800
d910: 3b 20 4e 55 4c 4c 20 3c 21 5b 43 44 41 54 41 5b  ; NULL <![CDATA[
d920: 3c 62 72 3e 5d 5d 3e 20 61 72 67 76 5b 30 5d 20  <br>]]> argv[0] 
d930: 26 23 38 38 30 30 3b 20 61 72 67 76 5b 31 5d 3c  &#8800; argv[1]<
d940: 21 5b 43 44 41 54 41 5b 3c 2f 62 3e 5d 5d 3e 0d  ![CDATA[</b>]]>.
d950: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 21 5b  .        /// <![
d960: 43 44 41 54 41 5b 3c 2f 64 74 3e 5d 5d 3e 3c 21  CDATA[</dt>]]><!
d970: 5b 43 44 41 54 41 5b 3c 64 64 3e 5d 5d 3e 0d 0a  [CDATA[<dd>]]>..
d980: 20 20 20 20 20 20 20 20 2f 2f 2f 20 55 50 44 41          /// UPDA
d990: 54 45 20 77 69 74 68 20 72 6f 77 69 64 20 6f 72  TE with rowid or
d9a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 68 61   PRIMARY KEY cha
d9b0: 6e 67 65 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  nge:..        //
d9c0: 2f 20 54 68 65 20 72 6f 77 20 77 69 74 68 20 72  / The row with r
d9d0: 6f 77 69 64 20 6f 72 20 50 52 49 4d 41 52 59 20  owid or PRIMARY 
d9e0: 4b 45 59 20 61 72 67 76 5b 30 5d 20 69 73 20 75  KEY argv[0] is u
d9f0: 70 64 61 74 65 64 20 77 69 74 68 20 0d 0a 20 20  pdated with ..  
da00: 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 72 6f        /// the ro
da10: 77 69 64 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  wid or PRIMARY K
da20: 45 59 20 69 6e 20 61 72 67 76 5b 31 5d 20 0d 0a  EY in argv[1] ..
da30: 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 6e 64 20          /// and 
da40: 6e 65 77 20 76 61 6c 75 65 73 20 69 6e 20 61 72  new values in ar
da50: 67 76 5b 32 5d 20 61 6e 64 20 66 6f 6c 6c 6f 77  gv[2] and follow
da60: 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 2e 20  ing parameters. 
da70: 54 68 69 73 20 77 69 6c 6c 20 6f 63 63 75 72 20  This will occur 
da80: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 77 68  ..        /// wh
da90: 65 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  en an SQL statem
daa0: 65 6e 74 20 75 70 64 61 74 65 73 20 61 20 72 6f  ent updates a ro
dab0: 77 69 64 2c 20 61 73 20 69 6e 20 74 68 65 20 73  wid, as in the s
dac0: 74 61 74 65 6d 65 6e 74 3a 0d 0a 20 20 20 20 20  tatement:..     
dad0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f     /// <para><co
dae0: 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  de>..        ///
daf0: 20 20 20 20 55 50 44 41 54 45 20 74 61 62 6c 65      UPDATE table
db00: 20 53 45 54 20 72 6f 77 69 64 3d 72 6f 77 69 64   SET rowid=rowid
db10: 2b 31 20 57 48 45 52 45 20 2e 2e 2e 3b 20 0d 0a  +1 WHERE ...; ..
db20: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f          /// </co
db30: 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  de></para>..    
db40: 20 20 20 20 2f 2f 2f 20 3c 21 5b 43 44 41 54 41      /// <![CDATA
db50: 5b 3c 2f 64 64 3e 5d 5d 3e 3c 21 5b 43 44 41 54  [</dd>]]><![CDAT
db60: 41 5b 3c 2f 64 6c 3e 5d 5d 3e 0d 0a 20 20 20 20  A[</dl>]]>..    
db70: 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c      /// </code><
db80: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
db90: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
dba0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 55 70 64      /// The xUpd
dbb0: 61 74 65 20 6d 65 74 68 6f 64 20 6d 75 73 74 20  ate method must 
dbc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dbd0: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
dbe0: 69 74 20 69 73 0d 0a 20 20 20 20 20 20 20 20 2f  it is..        /
dbf0: 2f 2f 20 73 75 63 63 65 73 73 66 75 6c 2e 20 20  // successful.  
dc00: 49 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  If a failure occ
dc10: 75 72 73 2c 20 74 68 65 20 78 55 70 64 61 74 65  urs, the xUpdate
dc20: 20 6d 75 73 74 20 72 65 74 75 72 6e 20 61 6e 20   must return an 
dc30: 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20 20  appropriate..   
dc40: 20 20 20 20 20 2f 2f 2f 20 65 72 72 6f 72 20 63       /// error c
dc50: 6f 64 65 2e 20 20 4f 6e 20 61 20 66 61 69 6c 75  ode.  On a failu
dc60: 72 65 2c 20 74 68 65 20 70 56 54 61 62 2d 3e 7a  re, the pVTab->z
dc70: 45 72 72 4d 73 67 20 65 6c 65 6d 65 6e 74 20 6d  ErrMsg element m
dc80: 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 0d 0a 20  ay optionally.. 
dc90: 20 20 20 20 20 20 20 2f 2f 2f 20 62 65 20 72 65         /// be re
dca0: 70 6c 61 63 65 64 20 77 69 74 68 20 65 72 72 6f  placed with erro
dcb0: 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 73  r message text s
dcc0: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
dcd0: 61 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 53  allocated from S
dce0: 51 4c 69 74 65 20 0d 0a 20 20 20 20 20 20 20 20  QLite ..        
dcf0: 2f 2f 2f 20 75 73 69 6e 67 20 66 75 6e 63 74 69  /// using functi
dd00: 6f 6e 73 20 73 75 63 68 20 61 73 20 73 71 6c 69  ons such as sqli
dd10: 74 65 33 5f 6d 70 72 69 6e 74 66 28 29 20 6f 72  te3_mprintf() or
dd20: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
dd30: 29 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  )...        /// 
dd40: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
dd50: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
dd60: 20 20 20 20 20 2f 2f 2f 20 49 66 20 74 68 65 20       /// If the 
dd70: 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20 76  xUpdate method v
dd80: 69 6f 6c 61 74 65 73 20 73 6f 6d 65 20 63 6f 6e  iolates some con
dd90: 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 76  straint of the v
dda0: 69 72 74 75 61 6c 20 74 61 62 6c 65 0d 0a 20 20  irtual table..  
ddb0: 20 20 20 20 20 20 2f 2f 2f 20 28 69 6e 63 6c 75        /// (inclu
ddc0: 64 69 6e 67 2c 20 62 75 74 20 6e 6f 74 20 6c 69  ding, but not li
ddd0: 6d 69 74 65 64 20 74 6f 2c 20 61 74 74 65 6d 70  mited to, attemp
dde0: 74 69 6e 67 20 74 6f 20 73 74 6f 72 65 20 61 20  ting to store a 
ddf0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 77 72 6f  value of the wro
de00: 6e 67 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ng ..        ///
de10: 20 64 61 74 61 74 79 70 65 2c 20 61 74 74 65 6d   datatype, attem
de20: 70 74 69 6e 67 20 74 6f 20 73 74 6f 72 65 20 61  pting to store a
de30: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 74   value that is t
de40: 6f 6f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  oo..        /// 
de50: 6c 61 72 67 65 20 6f 72 20 74 6f 6f 20 73 6d 61  large or too sma
de60: 6c 6c 2c 20 6f 72 20 61 74 74 65 6d 70 74 69 6e  ll, or attemptin
de70: 67 20 74 6f 20 63 68 61 6e 67 65 20 61 20 72 65  g to change a re
de80: 61 64 2d 6f 6e 6c 79 20 76 61 6c 75 65 29 20 74  ad-only value) t
de90: 68 65 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20  hen the..       
dea0: 20 2f 2f 2f 20 78 55 70 64 61 74 65 20 6d 75 73   /// xUpdate mus
deb0: 74 20 66 61 69 6c 20 77 69 74 68 20 61 6e 20 61  t fail with an a
dec0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
ded0: 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20   code...        
dee0: 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
def0: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
df00: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 49 66 20  .        /// If 
df10: 74 68 65 20 78 55 70 64 61 74 65 20 6d 65 74 68  the xUpdate meth
df20: 6f 64 20 69 73 20 70 65 72 66 6f 72 6d 69 6e 67  od is performing
df30: 20 61 6e 20 55 50 44 41 54 45 2c 20 74 68 65 6e   an UPDATE, then
df40: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 73 71  ..        /// sq
df50: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 6f 63 68  lite3_value_noch
df60: 61 6e 67 65 28 58 29 20 63 61 6e 20 62 65 20 75  ange(X) can be u
df70: 73 65 64 20 74 6f 20 64 69 73 63 6f 76 65 72 20  sed to discover 
df80: 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0d 0a 20  which columns.. 
df90: 20 20 20 20 20 20 20 2f 2f 2f 20 6f 66 20 74 68         /// of th
dfa0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
dfb0: 77 65 72 65 20 61 63 74 75 61 6c 6c 79 20 6d 6f  were actually mo
dfc0: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 55 50  dified by the UP
dfd0: 44 41 54 45 0d 0a 20 20 20 20 20 20 20 20 2f 2f  DATE..        //
dfe0: 2f 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  / statement.  Th
dff0: 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  e sqlite3_value_
e000: 6e 6f 63 68 61 6e 67 65 28 58 29 20 69 6e 74 65  nochange(X) inte
e010: 72 66 61 63 65 20 72 65 74 75 72 6e 73 0d 0a 20  rface returns.. 
e020: 20 20 20 20 20 20 20 2f 2f 2f 20 74 72 75 65 20         /// true 
e030: 66 6f 72 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  for columns that
e040: 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0d   do not change..
e050: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 4f 6e 20  .        /// On 
e060: 65 76 65 72 79 20 55 50 44 41 54 45 2c 20 53 51  every UPDATE, SQ
e070: 4c 69 74 65 20 77 69 6c 6c 20 66 69 72 73 74 20  Lite will first 
e080: 69 6e 76 6f 6b 65 0d 0a 20 20 20 20 20 20 20 20  invoke..        
e090: 2f 2f 2f 20 78 43 6f 6c 75 6d 6e 20 73 65 70 61  /// xColumn sepa
e0a0: 72 61 74 65 6c 79 20 66 6f 72 20 65 61 63 68 20  rately for each 
e0b0: 75 6e 63 68 61 6e 67 69 6e 67 20 63 6f 6c 75 6d  unchanging colum
e0c0: 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  n in the table t
e0d0: 6f 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  o ..        /// 
e0e0: 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
e0f0: 20 66 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e   for that column
e100: 2e 20 20 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d  .  The xColumn m
e110: 65 74 68 6f 64 20 63 61 6e 0d 0a 20 20 20 20 20  ethod can..     
e120: 20 20 20 2f 2f 2f 20 63 68 65 63 6b 20 74 6f 20     /// check to 
e130: 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
e140: 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  n is unchanged a
e150: 74 20 74 68 65 20 53 51 4c 20 6c 65 76 65 6c 0d  t the SQL level.
e160: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 62 79 20  .        /// by 
e170: 69 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65 33  invoking sqlite3
e180: 5f 76 74 61 62 5f 6e 6f 63 68 61 6e 67 65 28 29  _vtab_nochange()
e190: 2e 20 20 49 66 20 78 43 6f 6c 75 6d 6e 20 73 65  .  If xColumn se
e1a0: 65 73 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20  es that..       
e1b0: 20 2f 2f 2f 20 74 68 65 20 63 6f 6c 75 6d 6e 20   /// the column 
e1c0: 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 6d 6f 64  is not being mod
e1d0: 69 66 69 65 64 2c 20 69 74 20 73 68 6f 75 6c 64  ified, it should
e1e0: 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
e1f0: 73 65 74 74 69 6e 67 20 0d 0a 20 20 20 20 20 20  setting ..      
e200: 20 20 2f 2f 2f 20 61 20 72 65 73 75 6c 74 20 75    /// a result u
e210: 73 69 6e 67 20 6f 6e 65 20 6f 66 20 74 68 65 20  sing one of the 
e220: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 78  sqlite3_result_x
e230: 78 78 78 78 28 29 0d 0a 20 20 20 20 20 20 20 20  xxxx()..        
e240: 2f 2f 2f 20 69 6e 74 65 72 66 61 63 65 73 2e 20  /// interfaces. 
e250: 20 4f 6e 6c 79 20 69 6e 20 74 68 61 74 20 63 61   Only in that ca
e260: 73 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  se sqlite3_value
e270: 5f 6e 6f 63 68 61 6e 67 65 28 29 20 77 69 6c 6c  _nochange() will
e280: 20 62 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f   be..        ///
e290: 20 74 72 75 65 20 77 69 74 68 69 6e 20 74 68 65   true within the
e2a0: 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 2e   xUpdate method.
e2b0: 20 20 49 66 20 78 43 6f 6c 75 6d 6e 20 64 6f 65    If xColumn doe
e2c0: 73 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69  s..        /// i
e2d0: 6e 76 6f 6b 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  nvoke one or mor
e2e0: 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  e sqlite3_result
e2f0: 5f 78 78 78 78 78 28 29 0d 0a 20 20 20 20 20 20  _xxxxx()..      
e300: 20 20 2f 2f 2f 20 69 6e 74 65 72 66 61 63 65 73    /// interfaces
e310: 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 75 6e  , then SQLite un
e320: 64 65 72 73 74 61 6e 64 73 20 74 68 61 74 20 61  derstands that a
e330: 73 20 61 20 63 68 61 6e 67 65 20 69 6e 20 74 68  s a change in th
e340: 65 20 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20  e value..       
e350: 20 2f 2f 2f 20 6f 66 20 74 68 65 20 63 6f 6c 75   /// of the colu
e360: 6d 6e 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  mn and the sqlit
e370: 65 33 5f 76 61 6c 75 65 5f 6e 6f 63 68 61 6e 67  e3_value_nochang
e380: 65 28 29 20 63 61 6c 6c 20 66 6f 72 20 74 68 61  e() call for tha
e390: 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 63  t..        /// c
e3a0: 6f 6c 75 6d 6e 20 77 69 74 68 69 6e 20 78 55 70  olumn within xUp
e3b0: 64 61 74 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  date will return
e3c0: 20 66 61 6c 73 65 2e 0d 0a 20 20 20 20 20 20 20   false...       
e3d0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
e3e0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
e3f0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
e400: 65 72 65 20 6d 69 67 68 74 20 62 65 20 6f 6e 65  ere might be one
e410: 20 6f 72 20 6d 6f 72 65 20 73 71 6c 69 74 65 33   or more sqlite3
e420: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 6f 62 6a  _vtab_cursor obj
e430: 65 63 74 73 20 6f 70 65 6e 20 61 6e 64 20 69 6e  ects open and in
e440: 20 75 73 65 20 0d 0a 20 20 20 20 20 20 20 20 2f   use ..        /
e450: 2f 2f 20 6f 6e 20 74 68 65 20 76 69 72 74 75 61  // on the virtua
e460: 6c 20 74 61 62 6c 65 20 69 6e 73 74 61 6e 63 65  l table instance
e470: 20 61 6e 64 20 70 65 72 68 61 70 73 20 65 76 65   and perhaps eve
e480: 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20 6f 66 20  n on the row of 
e490: 74 68 65 20 76 69 72 74 75 61 6c 0d 0a 20 20 20  the virtual..   
e4a0: 20 20 20 20 20 2f 2f 2f 20 74 61 62 6c 65 20 77       /// table w
e4b0: 68 65 6e 20 74 68 65 20 78 55 70 64 61 74 65 20  hen the xUpdate 
e4c0: 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65  method is invoke
e4d0: 64 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  d.  The implemen
e4e0: 74 61 74 69 6f 6e 20 6f 66 0d 0a 20 20 20 20 20  tation of..     
e4f0: 20 20 20 2f 2f 2f 20 78 55 70 64 61 74 65 20 6d     /// xUpdate m
e500: 75 73 74 20 62 65 20 70 72 65 70 61 72 65 64 20  ust be prepared 
e510: 66 6f 72 20 61 74 74 65 6d 70 74 73 20 74 6f 20  for attempts to 
e520: 64 65 6c 65 74 65 20 6f 72 20 6d 6f 64 69 66 79  delete or modify
e530: 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
e540: 6c 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  le..        /// 
e550: 6f 75 74 20 66 72 6f 6d 20 6f 74 68 65 72 20 65  out from other e
e560: 78 69 73 74 69 6e 67 20 63 75 72 73 6f 72 73 2e  xisting cursors.
e570: 20 20 49 66 20 74 68 65 20 76 69 72 74 75 61 6c    If the virtual
e580: 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 61 63   table cannot ac
e590: 63 6f 6d 6d 6f 64 61 74 65 0d 0a 20 20 20 20 20  commodate..     
e5a0: 20 20 20 2f 2f 2f 20 73 75 63 68 20 63 68 61 6e     /// such chan
e5b0: 67 65 73 2c 20 74 68 65 20 78 55 70 64 61 74 65  ges, the xUpdate
e5c0: 20 6d 65 74 68 6f 64 20 6d 75 73 74 20 72 65 74   method must ret
e5d0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
e5e0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
e5f0: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
e600: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
e610: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 78 55 70       /// The xUp
e620: 64 61 74 65 20 6d 65 74 68 6f 64 20 69 73 20 6f  date method is o
e630: 70 74 69 6f 6e 61 6c 2e 0d 0a 20 20 20 20 20 20  ptional...      
e640: 20 20 2f 2f 2f 20 49 66 20 74 68 65 20 78 55 70    /// If the xUp
e650: 64 61 74 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  date pointer in 
e660: 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  the sqlite3_modu
e670: 6c 65 20 66 6f 72 20 61 20 76 69 72 74 75 61 6c  le for a virtual
e680: 20 74 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20   table..        
e690: 2f 2f 2f 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  /// is a NULL po
e6a0: 69 6e 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  inter, then the 
e6b0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73  virtual table is
e6c0: 20 72 65 61 64 2d 6f 6e 6c 79 2e 0d 0a 20 20 20   read-only...   
e6d0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
e6e0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
e6f0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
e700: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
e710: 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20 20 20 20  e="pVtab">..    
e720: 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69      /// The nati
e730: 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ve pointer to th
e740: 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 64  e sqlite3_vtab d
e750: 65 72 69 76 65 64 20 73 74 72 75 63 74 75 72 65  erived structure
e760: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
e770: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
e780: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
e790: 3d 22 61 72 67 63 22 3e 0d 0a 20 20 20 20 20 20  ="argc">..      
e7a0: 20 20 2f 2f 2f 20 54 68 65 20 6e 75 6d 62 65 72    /// The number
e7b0: 20 6f 66 20 6e 65 77 20 6f 72 20 6d 6f 64 69 66   of new or modif
e7c0: 69 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  ied column value
e7d0: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 0d 0a  s contained in..
e7e0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72          /// <par
e7f0: 61 6d 72 65 66 20 6e 61 6d 65 3d 22 61 72 67 76  amref name="argv
e800: 22 20 2f 3e 2e 0d 0a 20 20 20 20 20 20 20 20 2f  " />...        /
e810: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
e820: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
e830: 6e 61 6d 65 3d 22 61 72 67 76 22 3e 0d 0a 20 20  name="argv">..  
e840: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 61 72        /// The ar
e850: 72 61 79 20 6f 66 20 6e 61 74 69 76 65 20 70 6f  ray of native po
e860: 69 6e 74 65 72 73 20 74 6f 20 73 71 6c 69 74 65  inters to sqlite
e870: 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
e880: 65 73 20 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20  es containing.. 
e890: 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 6e         /// the n
e8a0: 65 77 20 6f 72 20 6d 6f 64 69 66 69 65 64 20 63  ew or modified c
e8b0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 2c 20 69 66  olumn values, if
e8c0: 20 61 6e 79 2e 0d 0a 20 20 20 20 20 20 20 20 2f   any...        /
e8d0: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
e8e0: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
e8f0: 6e 61 6d 65 3d 22 72 6f 77 49 64 22 3e 0d 0a 20  name="rowId">.. 
e900: 20 20 20 20 20 20 20 2f 2f 2f 20 55 70 6f 6e 20         /// Upon 
e910: 73 75 63 63 65 73 73 2c 20 74 68 69 73 20 70 61  success, this pa
e920: 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20  rameter must be 
e930: 6d 6f 64 69 66 69 65 64 20 74 6f 20 63 6f 6e 74  modified to cont
e940: 61 69 6e 20 74 68 65 20 75 6e 69 71 75 65 0d 0a  ain the unique..
e950: 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74 65          /// inte
e960: 67 65 72 20 72 6f 77 20 69 64 65 6e 74 69 66 69  ger row identifi
e970: 65 72 20 66 6f 72 20 74 68 65 20 72 6f 77 20 74  er for the row t
e980: 68 61 74 20 77 61 73 20 69 6e 73 65 72 74 65 64  hat was inserted
e990: 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20 20 20  , if any...     
e9a0: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d     /// </param>.
e9b0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65  .        /// <re
e9c0: 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20  turns>..        
e9d0: 2f 2f 2f 20 41 20 73 74 61 6e 64 61 72 64 20 53  /// A standard S
e9e0: 51 4c 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  QLite return cod
e9f0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
ea00: 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
ea10: 20 20 20 20 53 51 4c 69 74 65 45 72 72 6f 72 43      SQLiteErrorC
ea20: 6f 64 65 20 78 55 70 64 61 74 65 28 0d 0a 20 20  ode xUpdate(..  
ea30: 20 20 20 20 20 20 20 20 20 20 49 6e 74 50 74 72            IntPtr
ea40: 20 70 56 74 61 62 2c 0d 0a 20 20 20 20 20 20 20   pVtab,..       
ea50: 20 20 20 20 20 69 6e 74 20 61 72 67 63 2c 0d 0a       int argc,..
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 50              IntP
ea70: 74 72 20 61 72 67 76 2c 0d 0a 20 20 20 20 20 20  tr argv,..      
ea80: 20 20 20 20 20 20 72 65 66 20 6c 6f 6e 67 20 72        ref long r
ea90: 6f 77 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20  owId..          
eaa0: 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20    );....        
eab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
eac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ead0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
eae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
eaf0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
eb00: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
eb10: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
eb20: 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20  ara><code>..    
eb30: 20 20 20 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 42      /// int (*xB
eb40: 65 67 69 6e 29 28 73 71 6c 69 74 65 33 5f 76 74  egin)(sqlite3_vt
eb50: 61 62 20 2a 70 56 54 61 62 29 3b 0d 0a 20 20 20  ab *pVTab);..   
eb60: 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e       /// </code>
eb70: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
eb80: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
eb90: 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65       /// This me
eba0: 74 68 6f 64 20 62 65 67 69 6e 73 20 61 20 74 72  thod begins a tr
ebb0: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 76  ansaction on a v
ebc0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0d 0a 20  irtual table... 
ebd0: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20         /// This 
ebe0: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 6f 70 74  is method is opt
ebf0: 69 6f 6e 61 6c 2e 20 20 54 68 65 20 78 42 65 67  ional.  The xBeg
ec00: 69 6e 20 70 6f 69 6e 74 65 72 20 6f 66 20 73 71  in pointer of sq
ec10: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 0d 0a 20 20  lite3_module..  
ec20: 20 20 20 20 20 20 2f 2f 2f 20 6d 61 79 20 62 65        /// may be
ec30: 20 4e 55 4c 4c 2e 0d 0a 20 20 20 20 20 20 20 20   NULL...        
ec40: 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
ec50: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d       /// <para>.
ec60: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69  .        /// Thi
ec70: 73 20 6d 65 74 68 6f 64 20 69 73 20 61 6c 77 61  s method is alwa
ec80: 79 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6f  ys followed by o
ec90: 6e 65 20 63 61 6c 6c 20 74 6f 20 65 69 74 68 65  ne call to eithe
eca0: 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f  r the..        /
ecb0: 2f 2f 20 78 43 6f 6d 6d 69 74 20 6f 72 20 78 52  // xCommit or xR
ecc0: 6f 6c 6c 62 61 63 6b 20 6d 65 74 68 6f 64 2e 20  ollback method. 
ecd0: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   Virtual table t
ece0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 64 6f 0d 0a  ransactions do..
ecf0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 6e 6f 74 20          /// not 
ed00: 6e 65 73 74 2c 20 73 6f 20 74 68 65 20 78 42 65  nest, so the xBe
ed10: 67 69 6e 20 6d 65 74 68 6f 64 20 77 69 6c 6c 20  gin method will 
ed20: 6e 6f 74 20 62 65 20 69 6e 76 6f 6b 65 64 20 6d  not be invoked m
ed30: 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 0d 0a 20  ore than once.. 
ed40: 20 20 20 20 20 20 20 2f 2f 2f 20 6f 6e 20 61 20         /// on a 
ed50: 73 69 6e 67 6c 65 20 76 69 72 74 75 61 6c 20 74  single virtual t
ed60: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f  able..        //
ed70: 2f 20 77 69 74 68 6f 75 74 20 61 6e 20 69 6e 74  / without an int
ed80: 65 72 76 65 6e 69 6e 67 20 63 61 6c 6c 20 74 6f  ervening call to
ed90: 20 65 69 74 68 65 72 20 78 43 6f 6d 6d 69 74 20   either xCommit 
eda0: 6f 72 20 78 52 6f 6c 6c 62 61 63 6b 2e 0d 0a 20  or xRollback... 
edb0: 20 20 20 20 20 20 20 2f 2f 2f 20 4d 75 6c 74 69         /// Multi
edc0: 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 6f 74 68  ple calls to oth
edd0: 65 72 20 6d 65 74 68 6f 64 73 20 63 61 6e 20 61  er methods can a
ede0: 6e 64 20 6c 69 6b 65 6c 79 20 77 69 6c 6c 20 6f  nd likely will o
edf0: 63 63 75 72 20 69 6e 20 62 65 74 77 65 65 6e 0d  ccur in between.
ee00: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65  .        /// the
ee10: 20 78 42 65 67 69 6e 20 61 6e 64 20 74 68 65 20   xBegin and the 
ee20: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 78 43  corresponding xC
ee30: 6f 6d 6d 69 74 20 6f 72 20 78 52 6f 6c 6c 62 61  ommit or xRollba
ee40: 63 6b 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ck...        ///
ee50: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20   </para>..      
ee60: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
ee70: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
ee80: 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74 61 62  aram name="pVtab
ee90: 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ">..        /// 
eea0: 54 68 65 20 6e 61 74 69 76 65 20 70 6f 69 6e 74  The native point
eeb0: 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  er to the sqlite
eec0: 33 5f 76 74 61 62 20 64 65 72 69 76 65 64 20 73  3_vtab derived s
eed0: 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20 20 20  tructure...     
eee0: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d     /// </param>.
eef0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65  .        /// <re
ef00: 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20  turns>..        
ef10: 2f 2f 2f 20 41 20 73 74 61 6e 64 61 72 64 20 53  /// A standard S
ef20: 51 4c 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  QLite return cod
ef30: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
ef40: 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
ef50: 20 20 20 20 53 51 4c 69 74 65 45 72 72 6f 72 43      SQLiteErrorC
ef60: 6f 64 65 20 78 42 65 67 69 6e 28 0d 0a 20 20 20  ode xBegin(..   
ef70: 20 20 20 20 20 20 20 20 20 49 6e 74 50 74 72 20           IntPtr 
ef80: 70 56 74 61 62 0d 0a 20 20 20 20 20 20 20 20 20  pVtab..         
ef90: 20 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20     );....       
efa0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
efb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
efc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
efd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
efe0: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
eff0: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
f000: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
f010: 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20  para><code>..   
f020: 20 20 20 20 20 2f 2f 2f 20 69 6e 74 20 28 2a 78       /// int (*x
f030: 53 79 6e 63 29 28 73 71 6c 69 74 65 33 5f 76 74  Sync)(sqlite3_vt
f040: 61 62 20 2a 70 56 54 61 62 29 3b 0d 0a 20 20 20  ab *pVTab);..   
f050: 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e       /// </code>
f060: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
f070: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
f080: 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65       /// This me
f090: 74 68 6f 64 20 73 69 67 6e 61 6c 73 20 74 68 65  thod signals the
f0a0: 20 73 74 61 72 74 20 6f 66 20 61 20 74 77 6f 2d   start of a two-
f0b0: 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 6f 6e 20  phase commit on 
f0c0: 61 20 76 69 72 74 75 61 6c 0d 0a 20 20 20 20 20  a virtual..     
f0d0: 20 20 20 2f 2f 2f 20 74 61 62 6c 65 2e 0d 0a 20     /// table... 
f0e0: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20         /// This 
f0f0: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 6f 70 74  is method is opt
f100: 69 6f 6e 61 6c 2e 20 20 54 68 65 20 78 53 79 6e  ional.  The xSyn
f110: 63 20 70 6f 69 6e 74 65 72 20 6f 66 20 73 71 6c  c pointer of sql
f120: 69 74 65 33 5f 6d 6f 64 75 6c 65 0d 0a 20 20 20  ite3_module..   
f130: 20 20 20 20 20 2f 2f 2f 20 6d 61 79 20 62 65 20       /// may be 
f140: 4e 55 4c 4c 2e 0d 0a 20 20 20 20 20 20 20 20 2f  NULL...        /
f150: 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
f160: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a      /// <para>..
f170: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73          /// This
f180: 20 6d 65 74 68 6f 64 20 69 73 20 6f 6e 6c 79 20   method is only 
f190: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 63 61  invoked after ca
f1a0: 6c 6c 20 74 6f 20 74 68 65 20 78 42 65 67 69 6e  ll to the xBegin
f1b0: 20 6d 65 74 68 6f 64 20 61 6e 64 0d 0a 20 20 20   method and..   
f1c0: 20 20 20 20 20 2f 2f 2f 20 70 72 69 6f 72 20 74       /// prior t
f1d0: 6f 20 61 6e 20 78 43 6f 6d 6d 69 74 20 6f 72 20  o an xCommit or 
f1e0: 78 52 6f 6c 6c 62 61 63 6b 2e 20 20 49 6e 20 6f  xRollback.  In o
f1f0: 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
f200: 74 20 74 77 6f 2d 70 68 61 73 65 0d 0a 20 20 20  t two-phase..   
f210: 20 20 20 20 20 2f 2f 2f 20 63 6f 6d 6d 69 74 2c       /// commit,
f220: 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74 68 6f   the xSync metho
f230: 64 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c  d on all virtual
f240: 20 74 61 62 6c 65 73 20 69 73 20 69 6e 76 6f 6b   tables is invok
f250: 65 64 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20  ed prior to..   
f260: 20 20 20 20 20 2f 2f 2f 20 69 6e 76 6f 6b 69 6e       /// invokin
f270: 67 20 74 68 65 20 78 43 6f 6d 6d 69 74 20 6d 65  g the xCommit me
f280: 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74  thod on any virt
f290: 75 61 6c 20 74 61 62 6c 65 2e 20 20 49 66 20 61  ual table.  If a
f2a0: 6e 79 20 6f 66 20 74 68 65 20 0d 0a 20 20 20 20  ny of the ..    
f2b0: 20 20 20 20 2f 2f 2f 20 78 53 79 6e 63 20 6d 65      /// xSync me
f2c0: 74 68 6f 64 73 20 66 61 69 6c 2c 20 74 68 65 20  thods fail, the 
f2d0: 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
f2e0: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
f2f0: 6b 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  k...        /// 
f300: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
f310: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
f320: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
f330: 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74 61 62 22  ram name="pVtab"
f340: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
f350: 68 65 20 6e 61 74 69 76 65 20 70 6f 69 6e 74 65  he native pointe
f360: 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  r to the sqlite3
f370: 5f 76 74 61 62 20 64 65 72 69 76 65 64 20 73 74  _vtab derived st
f380: 72 75 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20  ructure...      
f390: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a    /// </param>..
f3a0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74          /// <ret
f3b0: 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 2f  urns>..        /
f3c0: 2f 2f 20 41 20 73 74 61 6e 64 61 72 64 20 53 51  // A standard SQ
f3d0: 4c 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65  Lite return code
f3e0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
f3f0: 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20  /returns>..     
f400: 20 20 20 53 51 4c 69 74 65 45 72 72 6f 72 43 6f     SQLiteErrorCo
f410: 64 65 20 78 53 79 6e 63 28 0d 0a 20 20 20 20 20  de xSync(..     
f420: 20 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 56         IntPtr pV
f430: 74 61 62 0d 0a 20 20 20 20 20 20 20 20 20 20 20  tab..           
f440: 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f   );....        /
f450: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f460: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f470: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f480: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f490: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
f4a0: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
f4b0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
f4c0: 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20  ra><code>..     
f4d0: 20 20 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 43 6f     /// int (*xCo
f4e0: 6d 6d 69 74 29 28 73 71 6c 69 74 65 33 5f 76 74  mmit)(sqlite3_vt
f4f0: 61 62 20 2a 70 56 54 61 62 29 3b 0d 0a 20 20 20  ab *pVTab);..   
f500: 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e       /// </code>
f510: 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
f520: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
f530: 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65       /// This me
f540: 74 68 6f 64 20 63 61 75 73 65 73 20 61 20 76 69  thod causes a vi
f550: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 72 61 6e  rtual table tran
f560: 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
f570: 74 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  t...        /// 
f580: 54 68 69 73 20 69 73 20 6d 65 74 68 6f 64 20 69  This is method i
f590: 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 54 68 65  s optional.  The
f5a0: 20 78 43 6f 6d 6d 69 74 20 70 6f 69 6e 74 65 72   xCommit pointer
f5b0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75   of sqlite3_modu
f5c0: 6c 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  le..        /// 
f5d0: 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 0d 0a 20 20  may be NULL...  
f5e0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
f5f0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
f600: 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
f610: 2f 2f 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  // A call to thi
f620: 73 20 6d 65 74 68 6f 64 20 61 6c 77 61 79 73 20  s method always 
f630: 66 6f 6c 6c 6f 77 73 20 61 20 70 72 69 6f 72 20  follows a prior 
f640: 63 61 6c 6c 20 74 6f 20 78 42 65 67 69 6e 20 61  call to xBegin a
f650: 6e 64 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  nd..        /// 
f660: 78 53 79 6e 63 2e 0d 0a 20 20 20 20 20 20 20 20  xSync...        
f670: 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20  /// </para>..   
f680: 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61       /// </summa
f690: 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ry>..        ///
f6a0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56   <param name="pV
f6b0: 74 61 62 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f  tab">..        /
f6c0: 2f 2f 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f  // The native po
f6d0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c  inter to the sql
f6e0: 69 74 65 33 5f 76 74 61 62 20 64 65 72 69 76 65  ite3_vtab derive
f6f0: 64 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20  d structure...  
f700: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
f710: 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  m>..        /// 
f720: 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20  <returns>..     
f730: 20 20 20 2f 2f 2f 20 41 20 73 74 61 6e 64 61 72     /// A standar
f740: 64 20 53 51 4c 69 74 65 20 72 65 74 75 72 6e 20  d SQLite return 
f750: 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f  code...        /
f760: 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20  // </returns>.. 
f770: 20 20 20 20 20 20 20 53 51 4c 69 74 65 45 72 72         SQLiteErr
f780: 6f 72 43 6f 64 65 20 78 43 6f 6d 6d 69 74 28 0d  orCode xCommit(.
f790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  .            Int
f7a0: 50 74 72 20 70 56 74 61 62 0d 0a 20 20 20 20 20  Ptr pVtab..     
f7b0: 20 20 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20         );....   
f7c0: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
f7d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f7e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f7f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f800: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
f810: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d          /// <sum
f820: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f  mary>..        /
f830: 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d  // <para><code>.
f840: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74  .        /// int
f850: 20 28 2a 78 52 6f 6c 6c 62 61 63 6b 29 28 73 71   (*xRollback)(sq
f860: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61  lite3_vtab *pVTa
f870: 62 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  b);..        ///
f880: 20 3c 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d   </code></para>.
f890: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
f8a0: 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
f8b0: 20 54 68 69 73 20 6d 65 74 68 6f 64 20 63 61 75   This method cau
f8c0: 73 65 73 20 61 20 76 69 72 74 75 61 6c 20 74 61  ses a virtual ta
f8d0: 62 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ble transaction 
f8e0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 2e 0d 0a 20 20  to rollback...  
f8f0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 69        /// This i
f900: 73 20 6d 65 74 68 6f 64 20 69 73 20 6f 70 74 69  s method is opti
f910: 6f 6e 61 6c 2e 20 20 54 68 65 20 78 52 6f 6c 6c  onal.  The xRoll
f920: 62 61 63 6b 20 70 6f 69 6e 74 65 72 20 6f 66 20  back pointer of 
f930: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 0d 0a  sqlite3_module..
f940: 20 20 20 20 20 20 20 20 2f 2f 2f 20 6d 61 79 20          /// may 
f950: 62 65 20 4e 55 4c 4c 2e 0d 0a 20 20 20 20 20 20  be NULL...      
f960: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
f970: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
f980: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41  >..        /// A
f990: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 6d 65   call to this me
f9a0: 74 68 6f 64 20 61 6c 77 61 79 73 20 66 6f 6c 6c  thod always foll
f9b0: 6f 77 73 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  ows a prior call
f9c0: 20 74 6f 20 78 42 65 67 69 6e 2e 0d 0a 20 20 20   to xBegin...   
f9d0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
f9e0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
f9f0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
fa00: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
fa10: 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20 20 20 20  e="pVtab">..    
fa20: 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69      /// The nati
fa30: 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ve pointer to th
fa40: 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 64  e sqlite3_vtab d
fa50: 65 72 69 76 65 64 20 73 74 72 75 63 74 75 72 65  erived structure
fa60: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
fa70: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
fa80: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a   /// <returns>..
fa90: 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74          /// A st
faa0: 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72 65  andard SQLite re
fab0: 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20  turn code...    
fac0: 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e      /// </return
fad0: 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69  s>..        SQLi
fae0: 74 65 45 72 72 6f 72 43 6f 64 65 20 78 52 6f 6c  teErrorCode xRol
faf0: 6c 62 61 63 6b 28 0d 0a 20 20 20 20 20 20 20 20  lback(..        
fb00: 20 20 20 20 49 6e 74 50 74 72 20 70 56 74 61 62      IntPtr pVtab
fb10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  ..            );
fb20: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
fb30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fb40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fb50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fb60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fb70: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  ///....        /
fb80: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
fb90: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
fba0: 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20  <code>..        
fbb0: 2f 2f 2f 20 69 6e 74 20 28 2a 78 46 69 6e 64 46  /// int (*xFindF
fbc0: 75 6e 63 74 69 6f 6e 29 28 0d 0a 20 20 20 20 20  unction)(..     
fbd0: 20 20 20 2f 2f 2f 20 20 20 73 71 6c 69 74 65 33     ///   sqlite3
fbe0: 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 0d 0a 20  _vtab *pVtab,.. 
fbf0: 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 69 6e 74         ///   int
fc00: 20 6e 41 72 67 2c 0d 0a 20 20 20 20 20 20 20 20   nArg,..        
fc10: 2f 2f 2f 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ///   const char
fc20: 20 2a 7a 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20   *zName,..      
fc30: 20 20 2f 2f 2f 20 20 20 76 6f 69 64 20 28 2a 2a    ///   void (**
fc40: 70 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  pxFunc)(sqlite3_
fc50: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
fc60: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0d 0a  ite3_value**),..
fc70: 20 20 20 20 20 20 20 20 2f 2f 2f 20 20 20 76 6f          ///   vo
fc80: 69 64 20 2a 2a 70 70 41 72 67 0d 0a 20 20 20 20  id **ppArg..    
fc90: 20 20 20 20 2f 2f 2f 20 29 3b 0d 0a 20 20 20 20      /// );..    
fca0: 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c      /// </code><
fcb0: 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
fcc0: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
fcd0: 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74      /// This met
fce0: 68 6f 64 20 69 73 20 63 61 6c 6c 65 64 20 64 75  hod is called du
fcf0: 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 70 72 65  ring sqlite3_pre
fd00: 70 61 72 65 28 29 20 74 6f 20 67 69 76 65 20 74  pare() to give t
fd10: 68 65 20 76 69 72 74 75 61 6c 0d 0a 20 20 20 20  he virtual..    
fd20: 20 20 20 20 2f 2f 2f 20 74 61 62 6c 65 20 69 6d      /// table im
fd30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 6e 20  plementation an 
fd40: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6f  opportunity to o
fd50: 76 65 72 6c 6f 61 64 20 66 75 6e 63 74 69 6f 6e  verload function
fd60: 73 2e 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  s. ..        ///
fd70: 20 54 68 69 73 20 6d 65 74 68 6f 64 20 6d 61 79   This method may
fd80: 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
fd90: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 6e 6f  in which case no
fda0: 20 6f 76 65 72 6c 6f 61 64 69 6e 67 20 6f 63 63   overloading occ
fdb0: 75 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  urs...        //
fdc0: 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
fdd0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20     /// <para>.. 
fde0: 20 20 20 20 20 20 20 2f 2f 2f 20 57 68 65 6e 20         /// When 
fdf0: 61 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  a function uses 
fe00: 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20  a column from a 
fe10: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 73  virtual table as
fe20: 20 69 74 73 20 66 69 72 73 74 20 0d 0a 20 20 20   its first ..   
fe30: 20 20 20 20 20 2f 2f 2f 20 61 72 67 75 6d 65 6e       /// argumen
fe40: 74 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69  t, this method i
fe50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 73 65 65 20  s called to see 
fe60: 69 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  if the virtual t
fe70: 61 62 6c 65 20 77 6f 75 6c 64 20 0d 0a 20 20 20  able would ..   
fe80: 20 20 20 20 20 2f 2f 2f 20 6c 69 6b 65 20 74 6f       /// like to
fe90: 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75   overload the fu
fea0: 6e 63 74 69 6f 6e 2e 20 54 68 65 20 66 69 72 73  nction. The firs
feb0: 74 20 74 68 72 65 65 20 70 61 72 61 6d 65 74 65  t three paramete
fec0: 72 73 20 61 72 65 20 69 6e 70 75 74 73 3a 20 0d  rs are inputs: .
fed0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 65  .        /// the
fee0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
fef0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  the number of ar
ff00: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
ff10: 75 6e 63 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65  unction, and the
ff20: 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6e   ..        /// n
ff30: 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ame of the funct
ff40: 69 6f 6e 2e 20 49 66 20 6e 6f 20 6f 76 65 72 6c  ion. If no overl
ff50: 6f 61 64 69 6e 67 20 69 73 20 64 65 73 69 72 65  oading is desire
ff60: 64 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 0d 0a  d, this method..
ff70: 20 20 20 20 20 20 20 20 2f 2f 2f 20 72 65 74 75          /// retu
ff80: 72 6e 73 20 30 2e 20 54 6f 20 6f 76 65 72 6c 6f  rns 0. To overlo
ff90: 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  ad the function,
ffa0: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 77 72 69   this method wri
ffb0: 74 65 73 20 74 68 65 20 6e 65 77 20 0d 0a 20 20  tes the new ..  
ffc0: 20 20 20 20 20 20 2f 2f 2f 20 66 75 6e 63 74 69        /// functi
ffd0: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  on implementatio
ffe0: 6e 20 69 6e 74 6f 20 2a 70 78 46 75 6e 63 20 61  n into *pxFunc a
fff0: 6e 64 20 77 72 69 74 65 73 20 75 73 65 72 20 64  nd writes user d
10000 61 74 61 20 69 6e 74 6f 20 2a 70 70 41 72 67 20  ata into *ppArg 
10010 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 61 6e  ..        /// an
10020 64 20 72 65 74 75 72 6e 73 20 31 2e 0d 0a 20 20  d returns 1...  
10030 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
10040 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
10050 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
10060 2f 2f 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 66  // Note that inf
10070 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49  ix functions (LI
10080 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50  KE, GLOB, REGEXP
10090 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 72 65 76  , and MATCH) rev
100a0 65 72 73 65 20 0d 0a 20 20 20 20 20 20 20 20 2f  erse ..        /
100b0 2f 2f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  // the order of 
100c0 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 2e  their arguments.
100d0 20 53 6f 20 22 6c 69 6b 65 28 41 2c 42 29 22 20   So "like(A,B)" 
100e0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
100f0 20 22 42 20 6c 69 6b 65 20 41 22 2e 20 0d 0a 20   "B like A". .. 
10100 20 20 20 20 20 20 20 2f 2f 2f 20 46 6f 72 20 74         /// For t
10110 68 65 20 66 6f 72 6d 20 22 42 20 6c 69 6b 65 20  he form "B like 
10120 41 22 20 74 68 65 20 42 20 74 65 72 6d 20 69 73  A" the B term is
10130 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20   considered the 
10140 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 0d  first argument .
10150 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20  .        /// to 
10160 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 42 75  the function. Bu
10170 74 20 66 6f 72 20 22 6c 69 6b 65 28 41 2c 42 29  t for "like(A,B)
10180 22 20 74 68 65 20 41 20 74 65 72 6d 20 69 73 20  " the A term is 
10190 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20 0d  considered the .
101a0 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 66 69 72  .        /// fir
101b0 73 74 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 20 20  st argument...  
101c0 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
101d0 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
101e0 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f  para>..        /
101f0 2f 2f 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  // The function 
10200 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
10210 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
10220 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 66   must be valid f
10230 6f 72 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  or..        /// 
10240 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20  the lifetime of 
10250 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62  the sqlite3_vtab
10260 20 6f 62 6a 65 63 74 20 67 69 76 65 6e 20 69 6e   object given in
10270 20 74 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   the first param
10280 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 2f  eter...        /
10290 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
102a0 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
102b0 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  y>..        /// 
102c0 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74  <param name="pVt
102d0 61 62 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ab">..        //
102e0 2f 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f 69  / The native poi
102f0 6e 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69  nter to the sqli
10300 74 65 33 5f 76 74 61 62 20 64 65 72 69 76 65 64  te3_vtab derived
10310 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20   structure...   
10320 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d       /// </param
10330 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
10340 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6e 41 72 67  param name="nArg
10350 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ">..        /// 
10360 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  The number of ar
10370 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
10380 75 6e 63 74 69 6f 6e 20 62 65 69 6e 67 20 73 6f  unction being so
10390 75 67 68 74 2e 0d 0a 20 20 20 20 20 20 20 20 2f  ught...        /
103a0 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
103b0 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
103c0 6e 61 6d 65 3d 22 7a 4e 61 6d 65 22 3e 0d 0a 20  name="zName">.. 
103d0 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
103e0 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ame of the funct
103f0 69 6f 6e 20 62 65 69 6e 67 20 73 6f 75 67 68 74  ion being sought
10400 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
10410 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
10420 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
10430 3d 22 63 61 6c 6c 62 61 63 6b 22 3e 0d 0a 20 20  ="callback">..  
10440 20 20 20 20 20 20 2f 2f 2f 20 55 70 6f 6e 20 73        /// Upon s
10450 75 63 63 65 73 73 2c 20 74 68 69 73 20 70 61 72  uccess, this par
10460 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 6d  ameter must be m
10470 6f 64 69 66 69 65 64 20 74 6f 20 63 6f 6e 74 61  odified to conta
10480 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  in the..        
10490 2f 2f 2f 20 64 65 6c 65 67 61 74 65 20 72 65 73  /// delegate res
104a0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6d 70  ponsible for imp
104b0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 73 70  lementing the sp
104c0 65 63 69 66 69 65 64 20 66 75 6e 63 74 69 6f 6e  ecified function
104d0 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
104e0 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
104f0 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
10500 3d 22 70 43 6c 69 65 6e 74 44 61 74 61 22 3e 0d  ="pClientData">.
10510 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 55 70 6f  .        /// Upo
10520 6e 20 73 75 63 63 65 73 73 2c 20 74 68 69 73 20  n success, this 
10530 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62  parameter must b
10540 65 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 63 6f  e modified to co
10550 6e 74 61 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ntain the..     
10560 20 20 20 2f 2f 2f 20 6e 61 74 69 76 65 20 75 73     /// native us
10570 65 72 2d 64 61 74 61 20 70 6f 69 6e 74 65 72 20  er-data pointer 
10580 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0d  associated with.
10590 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
105a0 72 61 6d 72 65 66 20 6e 61 6d 65 3d 22 63 61 6c  ramref name="cal
105b0 6c 62 61 63 6b 22 20 2f 3e 2e 0d 0a 20 20 20 20  lback" />...    
105c0 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
105d0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72  ..        /// <r
105e0 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20  eturns>..       
105f0 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66   /// Non-zero if
10600 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
10610 75 6e 63 74 69 6f 6e 20 77 61 73 20 66 6f 75 6e  unction was foun
10620 64 3b 20 7a 65 72 6f 20 6f 74 68 65 72 77 69 73  d; zero otherwis
10630 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
10640 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
10650 20 20 20 20 69 6e 74 20 78 46 69 6e 64 46 75 6e      int xFindFun
10660 63 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20  ction(..        
10670 20 20 20 20 49 6e 74 50 74 72 20 70 56 74 61 62      IntPtr pVtab
10680 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ,..            i
10690 6e 74 20 6e 41 72 67 2c 0d 0a 20 20 20 20 20 20  nt nArg,..      
106a0 20 20 20 20 20 20 49 6e 74 50 74 72 20 7a 4e 61        IntPtr zNa
106b0 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
106c0 20 72 65 66 20 53 51 4c 69 74 65 43 61 6c 6c 62   ref SQLiteCallb
106d0 61 63 6b 20 63 61 6c 6c 62 61 63 6b 2c 0d 0a 20  ack callback,.. 
106e0 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 49             ref I
106f0 6e 74 50 74 72 20 70 43 6c 69 65 6e 74 44 61 74  ntPtr pClientDat
10700 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  a..            )
10710 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ;....        ///
10720 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10730 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10740 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10750 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10760 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
10770 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
10780 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
10790 3e 3c 63 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20  ><code>..       
107a0 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 52 65 6e 61   /// int (*xRena
107b0 6d 65 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62  me)(sqlite3_vtab
107c0 20 2a 70 56 74 61 62 2c 20 63 6f 6e 73 74 20 63   *pVtab, const c
107d0 68 61 72 20 2a 7a 4e 65 77 29 3b 0d 0a 20 20 20  har *zNew);..   
107e0 20 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e       /// </code>
107f0 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
10800 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
10810 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65       /// This me
10820 74 68 6f 64 20 70 72 6f 76 69 64 65 73 20 6e 6f  thod provides no
10830 74 69 66 69 63 61 74 69 6f 6e 20 74 68 61 74 20  tification that 
10840 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
10850 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
10860 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
10870 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  at the virtual t
10880 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 67 69 76  able will be giv
10890 65 6e 20 61 20 6e 65 77 20 6e 61 6d 65 2e 20 0d  en a new name. .
108a0 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 49 66 20  .        /// If 
108b0 74 68 69 73 20 6d 65 74 68 6f 64 20 72 65 74 75  this method retu
108c0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68  rns SQLITE_OK th
108d0 65 6e 20 53 51 4c 69 74 65 20 72 65 6e 61 6d 65  en SQLite rename
108e0 73 20 74 68 65 20 74 61 62 6c 65 2e 0d 0a 20 20  s the table...  
108f0 20 20 20 20 20 20 2f 2f 2f 20 49 66 20 74 68 69        /// If thi
10900 73 20 6d 65 74 68 6f 64 20 72 65 74 75 72 6e 73  s method returns
10910 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
10920 68 65 6e 20 74 68 65 20 72 65 6e 61 6d 69 6e 67  hen the renaming
10930 20 69 73 20 70 72 65 76 65 6e 74 65 64 2e 0d 0a   is prevented...
10940 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
10950 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
10960 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20   <para>..       
10970 20 2f 2f 2f 20 54 68 65 20 78 52 65 6e 61 6d 65   /// The xRename
10980 20 6d 65 74 68 6f 64 20 69 73 20 72 65 71 75 69   method is requi
10990 72 65 64 20 66 6f 72 20 65 76 65 72 79 20 76 69  red for every vi
109a0 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c  rtual table impl
109b0 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 20 20  ementation...   
109c0 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
109d0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
109e0 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
109f0 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
10a00 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20 20 20 20  e="pVtab">..    
10a10 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69      /// The nati
10a20 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ve pointer to th
10a30 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 64  e sqlite3_vtab d
10a40 65 72 69 76 65 64 20 73 74 72 75 63 74 75 72 65  erived structure
10a50 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
10a60 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
10a70 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
10a80 3d 22 7a 4e 65 77 22 3e 0d 0a 20 20 20 20 20 20  ="zNew">..      
10a90 20 20 2f 2f 2f 20 54 68 65 20 6e 61 74 69 76 65    /// The native
10aa0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
10ab0 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74  UTF-8 encoded st
10ac0 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
10ad0 74 68 65 20 6e 65 77 0d 0a 20 20 20 20 20 20 20  the new..       
10ae0 20 2f 2f 2f 20 6e 61 6d 65 20 66 6f 72 20 74 68   /// name for th
10af0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
10b00 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
10b10 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20  param>..        
10b20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20  /// <returns>.. 
10b30 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74 61         /// A sta
10b40 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72 65 74  ndard SQLite ret
10b50 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20  urn code...     
10b60 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73     /// </returns
10b70 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74  >..        SQLit
10b80 65 45 72 72 6f 72 43 6f 64 65 20 78 52 65 6e 61  eErrorCode xRena
10b90 6d 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me(..           
10ba0 20 49 6e 74 50 74 72 20 70 56 74 61 62 2c 0d 0a   IntPtr pVtab,..
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 50              IntP
10bc0 74 72 20 7a 4e 65 77 0d 0a 20 20 20 20 20 20 20  tr zNew..       
10bd0 20 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 20       );....     
10be0 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
10bf0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10c00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10c10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10c20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
10c30 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61        /// <summa
10c40 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ry>..        ///
10c50 20 3c 70 61 72 61 3e 3c 63 6f 64 65 3e 0d 0a 20   <para><code>.. 
10c60 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74 20 28         /// int (
10c70 2a 78 53 61 76 65 70 6f 69 6e 74 29 28 73 71 6c  *xSavepoint)(sql
10c80 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
10c90 2c 20 69 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20  , int);..       
10ca0 20 2f 2f 2f 20 69 6e 74 20 28 2a 78 52 65 6c 65   /// int (*xRele
10cb0 61 73 65 29 28 73 71 6c 69 74 65 33 5f 76 74 61  ase)(sqlite3_vta
10cc0 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 29 3b 0d  b *pVtab, int);.
10cd0 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74  .        /// int
10ce0 20 28 2a 78 52 6f 6c 6c 62 61 63 6b 54 6f 29 28   (*xRollbackTo)(
10cf0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
10d00 74 61 62 2c 20 69 6e 74 29 3b 0d 0a 20 20 20 20  tab, int);..    
10d10 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 3c      /// </code><
10d20 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
10d30 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
10d40 20 20 20 20 2f 2f 2f 20 54 68 65 73 65 20 6d 65      /// These me
10d50 74 68 6f 64 73 20 70 72 6f 76 69 64 65 20 74 68  thods provide th
10d60 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
10d70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
10d80 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
10d90 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6d  ..        /// im
10da0 70 6c 65 6d 65 6e 74 20 6e 65 73 74 65 64 20 74  plement nested t
10db0 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20 54 68  ransactions.  Th
10dc0 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 6f 70  ey are always op
10dd0 74 69 6f 6e 61 6c 20 61 6e 64 20 77 69 6c 6c 20  tional and will 
10de0 6f 6e 6c 79 20 62 65 0d 0a 20 20 20 20 20 20 20  only be..       
10df0 20 2f 2f 2f 20 63 61 6c 6c 65 64 20 69 6e 20 53   /// called in S
10e00 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 33 2e  QLite version 3.
10e10 37 2e 37 20 28 32 30 31 31 2d 30 36 2d 32 33 29  7.7 (2011-06-23)
10e20 20 61 6e 64 20 6c 61 74 65 72 2e 0d 0a 20 20 20   and later...   
10e30 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e       /// </para>
10e40 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
10e50 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ara>..        //
10e60 2f 20 57 68 65 6e 20 78 53 61 76 65 70 6f 69 6e  / When xSavepoin
10e70 74 28 58 2c 4e 29 20 69 73 20 69 6e 76 6f 6b 65  t(X,N) is invoke
10e80 64 2c 20 74 68 61 74 20 69 73 20 61 20 73 69 67  d, that is a sig
10e90 6e 61 6c 20 74 6f 20 74 68 65 20 76 69 72 74 75  nal to the virtu
10ea0 61 6c 20 74 61 62 6c 65 20 58 0d 0a 20 20 20 20  al table X..    
10eb0 20 20 20 20 2f 2f 2f 20 74 68 61 74 20 69 74 20      /// that it 
10ec0 73 68 6f 75 6c 64 20 73 61 76 65 20 69 74 73 20  should save its 
10ed0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 61 73  current state as
10ee0 20 73 61 76 65 70 6f 69 6e 74 20 4e 2e 20 20 0d   savepoint N.  .
10ef0 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73  .        /// A s
10f00 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0d 0a  ubsequent call..
10f10 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20 78          /// to x
10f20 52 6f 6c 6c 62 61 63 6b 54 6f 28 58 2c 52 29 20  RollbackTo(X,R) 
10f30 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73  means that the s
10f40 74 61 74 65 20 6f 66 20 74 68 65 20 76 69 72 74  tate of the virt
10f50 75 61 6c 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  ual table should
10f60 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20   return..       
10f70 20 2f 2f 2f 20 74 6f 20 77 68 61 74 20 69 74 20   /// to what it 
10f80 77 61 73 20 77 68 65 6e 20 78 53 61 76 65 70 6f  was when xSavepo
10f90 69 6e 74 28 58 2c 52 29 20 77 61 73 20 6c 61 73  int(X,R) was las
10fa0 74 20 63 61 6c 6c 65 64 2e 20 20 0d 0a 20 20 20  t called.  ..   
10fb0 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 63 61 6c       /// The cal
10fc0 6c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74  l..        /// t
10fd0 6f 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 28 58 2c  o xRollbackTo(X,
10fe0 52 29 20 77 69 6c 6c 20 69 6e 76 61 6c 69 64 61  R) will invalida
10ff0 74 65 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74  te all savepoint
11000 73 20 77 69 74 68 20 4e 3e 52 3b 20 6e 6f 6e 65  s with N>R; none
11010 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 20   of the..       
11020 20 2f 2f 2f 20 69 6e 76 61 6c 69 64 65 64 20 73   /// invalided s
11030 61 76 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20 62  avepoints will b
11040 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72  e rolled back or
11050 20 72 65 6c 65 61 73 65 64 20 77 69 74 68 6f 75   released withou
11060 74 20 66 69 72 73 74 0d 0a 20 20 20 20 20 20 20  t first..       
11070 20 2f 2f 2f 20 62 65 69 6e 67 20 72 65 69 6e 69   /// being reini
11080 74 69 61 6c 69 7a 65 64 20 62 79 20 61 20 63 61  tialized by a ca
11090 6c 6c 20 74 6f 20 78 53 61 76 65 70 6f 69 6e 74  ll to xSavepoint
110a0 28 29 2e 20 20 0d 0a 20 20 20 20 20 20 20 20 2f  ().  ..        /
110b0 2f 2f 20 41 20 63 61 6c 6c 20 74 6f 20 78 52 65  // A call to xRe
110c0 6c 65 61 73 65 28 58 2c 4d 29 20 69 6e 76 61 6c  lease(X,M) inval
110d0 69 64 61 74 65 73 20 61 6c 6c 20 73 61 76 65 70  idates all savep
110e0 6f 69 6e 74 73 20 77 68 65 72 65 20 4e 3e 3d 4d  oints where N>=M
110f0 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
11100 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
11110 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
11120 20 20 20 20 2f 2f 2f 20 4e 6f 6e 65 20 6f 66 20      /// None of 
11130 74 68 65 20 78 53 61 76 65 70 6f 69 6e 74 28 29  the xSavepoint()
11140 2c 20 78 52 65 6c 65 61 73 65 28 29 2c 20 6f 72  , xRelease(), or
11150 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 28 29 20 6d   xRollbackTo() m
11160 65 74 68 6f 64 73 20 77 69 6c 6c 20 65 76 65 72  ethods will ever
11170 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 62 65  ..        /// be
11180 20 63 61 6c 6c 65 64 20 65 78 63 65 70 74 20 69   called except i
11190 6e 20 62 65 74 77 65 65 6e 20 63 61 6c 6c 73 20  n between calls 
111a0 74 6f 20 78 42 65 67 69 6e 28 29 20 61 6e 64 20  to xBegin() and 
111b0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 65 69  ..        /// ei
111c0 74 68 65 72 20 78 43 6f 6d 6d 69 74 28 29 20 6f  ther xCommit() o
111d0 72 20 78 52 6f 6c 6c 62 61 63 6b 28 29 2e 0d 0a  r xRollback()...
111e0 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61          /// </pa
111f0 72 61 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ra>..        ///
11200 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
11210 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
11220 6e 61 6d 65 3d 22 70 56 74 61 62 22 3e 0d 0a 20  name="pVtab">.. 
11230 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
11240 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f  ative pointer to
11250 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
11260 62 20 64 65 72 69 76 65 64 20 73 74 72 75 63 74  b derived struct
11270 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ure...        //
11280 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
11290 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
112a0 61 6d 65 3d 22 69 53 61 76 65 70 6f 69 6e 74 22  ame="iSavepoint"
112b0 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
112c0 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 67 65  his is an intege
112d0 72 20 69 64 65 6e 74 69 66 69 65 72 20 75 6e 64  r identifier und
112e0 65 72 20 77 68 69 63 68 20 74 68 65 20 74 68 65  er which the the
112f0 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
11300 66 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74  f..        /// t
11310 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
11320 20 73 68 6f 75 6c 64 20 62 65 20 73 61 76 65 64   should be saved
11330 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
11340 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
11350 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a   /// <returns>..
11360 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73 74          /// A st
11370 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72 65  andard SQLite re
11380 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20  turn code...    
11390 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e      /// </return
113a0 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69  s>..        SQLi
113b0 74 65 45 72 72 6f 72 43 6f 64 65 20 78 53 61 76  teErrorCode xSav
113c0 65 70 6f 69 6e 74 28 0d 0a 20 20 20 20 20 20 20  epoint(..       
113d0 20 20 20 20 20 49 6e 74 50 74 72 20 70 56 74 61       IntPtr pVta
113e0 62 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  b,..            
113f0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 0d 0a  int iSavepoint..
11400 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a              );..
11410 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
11420 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11430 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11440 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11450 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11460 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  /....        ///
11470 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
11480 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63      /// <para><c
11490 6f 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ode>..        //
114a0 2f 20 69 6e 74 20 28 2a 78 53 61 76 65 70 6f 69  / int (*xSavepoi
114b0 6e 74 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62  nt)(sqlite3_vtab
114c0 20 2a 70 56 74 61 62 2c 20 69 6e 74 29 3b 0d 0a   *pVtab, int);..
114d0 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74 20          /// int 
114e0 28 2a 78 52 65 6c 65 61 73 65 29 28 73 71 6c 69  (*xRelease)(sqli
114f0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
11500 20 69 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20   int);..        
11510 2f 2f 2f 20 69 6e 74 20 28 2a 78 52 6f 6c 6c 62  /// int (*xRollb
11520 61 63 6b 54 6f 29 28 73 71 6c 69 74 65 33 5f 76  ackTo)(sqlite3_v
11530 74 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 29  tab *pVtab, int)
11540 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ;..        /// <
11550 2f 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20  /code></para>.. 
11560 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
11570 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
11580 68 65 73 65 20 6d 65 74 68 6f 64 73 20 70 72 6f  hese methods pro
11590 76 69 64 65 20 74 68 65 20 76 69 72 74 75 61 6c  vide the virtual
115a0 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74   table implement
115b0 61 74 69 6f 6e 20 61 6e 20 6f 70 70 6f 72 74 75  ation an opportu
115c0 6e 69 74 79 20 74 6f 0d 0a 20 20 20 20 20 20 20  nity to..       
115d0 20 2f 2f 2f 20 69 6d 70 6c 65 6d 65 6e 74 20 6e   /// implement n
115e0 65 73 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  ested transactio
115f0 6e 73 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c  ns.  They are al
11600 77 61 79 73 20 6f 70 74 69 6f 6e 61 6c 20 61 6e  ways optional an
11610 64 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 0d 0a  d will only be..
11620 20 20 20 20 20 20 20 20 2f 2f 2f 20 63 61 6c 6c          /// call
11630 65 64 20 69 6e 20 53 51 4c 69 74 65 20 76 65 72  ed in SQLite ver
11640 73 69 6f 6e 20 33 2e 37 2e 37 20 28 32 30 31 31  sion 3.7.7 (2011
11650 2d 30 36 2d 32 33 29 20 61 6e 64 20 6c 61 74 65  -06-23) and late
11660 72 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  r...        /// 
11670 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20  </para>..       
11680 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20   /// <para>..   
11690 20 20 20 20 20 2f 2f 2f 20 57 68 65 6e 20 78 53       /// When xS
116a0 61 76 65 70 6f 69 6e 74 28 58 2c 4e 29 20 69 73  avepoint(X,N) is
116b0 20 69 6e 76 6f 6b 65 64 2c 20 74 68 61 74 20 69   invoked, that i
116c0 73 20 61 20 73 69 67 6e 61 6c 20 74 6f 20 74 68  s a signal to th
116d0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
116e0 58 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74  X..        /// t
116f0 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 61  hat it should sa
11700 76 65 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  ve its current s
11710 74 61 74 65 20 61 73 20 73 61 76 65 70 6f 69 6e  tate as savepoin
11720 74 20 4e 2e 20 20 0d 0a 20 20 20 20 20 20 20 20  t N.  ..        
11730 2f 2f 2f 20 41 20 73 75 62 73 65 71 75 65 6e 74  /// A subsequent
11740 20 63 61 6c 6c 0d 0a 20 20 20 20 20 20 20 20 2f   call..        /
11750 2f 2f 20 74 6f 20 78 52 6f 6c 6c 62 61 63 6b 54  // to xRollbackT
11760 6f 28 58 2c 52 29 20 6d 65 61 6e 73 20 74 68 61  o(X,R) means tha
11770 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  t the state of t
11780 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
11790 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0d 0a   should return..
117a0 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20 77          /// to w
117b0 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
117c0 78 53 61 76 65 70 6f 69 6e 74 28 58 2c 52 29 20  xSavepoint(X,R) 
117d0 77 61 73 20 6c 61 73 74 20 63 61 6c 6c 65 64 2e  was last called.
117e0 20 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20    ..        /// 
117f0 54 68 65 20 63 61 6c 6c 0d 0a 20 20 20 20 20 20  The call..      
11800 20 20 2f 2f 2f 20 74 6f 20 78 52 6f 6c 6c 62 61    /// to xRollba
11810 63 6b 54 6f 28 58 2c 52 29 20 77 69 6c 6c 20 69  ckTo(X,R) will i
11820 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 73 61  nvalidate all sa
11830 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20 4e 3e  vepoints with N>
11840 52 3b 20 6e 6f 6e 65 20 6f 66 20 74 68 65 0d 0a  R; none of the..
11850 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 76 61          /// inva
11860 6c 69 64 65 64 20 73 61 76 65 70 6f 69 6e 74 73  lided savepoints
11870 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20   will be rolled 
11880 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 64  back or released
11890 20 77 69 74 68 6f 75 74 20 66 69 72 73 74 0d 0a   without first..
118a0 20 20 20 20 20 20 20 20 2f 2f 2f 20 62 65 69 6e          /// bein
118b0 67 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20  g reinitialized 
118c0 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 78 53 61  by a call to xSa
118d0 76 65 70 6f 69 6e 74 28 29 2e 20 20 0d 0a 20 20  vepoint().  ..  
118e0 20 20 20 20 20 20 2f 2f 2f 20 41 20 63 61 6c 6c        /// A call
118f0 20 74 6f 20 78 52 65 6c 65 61 73 65 28 58 2c 4d   to xRelease(X,M
11900 29 20 69 6e 76 61 6c 69 64 61 74 65 73 20 61 6c  ) invalidates al
11910 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 65  l savepoints whe
11920 72 65 20 4e 3e 3d 4d 2e 0d 0a 20 20 20 20 20 20  re N>=M...      
11930 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
11940 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
11950 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 4e  >..        /// N
11960 6f 6e 65 20 6f 66 20 74 68 65 20 78 53 61 76 65  one of the xSave
11970 70 6f 69 6e 74 28 29 2c 20 78 52 65 6c 65 61 73  point(), xReleas
11980 65 28 29 2c 20 6f 72 20 78 52 6f 6c 6c 62 61 63  e(), or xRollbac
11990 6b 54 6f 28 29 20 6d 65 74 68 6f 64 73 20 77 69  kTo() methods wi
119a0 6c 6c 20 65 76 65 72 0d 0a 20 20 20 20 20 20 20  ll ever..       
119b0 20 2f 2f 2f 20 62 65 20 63 61 6c 6c 65 64 20 65   /// be called e
119c0 78 63 65 70 74 20 69 6e 20 62 65 74 77 65 65 6e  xcept in between
119d0 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 67 69 6e   calls to xBegin
119e0 28 29 20 61 6e 64 20 0d 0a 20 20 20 20 20 20 20  () and ..       
119f0 20 2f 2f 2f 20 65 69 74 68 65 72 20 78 43 6f 6d   /// either xCom
11a00 6d 69 74 28 29 20 6f 72 20 78 52 6f 6c 6c 62 61  mit() or xRollba
11a10 63 6b 28 29 2e 0d 0a 20 20 20 20 20 20 20 20 2f  ck()...        /
11a20 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20  // </para>..    
11a30 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
11a40 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  y>..        /// 
11a50 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74  <param name="pVt
11a60 61 62 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ab">..        //
11a70 2f 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f 69  / The native poi
11a80 6e 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69  nter to the sqli
11a90 74 65 33 5f 76 74 61 62 20 64 65 72 69 76 65 64  te3_vtab derived
11aa0 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20   structure...   
11ab0 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d       /// </param
11ac0 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
11ad0 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69 53 61 76  param name="iSav
11ae0 65 70 6f 69 6e 74 22 3e 0d 0a 20 20 20 20 20 20  epoint">..      
11af0 20 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 61 6e    /// This is an
11b00 20 69 6e 74 65 67 65 72 20 75 73 65 64 20 74 6f   integer used to
11b10 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 61   indicate that a
11b20 6e 79 20 73 61 76 65 64 20 73 74 61 74 65 73 20  ny saved states 
11b30 77 69 74 68 20 61 6e 0d 0a 20 20 20 20 20 20 20  with an..       
11b40 20 2f 2f 2f 20 69 64 65 6e 74 69 66 69 65 72 20   /// identifier 
11b50 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
11b60 65 71 75 61 6c 20 74 6f 20 74 68 69 73 20 73 68  equal to this sh
11b70 6f 75 6c 64 20 62 65 20 64 65 6c 65 74 65 64 20  ould be deleted 
11b80 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  by the..        
11b90 2f 2f 2f 20 76 69 72 74 75 61 6c 20 74 61 62 6c  /// virtual tabl
11ba0 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
11bb0 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
11bc0 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d    /// <returns>.
11bd0 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 41 20 73  .        /// A s
11be0 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 72  tandard SQLite r
11bf0 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20  eturn code...   
11c00 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72       /// </retur
11c10 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 53 51 4c  ns>..        SQL
11c20 69 74 65 45 72 72 6f 72 43 6f 64 65 20 78 52 65  iteErrorCode xRe
11c30 6c 65 61 73 65 28 0d 0a 20 20 20 20 20 20 20 20  lease(..        
11c40 20 20 20 20 49 6e 74 50 74 72 20 70 56 74 61 62      IntPtr pVtab
11c50 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ,..            i
11c60 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 0d 0a 20  nt iSavepoint.. 
11c70 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 0d             );...
11c80 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
11c90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11ca0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11cb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11cc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11cd0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ....        /// 
11ce0 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  <summary>..     
11cf0 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 3c 63 6f     /// <para><co
11d00 64 65 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  de>..        ///
11d10 20 69 6e 74 20 28 2a 78 53 61 76 65 70 6f 69 6e   int (*xSavepoin
11d20 74 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  t)(sqlite3_vtab 
11d30 2a 70 56 74 61 62 2c 20 69 6e 74 29 3b 0d 0a 20  *pVtab, int);.. 
11d40 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74 20 28         /// int (
11d50 2a 78 52 65 6c 65 61 73 65 29 28 73 71 6c 69 74  *xRelease)(sqlit
11d60 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20  e3_vtab *pVtab, 
11d70 69 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f  int);..        /
11d80 2f 2f 20 69 6e 74 20 28 2a 78 52 6f 6c 6c 62 61  // int (*xRollba
11d90 63 6b 54 6f 29 28 73 71 6c 69 74 65 33 5f 76 74  ckTo)(sqlite3_vt
11da0 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 29 3b  ab *pVtab, int);
11db0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
11dc0 63 6f 64 65 3e 3c 2f 70 61 72 61 3e 0d 0a 20 20  code></para>..  
11dd0 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
11de0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
11df0 65 73 65 20 6d 65 74 68 6f 64 73 20 70 72 6f 76  ese methods prov
11e00 69 64 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  ide the virtual 
11e10 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
11e20 74 69 6f 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e  tion an opportun
11e30 69 74 79 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  ity to..        
11e40 2f 2f 2f 20 69 6d 70 6c 65 6d 65 6e 74 20 6e 65  /// implement ne
11e50 73 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  sted transaction
11e60 73 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c 77  s.  They are alw
11e70 61 79 73 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64  ays optional and
11e80 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 0d 0a 20   will only be.. 
11e90 20 20 20 20 20 20 20 2f 2f 2f 20 63 61 6c 6c 65         /// calle
11ea0 64 20 69 6e 20 53 51 4c 69 74 65 20 76 65 72 73  d in SQLite vers
11eb0 69 6f 6e 20 33 2e 37 2e 37 20 28 32 30 31 31 2d  ion 3.7.7 (2011-
11ec0 30 36 2d 32 33 29 20 61 6e 64 20 6c 61 74 65 72  06-23) and later
11ed0 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
11ee0 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20 20 20 20  /para>..        
11ef0 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 20 20  /// <para>..    
11f00 20 20 20 20 2f 2f 2f 20 57 68 65 6e 20 78 53 61      /// When xSa
11f10 76 65 70 6f 69 6e 74 28 58 2c 4e 29 20 69 73 20  vepoint(X,N) is 
11f20 69 6e 76 6f 6b 65 64 2c 20 74 68 61 74 20 69 73  invoked, that is
11f30 20 61 20 73 69 67 6e 61 6c 20 74 6f 20 74 68 65   a signal to the
11f40 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 58   virtual table X
11f50 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68  ..        /// th
11f60 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 61 76  at it should sav
11f70 65 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 74  e its current st
11f80 61 74 65 20 61 73 20 73 61 76 65 70 6f 69 6e 74  ate as savepoint
11f90 20 4e 2e 20 20 0d 0a 20 20 20 20 20 20 20 20 2f   N.  ..        /
11fa0 2f 2f 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  // A subsequent 
11fb0 63 61 6c 6c 0d 0a 20 20 20 20 20 20 20 20 2f 2f  call..        //
11fc0 2f 20 74 6f 20 78 52 6f 6c 6c 62 61 63 6b 54 6f  / to xRollbackTo
11fd0 28 58 2c 52 29 20 6d 65 61 6e 73 20 74 68 61 74  (X,R) means that
11fe0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
11ff0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
12000 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0d 0a 20  should return.. 
12010 20 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20 77 68         /// to wh
12020 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 78  at it was when x
12030 53 61 76 65 70 6f 69 6e 74 28 58 2c 52 29 20 77  Savepoint(X,R) w
12040 61 73 20 6c 61 73 74 20 63 61 6c 6c 65 64 2e 20  as last called. 
12050 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54   ..        /// T
12060 68 65 20 63 61 6c 6c 0d 0a 20 20 20 20 20 20 20  he call..       
12070 20 2f 2f 2f 20 74 6f 20 78 52 6f 6c 6c 62 61 63   /// to xRollbac
12080 6b 54 6f 28 58 2c 52 29 20 77 69 6c 6c 20 69 6e  kTo(X,R) will in
12090 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 73 61 76  validate all sav
120a0 65 70 6f 69 6e 74 73 20 77 69 74 68 20 4e 3e 52  epoints with N>R
120b0 3b 20 6e 6f 6e 65 20 6f 66 20 74 68 65 0d 0a 20  ; none of the.. 
120c0 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e 76 61 6c         /// inval
120d0 69 64 65 64 20 73 61 76 65 70 6f 69 6e 74 73 20  ided savepoints 
120e0 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
120f0 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 64 20  ack or released 
12100 77 69 74 68 6f 75 74 20 66 69 72 73 74 0d 0a 20  without first.. 
12110 20 20 20 20 20 20 20 2f 2f 2f 20 62 65 69 6e 67         /// being
12120 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62   reinitialized b
12130 79 20 61 20 63 61 6c 6c 20 74 6f 20 78 53 61 76  y a call to xSav
12140 65 70 6f 69 6e 74 28 29 2e 20 20 0d 0a 20 20 20  epoint().  ..   
12150 20 20 20 20 20 2f 2f 2f 20 41 20 63 61 6c 6c 20       /// A call 
12160 74 6f 20 78 52 65 6c 65 61 73 65 28 58 2c 4d 29  to xRelease(X,M)
12170 20 69 6e 76 61 6c 69 64 61 74 65 73 20 61 6c 6c   invalidates all
12180 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 65 72   savepoints wher
12190 65 20 4e 3e 3d 4d 2e 0d 0a 20 20 20 20 20 20 20  e N>=M...       
121a0 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20   /// </para>..  
121b0 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 3e        /// <para>
121c0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 4e 6f  ..        /// No
121d0 6e 65 20 6f 66 20 74 68 65 20 78 53 61 76 65 70  ne of the xSavep
121e0 6f 69 6e 74 28 29 2c 20 78 52 65 6c 65 61 73 65  oint(), xRelease
121f0 28 29 2c 20 6f 72 20 78 52 6f 6c 6c 62 61 63 6b  (), or xRollback
12200 54 6f 28 29 20 6d 65 74 68 6f 64 73 20 77 69 6c  To() methods wil
12210 6c 20 65 76 65 72 0d 0a 20 20 20 20 20 20 20 20  l ever..        
12220 2f 2f 2f 20 62 65 20 63 61 6c 6c 65 64 20 65 78  /// be called ex
12230 63 65 70 74 20 69 6e 20 62 65 74 77 65 65 6e 20  cept in between 
12240 63 61 6c 6c 73 20 74 6f 20 78 42 65 67 69 6e 28  calls to xBegin(
12250 29 20 61 6e 64 20 0d 0a 20 20 20 20 20 20 20 20  ) and ..        
12260 2f 2f 2f 20 65 69 74 68 65 72 20 78 43 6f 6d 6d  /// either xComm
12270 69 74 28 29 20 6f 72 20 78 52 6f 6c 6c 62 61 63  it() or xRollbac
12280 6b 28 29 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  k()...        //
12290 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 20 20 20  / </para>..     
122a0 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
122b0 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  >..        /// <
122c0 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 56 74 61  param name="pVta
122d0 62 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  b">..        ///
122e0 20 54 68 65 20 6e 61 74 69 76 65 20 70 6f 69 6e   The native poin
122f0 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ter to the sqlit
12300 65 33 5f 76 74 61 62 20 64 65 72 69 76 65 64 20  e3_vtab derived 
12310 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 20 20  structure...    
12320 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
12330 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
12340 61 72 61 6d 20 6e 61 6d 65 3d 22 69 53 61 76 65  aram name="iSave
12350 70 6f 69 6e 74 22 3e 0d 0a 20 20 20 20 20 20 20  point">..       
12360 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 61 6e 20   /// This is an 
12370 69 6e 74 65 67 65 72 20 69 64 65 6e 74 69 66 69  integer identifi
12380 65 72 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  er used to speci
12390 66 79 20 61 20 73 70 65 63 69 66 69 63 20 73 61  fy a specific sa
123a0 76 65 64 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ved..        ///
123b0 20 73 74 61 74 65 20 66 6f 72 20 74 68 65 20 76   state for the v
123c0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66 6f 72  irtual table for
123d0 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 69   it to restore i
123e0 74 73 65 6c 66 20 62 61 63 6b 20 74 6f 2c 20 77  tself back to, w
123f0 68 69 63 68 0d 0a 20 20 20 20 20 20 20 20 2f 2f  hich..        //
12400 2f 20 73 68 6f 75 6c 64 20 61 6c 73 6f 20 68 61  / should also ha
12410 76 65 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  ve the effect of
12420 20 64 65 6c 65 74 69 6e 67 20 61 6c 6c 20 73 61   deleting all sa
12430 76 65 64 20 73 74 61 74 65 73 20 77 69 74 68 20  ved states with 
12440 61 6e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  an..        /// 
12450 69 6e 74 65 67 65 72 20 69 64 65 6e 74 69 66 69  integer identifi
12460 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
12470 74 68 69 73 20 6f 6e 65 2e 0d 0a 20 20 20 20 20  this one...     
12480 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d     /// </param>.
12490 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65  .        /// <re
124a0 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20  turns>..        
124b0 2f 2f 2f 20 41 20 73 74 61 6e 64 61 72 64 20 53  /// A standard S
124c0 51 4c 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  QLite return cod
124d0 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
124e0 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
124f0 20 20 20 20 53 51 4c 69 74 65 45 72 72 6f 72 43      SQLiteErrorC
12500 6f 64 65 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 28  ode xRollbackTo(
12510 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  ..            In
12520 74 50 74 72 20 70 56 74 61 62 2c 0d 0a 20 20 20  tPtr pVtab,..   
12530 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 61           int iSa
12540 76 65 70 6f 69 6e 74 0d 0a 20 20 20 20 20 20 20  vepoint..       
12550 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 7d 0d 0a       );..    }..
12560 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
12570 7d 0d 0a                                         }..