/ Hex Artifact Content
Login

Artifact 6f16443abb3551e3f5813bb13ba19a30e7032830015b0f92fe0c0453045c0a11:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 2d 30 35 2d 33 31  /*.** 2017-05-31
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 61 6e 20  demonstrates an 
0190: 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
01a0: 6c 20 74 61 62 6c 65 20 74 68 61 74 20 72 65 74  l table that ret
01b0: 75 72 6e 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  urns information
01c0: 0a 2a 2a 20 61 62 6f 75 74 20 61 6c 6c 20 70 72  .** about all pr
01d0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
01e0: 73 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  s for the databa
01f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
0200: 2a 0a 2a 2a 20 55 73 61 67 65 20 65 78 61 6d 70  *.** Usage examp
0210: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 6c  le:.**.**     .l
0220: 6f 61 64 20 2e 2f 73 74 6d 74 0a 2a 2a 20 20 20  oad ./stmt.**   
0230: 20 20 2e 6d 6f 64 65 20 6c 69 6e 65 0a 2a 2a 20    .mode line.** 
0240: 20 20 20 20 2e 68 65 61 64 65 72 20 6f 6e 0a 2a      .header on.*
0250: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  *     SELECT * F
0260: 52 4f 4d 20 73 74 6d 74 3b 0a 2a 2f 0a 23 69 66  ROM stmt;.*/.#if
0270: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0280: 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e 65  _CORE) || define
0290: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
02a0: 53 54 4d 54 56 54 41 42 29 0a 23 69 66 20 21 64  STMTVTAB).#if !d
02b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 49 4e 54  efined(SQLITEINT
02c0: 5f 48 29 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  _H).#include "sq
02d0: 6c 69 74 65 33 65 78 74 2e 68 22 0a 23 65 6e 64  lite3ext.h".#end
02e0: 69 66 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  if.SQLITE_EXTENS
02f0: 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c 75  ION_INIT1.#inclu
0300: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
0310: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
0320: 3e 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  >..#ifndef SQLIT
0330: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
0340: 42 4c 45 0a 0a 2f 2a 20 73 74 6d 74 5f 76 74 61  BLE../* stmt_vta
0350: 62 20 69 73 20 61 20 73 75 62 63 6c 61 73 73 20  b is a subclass 
0360: 6f 66 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  of sqlite3_vtab 
0370: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 73 65  which will.** se
0380: 72 76 65 20 61 73 20 74 68 65 20 75 6e 64 65 72  rve as the under
0390: 6c 79 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  lying representa
03a0: 74 69 6f 6e 20 6f 66 20 61 20 73 74 6d 74 20 76  tion of a stmt v
03b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a 2f 0a  irtual table.*/.
03c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
03d0: 74 6d 74 5f 76 74 61 62 20 73 74 6d 74 5f 76 74  tmt_vtab stmt_vt
03e0: 61 62 3b 0a 73 74 72 75 63 74 20 73 74 6d 74 5f  ab;.struct stmt_
03f0: 76 74 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33  vtab {.  sqlite3
0400: 5f 76 74 61 62 20 62 61 73 65 3b 20 20 2f 2a 20  _vtab base;  /* 
0410: 42 61 73 65 20 63 6c 61 73 73 20 2d 20 6d 75 73  Base class - mus
0420: 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  t be first */.  
0430: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
0440: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
0450: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 74  connection for t
0460: 68 69 73 20 73 74 6d 74 20 76 74 61 62 20 2a 2f  his stmt vtab */
0470: 0a 7d 3b 0a 0a 2f 2a 20 73 74 6d 74 5f 63 75 72  .};../* stmt_cur
0480: 73 6f 72 20 69 73 20 61 20 73 75 62 63 6c 61 73  sor is a subclas
0490: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 74 61  s of sqlite3_vta
04a0: 62 5f 63 75 72 73 6f 72 20 77 68 69 63 68 20 77  b_cursor which w
04b0: 69 6c 6c 0a 2a 2a 20 73 65 72 76 65 20 61 73 20  ill.** serve as 
04c0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 72  the underlying r
04d0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
04e0: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 73   a cursor that s
04f0: 63 61 6e 73 0a 2a 2a 20 6f 76 65 72 20 72 6f 77  cans.** over row
0500: 73 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  s of the result.
0510: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0520: 74 20 73 74 6d 74 5f 63 75 72 73 6f 72 20 73 74  t stmt_cursor st
0530: 6d 74 5f 63 75 72 73 6f 72 3b 0a 73 74 72 75 63  mt_cursor;.struc
0540: 74 20 73 74 6d 74 5f 63 75 72 73 6f 72 20 7b 0a  t stmt_cursor {.
0550: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
0560: 75 72 73 6f 72 20 62 61 73 65 3b 20 20 2f 2a 20  ursor base;  /* 
0570: 42 61 73 65 20 63 6c 61 73 73 20 2d 20 6d 75 73  Base class - mus
0580: 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  t be first */.  
0590: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
05a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
05b0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
05c0: 6e 20 66 6f 72 20 74 68 69 73 20 63 75 72 73 6f  n for this curso
05d0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  r */.  sqlite3_s
05e0: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
05f0: 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 63    /* Statement c
0600: 75 72 73 6f 72 20 69 73 20 63 75 72 72 65 6e 74  ursor is current
0610: 6c 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 2a  ly pointing at *
0620: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
0630: 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 2f  4 iRowid;      /
0640: 2a 20 54 68 65 20 72 6f 77 69 64 20 2a 2f 0a 7d  * The rowid */.}
0650: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 6d  ;../*.** The stm
0660: 74 43 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f  tConnect() metho
0670: 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  d is invoked to 
0680: 63 72 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20  create a new.** 
0690: 73 74 6d 74 5f 76 74 61 62 20 74 68 61 74 20 64  stmt_vtab that d
06a0: 65 73 63 72 69 62 65 73 20 74 68 65 20 73 74 6d  escribes the stm
06b0: 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  t virtual table.
06c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 6e 6b 20 6f 66 20  .**.** Think of 
06d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 20  this routine as 
06e0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20  the constructor 
06f0: 66 6f 72 20 73 74 6d 74 5f 76 74 61 62 20 6f 62  for stmt_vtab ob
0700: 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  jects..**.** All
0710: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   this routine ne
0720: 65 64 73 20 74 6f 20 64 6f 20 69 73 3a 0a 2a 2a  eds to do is:.**
0730: 0a 2a 2a 20 20 20 20 28 31 29 20 41 6c 6c 6f 63  .**    (1) Alloc
0740: 61 74 65 20 74 68 65 20 73 74 6d 74 5f 76 74 61  ate the stmt_vta
0750: 62 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 6e 69  b object and ini
0760: 74 69 61 6c 69 7a 65 20 61 6c 6c 20 66 69 65 6c  tialize all fiel
0770: 64 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  ds..**.**    (2)
0780: 20 54 65 6c 6c 20 53 51 4c 69 74 65 20 28 76 69   Tell SQLite (vi
0790: 61 20 74 68 65 20 73 71 6c 69 74 65 33 5f 64 65  a the sqlite3_de
07a0: 63 6c 61 72 65 5f 76 74 61 62 28 29 20 69 6e 74  clare_vtab() int
07b0: 65 72 66 61 63 65 29 20 77 68 61 74 20 74 68 65  erface) what the
07c0: 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 75 6c  .**        resul
07d0: 74 20 73 65 74 20 6f 66 20 71 75 65 72 69 65 73  t set of queries
07e0: 20 61 67 61 69 6e 73 74 20 73 74 6d 74 20 77 69   against stmt wi
07f0: 6c 6c 20 6c 6f 6f 6b 20 6c 69 6b 65 2e 0a 2a 2f  ll look like..*/
0800: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 6d 74  .static int stmt
0810: 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74  Connect(.  sqlit
0820: 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a  e3 *db,.  void *
0830: 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  pAux,.  int argc
0840: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  , const char *co
0850: 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69  nst*argv,.  sqli
0860: 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61  te3_vtab **ppVta
0870: 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  b,.  char **pzEr
0880: 72 0a 29 7b 0a 20 20 73 74 6d 74 5f 76 74 61 62  r.){.  stmt_vtab
0890: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
08a0: 3b 0a 0a 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d  ;../* Column num
08b0: 62 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  bers */.#define 
08c0: 53 54 4d 54 5f 43 4f 4c 55 4d 4e 5f 53 51 4c 20  STMT_COLUMN_SQL 
08d0: 20 20 20 20 30 20 20 20 2f 2a 20 53 51 4c 20 66      0   /* SQL f
08e0: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
08f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 4d 54   */.#define STMT
0900: 5f 43 4f 4c 55 4d 4e 5f 4e 43 4f 4c 20 20 20 20  _COLUMN_NCOL    
0910: 31 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  1   /* Number of
0920: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
0930: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 4d 54 5f  */.#define STMT_
0940: 43 4f 4c 55 4d 4e 5f 52 4f 20 20 20 20 20 20 32  COLUMN_RO      2
0950: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
0960: 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69  ad-only */.#defi
0970: 6e 65 20 53 54 4d 54 5f 43 4f 4c 55 4d 4e 5f 42  ne STMT_COLUMN_B
0980: 55 53 59 20 20 20 20 33 20 20 20 2f 2a 20 54 72  USY    3   /* Tr
0990: 75 65 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ue if currently 
09a0: 62 75 73 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  busy */.#define 
09b0: 53 54 4d 54 5f 43 4f 4c 55 4d 4e 5f 4e 53 43 41  STMT_COLUMN_NSCA
09c0: 4e 20 20 20 34 20 20 20 2f 2a 20 53 51 4c 49 54  N   4   /* SQLIT
09d0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
09e0: 4c 53 43 41 4e 5f 53 54 45 50 20 2a 2f 0a 23 64  LSCAN_STEP */.#d
09f0: 65 66 69 6e 65 20 53 54 4d 54 5f 43 4f 4c 55 4d  efine STMT_COLUM
0a00: 4e 5f 4e 53 4f 52 54 20 20 20 35 20 20 20 2f 2a  N_NSORT   5   /*
0a10: 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
0a20: 55 53 5f 53 4f 52 54 20 2a 2f 0a 23 64 65 66 69  US_SORT */.#defi
0a30: 6e 65 20 53 54 4d 54 5f 43 4f 4c 55 4d 4e 5f 4e  ne STMT_COLUMN_N
0a40: 41 49 44 58 20 20 20 36 20 20 20 2f 2a 20 53 51  AIDX   6   /* SQ
0a50: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
0a60: 41 55 54 4f 49 4e 44 45 58 20 2a 2f 0a 23 64 65  AUTOINDEX */.#de
0a70: 66 69 6e 65 20 53 54 4d 54 5f 43 4f 4c 55 4d 4e  fine STMT_COLUMN
0a80: 5f 4e 53 54 45 50 20 20 20 37 20 20 20 2f 2a 20  _NSTEP   7   /* 
0a90: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
0aa0: 53 5f 56 4d 5f 53 54 45 50 20 2a 2f 0a 23 64 65  S_VM_STEP */.#de
0ab0: 66 69 6e 65 20 53 54 4d 54 5f 43 4f 4c 55 4d 4e  fine STMT_COLUMN
0ac0: 5f 52 45 50 52 45 50 20 20 38 20 20 20 2f 2a 20  _REPREP  8   /* 
0ad0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
0ae0: 53 5f 52 45 50 52 45 50 41 52 45 20 2a 2f 0a 23  S_REPREPARE */.#
0af0: 64 65 66 69 6e 65 20 53 54 4d 54 5f 43 4f 4c 55  define STMT_COLU
0b00: 4d 4e 5f 52 55 4e 20 20 20 20 20 39 20 20 20 2f  MN_RUN     9   /
0b10: 2a 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  * SQLITE_STMTSTA
0b20: 54 55 53 5f 52 55 4e 20 2a 2f 0a 23 64 65 66 69  TUS_RUN */.#defi
0b30: 6e 65 20 53 54 4d 54 5f 43 4f 4c 55 4d 4e 5f 4d  ne STMT_COLUMN_M
0b40: 45 4d 20 20 20 20 31 30 20 20 20 2f 2a 20 53 51  EM    10   /* SQ
0b50: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
0b60: 4d 45 4d 55 53 45 44 20 2a 2f 0a 0a 0a 20 20 72  MEMUSED */...  r
0b70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  c = sqlite3_decl
0b80: 61 72 65 5f 76 74 61 62 28 64 62 2c 0a 20 20 20  are_vtab(db,.   
0b90: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
0ba0: 78 28 73 71 6c 2c 6e 63 6f 6c 2c 72 6f 2c 62 75  x(sql,ncol,ro,bu
0bb0: 73 79 2c 6e 73 63 61 6e 2c 6e 73 6f 72 74 2c 6e  sy,nscan,nsort,n
0bc0: 61 69 64 78 2c 6e 73 74 65 70 2c 22 0a 20 20 20  aidx,nstep,".   
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 22 72 65 70 72 65 70 2c 72 75 6e 2c 6d 65 6d   "reprep,run,mem
0bf0: 29 22 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  )");.  if( rc==S
0c00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0c10: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
0c20: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
0c30: 4e 65 77 29 20 29 3b 0a 20 20 20 20 2a 70 70 56  New) );.    *ppV
0c40: 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  tab = (sqlite3_v
0c50: 74 61 62 2a 29 70 4e 65 77 3b 0a 20 20 20 20 69  tab*)pNew;.    i
0c60: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
0c70: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
0c80: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  ;.    memset(pNe
0c90: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w, 0, sizeof(*pN
0ca0: 65 77 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ew));.    pNew->
0cb0: 64 62 20 3d 20 64 62 3b 0a 20 20 7d 0a 20 20 72  db = db;.  }.  r
0cc0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
0cd0: 2a 2a 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69  ** This method i
0ce0: 73 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  s the destructor
0cf0: 20 66 6f 72 20 73 74 6d 74 5f 63 75 72 73 6f 72   for stmt_cursor
0d00: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
0d10: 74 69 63 20 69 6e 74 20 73 74 6d 74 44 69 73 63  tic int stmtDisc
0d20: 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76  onnect(sqlite3_v
0d30: 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73  tab *pVtab){.  s
0d40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
0d50: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
0d60: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
0d70: 20 43 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72   Constructor for
0d80: 20 61 20 6e 65 77 20 73 74 6d 74 5f 63 75 72 73   a new stmt_curs
0d90: 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  or object..*/.st
0da0: 61 74 69 63 20 69 6e 74 20 73 74 6d 74 4f 70 65  atic int stmtOpe
0db0: 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  n(sqlite3_vtab *
0dc0: 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  p, sqlite3_vtab_
0dd0: 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f  cursor **ppCurso
0de0: 72 29 7b 0a 20 20 73 74 6d 74 5f 63 75 72 73 6f  r){.  stmt_curso
0df0: 72 20 2a 70 43 75 72 3b 0a 20 20 70 43 75 72 20  r *pCur;.  pCur 
0e00: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
0e10: 28 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 20  ( sizeof(*pCur) 
0e20: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30  );.  if( pCur==0
0e30: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
0e40: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
0e50: 28 70 43 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCur, 0, sizeof
0e60: 28 2a 70 43 75 72 29 29 3b 0a 20 20 70 43 75 72  (*pCur));.  pCur
0e70: 2d 3e 64 62 20 3d 20 28 28 73 74 6d 74 5f 76 74  ->db = ((stmt_vt
0e80: 61 62 2a 29 70 29 2d 3e 64 62 3b 0a 20 20 2a 70  ab*)p)->db;.  *p
0e90: 70 43 75 72 73 6f 72 20 3d 20 26 70 43 75 72 2d  pCursor = &pCur-
0ea0: 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20  >base;.  return 
0eb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
0ec0: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66  .** Destructor f
0ed0: 6f 72 20 61 20 73 74 6d 74 5f 63 75 72 73 6f 72  or a stmt_cursor
0ee0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0ef0: 73 74 6d 74 43 6c 6f 73 65 28 73 71 6c 69 74 65  stmtClose(sqlite
0f00: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
0f10: 75 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ur){.  sqlite3_f
0f20: 72 65 65 28 63 75 72 29 3b 0a 20 20 72 65 74 75  ree(cur);.  retu
0f30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
0f40: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
0f50: 61 20 73 74 6d 74 5f 63 75 72 73 6f 72 20 74 6f  a stmt_cursor to
0f60: 20 69 74 73 20 6e 65 78 74 20 72 6f 77 20 6f 66   its next row of
0f70: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
0f80: 69 63 20 69 6e 74 20 73 74 6d 74 4e 65 78 74 28  ic int stmtNext(
0f90: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
0fa0: 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73 74 6d  sor *cur){.  stm
0fb0: 74 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  t_cursor *pCur =
0fc0: 20 28 73 74 6d 74 5f 63 75 72 73 6f 72 2a 29 63   (stmt_cursor*)c
0fd0: 75 72 3b 0a 20 20 70 43 75 72 2d 3e 69 52 6f 77  ur;.  pCur->iRow
0fe0: 69 64 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 70 53  id++;.  pCur->pS
0ff0: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65  tmt = sqlite3_ne
1000: 78 74 5f 73 74 6d 74 28 70 43 75 72 2d 3e 64 62  xt_stmt(pCur->db
1010: 2c 20 70 43 75 72 2d 3e 70 53 74 6d 74 29 3b 0a  , pCur->pStmt);.
1020: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1030: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
1040: 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 63 6f  urn values of co
1050: 6c 75 6d 6e 73 20 66 6f 72 20 74 68 65 20 72 6f  lumns for the ro
1060: 77 20 61 74 20 77 68 69 63 68 20 74 68 65 20 73  w at which the s
1070: 74 6d 74 5f 63 75 72 73 6f 72 0a 2a 2a 20 69 73  tmt_cursor.** is
1080: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1090: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
10a0: 6e 74 20 73 74 6d 74 43 6f 6c 75 6d 6e 28 0a 20  nt stmtColumn(. 
10b0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
10c0: 72 73 6f 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20  rsor *cur,   /* 
10d0: 54 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  The cursor */.  
10e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
10f0: 2a 63 74 78 2c 20 20 20 20 20 20 20 2f 2a 20 46  *ctx,       /* F
1100: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
1110: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1120: 2e 2e 2e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69  ...() */.  int i
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
1150: 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e  column to return
1160: 20 2a 2f 0a 29 7b 0a 20 20 73 74 6d 74 5f 63 75   */.){.  stmt_cu
1170: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 74  rsor *pCur = (st
1180: 6d 74 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a  mt_cursor*)cur;.
1190: 20 20 73 77 69 74 63 68 28 20 69 20 29 7b 0a 20    switch( i ){. 
11a0: 20 20 20 63 61 73 65 20 53 54 4d 54 5f 43 4f 4c     case STMT_COL
11b0: 55 4d 4e 5f 53 51 4c 3a 20 7b 0a 20 20 20 20 20  UMN_SQL: {.     
11c0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
11d0: 74 65 78 74 28 63 74 78 2c 20 73 71 6c 69 74 65  text(ctx, sqlite
11e0: 33 5f 73 71 6c 28 70 43 75 72 2d 3e 70 53 74 6d  3_sql(pCur->pStm
11f0: 74 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  t), -1, SQLITE_T
1200: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
1210: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1220: 20 20 63 61 73 65 20 53 54 4d 54 5f 43 4f 4c 55    case STMT_COLU
1230: 4d 4e 5f 4e 43 4f 4c 3a 20 7b 0a 20 20 20 20 20  MN_NCOL: {.     
1240: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1250: 69 6e 74 28 63 74 78 2c 20 73 71 6c 69 74 65 33  int(ctx, sqlite3
1260: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 43  _column_count(pC
1270: 75 72 2d 3e 70 53 74 6d 74 29 29 3b 0a 20 20 20  ur->pStmt));.   
1280: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1290: 20 20 20 20 63 61 73 65 20 53 54 4d 54 5f 43 4f      case STMT_CO
12a0: 4c 55 4d 4e 5f 52 4f 3a 20 7b 0a 20 20 20 20 20  LUMN_RO: {.     
12b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
12c0: 69 6e 74 28 63 74 78 2c 20 73 71 6c 69 74 65 33  int(ctx, sqlite3
12d0: 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70  _stmt_readonly(p
12e0: 43 75 72 2d 3e 70 53 74 6d 74 29 29 3b 0a 20 20  Cur->pStmt));.  
12f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1300: 0a 20 20 20 20 63 61 73 65 20 53 54 4d 54 5f 43  .    case STMT_C
1310: 4f 4c 55 4d 4e 5f 42 55 53 59 3a 20 7b 0a 20 20  OLUMN_BUSY: {.  
1320: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1330: 6c 74 5f 69 6e 74 28 63 74 78 2c 20 73 71 6c 69  lt_int(ctx, sqli
1340: 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 70 43  te3_stmt_busy(pC
1350: 75 72 2d 3e 70 53 74 6d 74 29 29 3b 0a 20 20 20  ur->pStmt));.   
1360: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1370: 20 20 20 20 63 61 73 65 20 53 54 4d 54 5f 43 4f      case STMT_CO
1380: 4c 55 4d 4e 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  LUMN_MEM: {.    
1390: 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d    i = SQLITE_STM
13a0: 54 53 54 41 54 55 53 5f 4d 45 4d 55 53 45 44 20  TSTATUS_MEMUSED 
13b0: 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  + .            S
13c0: 54 4d 54 5f 43 4f 4c 55 4d 4e 5f 4e 53 43 41 4e  TMT_COLUMN_NSCAN
13d0: 20 2d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   - SQLITE_STMTST
13e0: 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
13f0: 45 50 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  EP;.      /* Fal
1400: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 7d 0a  l thru */.    }.
1410: 20 20 20 20 63 61 73 65 20 53 54 4d 54 5f 43 4f      case STMT_CO
1420: 4c 55 4d 4e 5f 4e 53 43 41 4e 3a 0a 20 20 20 20  LUMN_NSCAN:.    
1430: 63 61 73 65 20 53 54 4d 54 5f 43 4f 4c 55 4d 4e  case STMT_COLUMN
1440: 5f 4e 53 4f 52 54 3a 0a 20 20 20 20 63 61 73 65  _NSORT:.    case
1450: 20 53 54 4d 54 5f 43 4f 4c 55 4d 4e 5f 4e 41 49   STMT_COLUMN_NAI
1460: 44 58 3a 0a 20 20 20 20 63 61 73 65 20 53 54 4d  DX:.    case STM
1470: 54 5f 43 4f 4c 55 4d 4e 5f 4e 53 54 45 50 3a 0a  T_COLUMN_NSTEP:.
1480: 20 20 20 20 63 61 73 65 20 53 54 4d 54 5f 43 4f      case STMT_CO
1490: 4c 55 4d 4e 5f 52 45 50 52 45 50 3a 0a 20 20 20  LUMN_REPREP:.   
14a0: 20 63 61 73 65 20 53 54 4d 54 5f 43 4f 4c 55 4d   case STMT_COLUM
14b0: 4e 5f 52 55 4e 3a 20 7b 0a 20 20 20 20 20 20 73  N_RUN: {.      s
14c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
14d0: 74 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 73  t(ctx, sqlite3_s
14e0: 74 6d 74 5f 73 74 61 74 75 73 28 70 43 75 72 2d  tmt_status(pCur-
14f0: 3e 70 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 20  >pStmt,.        
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2d                i-
1510: 53 54 4d 54 5f 43 4f 4c 55 4d 4e 5f 4e 53 43 41  STMT_COLUMN_NSCA
1520: 4e 2b 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  N+SQLITE_STMTSTA
1530: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
1540: 50 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 62 72  P, 0));.      br
1550: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1560: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1570: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
1580: 72 6e 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72  rn the rowid for
1590: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
15a0: 2e 20 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65  .  In this imple
15b0: 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 0a 2a  mentation, the.*
15c0: 2a 20 72 6f 77 69 64 20 69 73 20 74 68 65 20 73  * rowid is the s
15d0: 61 6d 65 20 61 73 20 74 68 65 20 6f 75 74 70 75  ame as the outpu
15e0: 74 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  t value..*/.stat
15f0: 69 63 20 69 6e 74 20 73 74 6d 74 52 6f 77 69 64  ic int stmtRowid
1600: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
1610: 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69 74  rsor *cur, sqlit
1620: 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29  e_int64 *pRowid)
1630: 7b 0a 20 20 73 74 6d 74 5f 63 75 72 73 6f 72 20  {.  stmt_cursor 
1640: 2a 70 43 75 72 20 3d 20 28 73 74 6d 74 5f 63 75  *pCur = (stmt_cu
1650: 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 2a 70 52  rsor*)cur;.  *pR
1660: 6f 77 69 64 20 3d 20 70 43 75 72 2d 3e 69 52 6f  owid = pCur->iRo
1670: 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  wid;.  return SQ
1680: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1690: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
16a0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
16b0: 62 65 65 6e 20 6d 6f 76 65 64 20 6f 66 66 20 6f  been moved off o
16c0: 66 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f  f the last.** ro
16d0: 77 20 6f 66 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a  w of output..*/.
16e0: 73 74 61 74 69 63 20 69 6e 74 20 73 74 6d 74 45  static int stmtE
16f0: 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  of(sqlite3_vtab_
1700: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
1710: 73 74 6d 74 5f 63 75 72 73 6f 72 20 2a 70 43 75  stmt_cursor *pCu
1720: 72 20 3d 20 28 73 74 6d 74 5f 63 75 72 73 6f 72  r = (stmt_cursor
1730: 2a 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20  *)cur;.  return 
1740: 70 43 75 72 2d 3e 70 53 74 6d 74 3d 3d 30 3b 0a  pCur->pStmt==0;.
1750: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  }../*.** This me
1760: 74 68 6f 64 20 69 73 20 63 61 6c 6c 65 64 20 74  thod is called t
1770: 6f 20 22 72 65 77 69 6e 64 22 20 74 68 65 20 73  o "rewind" the s
1780: 74 6d 74 5f 63 75 72 73 6f 72 20 6f 62 6a 65 63  tmt_cursor objec
1790: 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65  t back.** to the
17a0: 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 6f 75   first row of ou
17b0: 74 70 75 74 2e 20 20 54 68 69 73 20 6d 65 74 68  tput.  This meth
17c0: 6f 64 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  od is always cal
17d0: 6c 65 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  led at least.** 
17e0: 6f 6e 63 65 20 70 72 69 6f 72 20 74 6f 20 61 6e  once prior to an
17f0: 79 20 63 61 6c 6c 20 74 6f 20 73 74 6d 74 43 6f  y call to stmtCo
1800: 6c 75 6d 6e 28 29 20 6f 72 20 73 74 6d 74 52 6f  lumn() or stmtRo
1810: 77 69 64 28 29 20 6f 72 20 0a 2a 2a 20 73 74 6d  wid() or .** stm
1820: 74 45 6f 66 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  tEof()..*/.stati
1830: 63 20 69 6e 74 20 73 74 6d 74 46 69 6c 74 65 72  c int stmtFilter
1840: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
1850: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
1860: 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78  rsor, .  int idx
1870: 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Num, const char 
1880: 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61  *idxStr,.  int a
1890: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
18a0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ue **argv.){.  s
18b0: 74 6d 74 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  tmt_cursor *pCur
18c0: 20 3d 20 28 73 74 6d 74 5f 63 75 72 73 6f 72 20   = (stmt_cursor 
18d0: 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
18e0: 20 70 43 75 72 2d 3e 70 53 74 6d 74 20 3d 20 30   pCur->pStmt = 0
18f0: 3b 0a 20 20 70 43 75 72 2d 3e 69 52 6f 77 69 64  ;.  pCur->iRowid
1900: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73   = 0;.  return s
1910: 74 6d 74 4e 65 78 74 28 70 56 74 61 62 43 75 72  tmtNext(pVtabCur
1920: 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  sor);.}../*.** S
1930: 51 4c 69 74 65 20 77 69 6c 6c 20 69 6e 76 6f 6b  QLite will invok
1940: 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 6e  e this method on
1950: 65 20 6f 72 20 6d 6f 72 65 20 74 69 6d 65 73 20  e or more times 
1960: 77 68 69 6c 65 20 70 6c 61 6e 6e 69 6e 67 20 61  while planning a
1970: 20 71 75 65 72 79 0a 2a 2a 20 74 68 61 74 20 75   query.** that u
1980: 73 65 73 20 74 68 65 20 73 74 6d 74 20 76 69 72  ses the stmt vir
1990: 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69  tual table.  Thi
19a0: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
19b0: 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 71  to create.** a q
19c0: 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 65 61  uery plan for ea
19d0: 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e  ch invocation an
19e0: 64 20 63 6f 6d 70 75 74 65 20 61 6e 20 65 73 74  d compute an est
19f0: 69 6d 61 74 65 64 20 63 6f 73 74 20 66 6f 72 20  imated cost for 
1a00: 74 68 61 74 0a 2a 2a 20 70 6c 61 6e 2e 0a 2a 2f  that.** plan..*/
1a10: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 6d 74  .static int stmt
1a20: 42 65 73 74 49 6e 64 65 78 28 0a 20 20 73 71 6c  BestIndex(.  sql
1a30: 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 0a  ite3_vtab *tab,.
1a40: 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
1a50: 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 0a 29  info *pIdxInfo.)
1a60: 7b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  {.  pIdxInfo->es
1a70: 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64  timatedCost = (d
1a80: 6f 75 62 6c 65 29 35 30 30 3b 0a 20 20 70 49 64  ouble)500;.  pId
1a90: 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
1aa0: 52 6f 77 73 20 3d 20 35 30 30 3b 0a 20 20 72 65  Rows = 500;.  re
1ab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 6f  }../*.** This fo
1ad0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1ae0: 65 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  e defines all th
1af0: 65 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 74 68  e methods for th
1b00: 65 20 0a 2a 2a 20 73 74 6d 74 20 76 69 72 74 75  e .** stmt virtu
1b10: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
1b20: 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  tic sqlite3_modu
1b30: 6c 65 20 73 74 6d 74 4d 6f 64 75 6c 65 20 3d 20  le stmtModule = 
1b40: 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  {.  0,          
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b60: 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
1b70: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1b90: 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 6d 74 43  reate */.  stmtC
1ba0: 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20  onnect,         
1bb0: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63        /* xConnec
1bc0: 74 20 2a 2f 0a 20 20 73 74 6d 74 42 65 73 74 49  t */.  stmtBestI
1bd0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1be0: 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20    /* xBestIndex 
1bf0: 2a 2f 0a 20 20 73 74 6d 74 44 69 73 63 6f 6e 6e  */.  stmtDisconn
1c00: 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ect,            
1c10: 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a  /* xDisconnect *
1c20: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c40: 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f 0a 20 20  * xDestroy */.  
1c50: 73 74 6d 74 4f 70 65 6e 2c 20 20 20 20 20 20 20  stmtOpen,       
1c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
1c70: 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72  pen - open a cur
1c80: 73 6f 72 20 2a 2f 0a 20 20 73 74 6d 74 43 6c 6f  sor */.  stmtClo
1c90: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1ca0: 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20      /* xClose - 
1cb0: 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a  close a cursor *
1cc0: 2f 0a 20 20 73 74 6d 74 46 69 6c 74 65 72 2c 20  /.  stmtFilter, 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ce0: 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66  * xFilter - conf
1cf0: 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74  igure scan const
1d00: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 73 74 6d 74  raints */.  stmt
1d10: 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  Next,           
1d20: 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20         /* xNext 
1d30: 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73  - advance a curs
1d40: 6f 72 20 2a 2f 0a 20 20 73 74 6d 74 45 6f 66 2c  or */.  stmtEof,
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65     /* xEof - che
1d70: 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20 73 63  ck for end of sc
1d80: 61 6e 20 2a 2f 0a 20 20 73 74 6d 74 43 6f 6c 75  an */.  stmtColu
1d90: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mn,             
1da0: 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20     /* xColumn - 
1db0: 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 73  read data */.  s
1dc0: 74 6d 74 52 6f 77 69 64 2c 20 20 20 20 20 20 20  tmtRowid,       
1dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
1de0: 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20  wid - read data 
1df0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20  /* xUpdate */.  
1e20: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42             /* xB
1e40: 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  egin */.  0,    
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
1e70: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e90: 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c   xCommit */.  0,
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c           /* xRol
1ec0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20  lback */.  0,   
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65        /* xFindMe
1ef0: 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20  thod */.  0,    
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20       /* xRename 
1f20: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f  /* xSavepoint */
1f50: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f70: 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30   xRelease */.  0
1f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
1fa0: 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a  llbackTo */.};..
1fb0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1fc0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1fd0: 4c 45 20 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74  LE */..int sqlit
1fe0: 65 33 53 74 6d 74 56 74 61 62 49 6e 69 74 28 73  e3StmtVtabInit(s
1ff0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
2000: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2010: 4b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  K;.#ifndef SQLIT
2020: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2030: 42 4c 45 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  BLE.  rc = sqlit
2040: 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65  e3_create_module
2050: 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 6d  (db, "sqlite_stm
2060: 74 22 2c 20 26 73 74 6d 74 4d 6f 64 75 6c 65 2c  t", &stmtModule,
2070: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65   0);.#endif.  re
2080: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
2090: 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 52 45 0a  def SQLITE_CORE.
20a0: 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f  #ifdef _WIN32.__
20b0: 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f  declspec(dllexpo
20c0: 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73  rt).#endif.int s
20d0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 6e 69 74  qlite3_stmt_init
20e0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
20f0: 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72   .  char **pzErr
2100: 4d 73 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71  Msg, .  const sq
2110: 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2120: 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 69 6e  es *pApi.){.  in
2130: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2140: 3b 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e  ;.  SQLITE_EXTEN
2150: 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29  SION_INIT2(pApi)
2160: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2170: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2180: 4c 45 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  LE.  rc = sqlite
2190: 33 53 74 6d 74 56 74 61 62 49 6e 69 74 28 64 62  3StmtVtabInit(db
21a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
21b0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
21c0: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 45 20 2a  /* SQLITE_CORE *
21d0: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  /.#endif /* !def
21e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45  ined(SQLITE_CORE
21f0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
2200: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 56  ITE_ENABLE_STMTV
2210: 54 41 42 29 20 2a 2f 0a                          TAB) */.