/ Hex Artifact Content
Login

Artifact d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 2d 30 39 2d 31 36  /*.** 2018-09-16
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 74 68 65 0a 2a 2a 20 45 58 50 4c  urns the.** EXPL
01c0: 41 49 4e 20 6f 75 74 70 75 74 20 66 72 6f 6d 20  AIN output from 
01d0: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
01e0: 2e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 20 65 78  ..**.** Usage ex
01f0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
0200: 20 2e 6c 6f 61 64 20 2e 2f 65 78 70 6c 61 69 6e   .load ./explain
0210: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 70  .**     SELECT p
0220: 32 20 46 52 4f 4d 20 65 78 70 6c 61 69 6e 28 27  2 FROM explain('
0230: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
0240: 6c 69 74 65 5f 6d 61 73 74 65 72 27 29 0a 2a 2a  lite_master').**
0250: 20 20 20 20 20 20 57 48 45 52 45 20 6f 70 63 6f        WHERE opco
0260: 64 65 3d 27 4f 70 65 6e 52 65 61 64 27 3b 0a 2a  de='OpenRead';.*
0270: 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65  *.** This module
0280: 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20   was originally 
0290: 77 72 69 74 74 65 6e 20 74 6f 20 68 65 6c 70 20  written to help 
02a0: 73 69 6d 70 6c 69 66 79 20 53 51 4c 69 74 65 20  simplify SQLite 
02b0: 74 65 73 74 69 6e 67 2c 0a 2a 2a 20 62 79 20 70  testing,.** by p
02c0: 72 6f 76 69 64 69 6e 67 20 61 6e 20 65 61 73 69  roviding an easi
02d0: 65 72 20 6d 65 61 6e 73 20 6f 66 20 76 65 72 69  er means of veri
02e0: 66 79 69 6e 67 20 63 65 72 74 61 69 6e 20 70 61  fying certain pa
02f0: 74 74 65 72 6e 73 20 69 6e 20 74 68 65 0a 2a 2a  tterns in the.**
0300: 20 67 65 6e 65 72 61 74 65 64 20 62 79 74 65 63   generated bytec
0310: 6f 64 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ode..*/.#if !def
0320: 69 6e 65 64 28 53 51 4c 49 54 45 49 4e 54 5f 48  ined(SQLITEINT_H
0330: 29 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  ).#include "sqli
0340: 74 65 33 65 78 74 2e 68 22 0a 23 65 6e 64 69 66  te3ext.h".#endif
0350: 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f  .SQLITE_EXTENSIO
0360: 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c 75 64 65  N_INIT1.#include
0370: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
0380: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0390: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
03a0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
03b0: 45 0a 0a 2f 2a 20 65 78 70 6c 61 69 6e 5f 76 74  E../* explain_vt
03c0: 61 62 20 69 73 20 61 20 73 75 62 63 6c 61 73 73  ab is a subclass
03d0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 74 61 62   of sqlite3_vtab
03e0: 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 73   which will.** s
03f0: 65 72 76 65 20 61 73 20 74 68 65 20 75 6e 64 65  erve as the unde
0400: 72 6c 79 69 6e 67 20 72 65 70 72 65 73 65 6e 74  rlying represent
0410: 61 74 69 6f 6e 20 6f 66 20 61 20 65 78 70 6c 61  ation of a expla
0420: 69 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  in virtual table
0430: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0440: 63 74 20 65 78 70 6c 61 69 6e 5f 76 74 61 62 20  ct explain_vtab 
0450: 65 78 70 6c 61 69 6e 5f 76 74 61 62 3b 0a 73 74  explain_vtab;.st
0460: 72 75 63 74 20 65 78 70 6c 61 69 6e 5f 76 74 61  ruct explain_vta
0470: 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  b {.  sqlite3_vt
0480: 61 62 20 62 61 73 65 3b 20 20 2f 2a 20 42 61 73  ab base;  /* Bas
0490: 65 20 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62  e class - must b
04a0: 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c  e first */.  sql
04b0: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
04c0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
04d0: 6e 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  nection for this
04e0: 20 65 78 70 6c 61 69 6e 20 76 74 61 62 20 2a 2f   explain vtab */
04f0: 0a 7d 3b 0a 0a 2f 2a 20 65 78 70 6c 61 69 6e 5f  .};../* explain_
0500: 63 75 72 73 6f 72 20 69 73 20 61 20 73 75 62 63  cursor is a subc
0510: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
0520: 76 74 61 62 5f 63 75 72 73 6f 72 20 77 68 69 63  vtab_cursor whic
0530: 68 20 77 69 6c 6c 0a 2a 2a 20 73 65 72 76 65 20  h will.** serve 
0540: 61 73 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  as the underlyin
0550: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
0560: 20 6f 66 20 61 20 63 75 72 73 6f 72 20 74 68 61   of a cursor tha
0570: 74 20 73 63 61 6e 73 0a 2a 2a 20 6f 76 65 72 20  t scans.** over 
0580: 72 6f 77 73 20 6f 66 20 74 68 65 20 72 65 73 75  rows of the resu
0590: 6c 74 20 66 72 6f 6d 20 61 6e 20 45 58 50 4c 41  lt from an EXPLA
05a0: 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  IN operation..*/
05b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05c0: 65 78 70 6c 61 69 6e 5f 63 75 72 73 6f 72 20 65  explain_cursor e
05d0: 78 70 6c 61 69 6e 5f 63 75 72 73 6f 72 3b 0a 73  xplain_cursor;.s
05e0: 74 72 75 63 74 20 65 78 70 6c 61 69 6e 5f 63 75  truct explain_cu
05f0: 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  rsor {.  sqlite3
0600: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73  _vtab_cursor bas
0610: 65 3b 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73  e;  /* Base clas
0620: 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73  s - must be firs
0630: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
0640: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
0650: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
0660: 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nnection for thi
0670: 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 68  s cursor */.  ch
0680: 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
0690: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
06a0: 65 20 66 6f 72 20 74 68 65 20 45 58 50 4c 4e 5f  e for the EXPLN_
06b0: 43 4f 4c 55 4d 4e 5f 53 51 4c 20 63 6f 6c 75 6d  COLUMN_SQL colum
06c0: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  n */.  sqlite3_s
06d0: 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 20 20  tmt *pExplain;  
06e0: 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 62    /* Statement b
06f0: 65 69 6e 67 20 65 78 70 6c 61 69 6e 65 64 20 2a  eing explained *
0700: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
0710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0720: 2a 20 52 65 73 75 6c 74 20 6f 66 20 6c 61 73 74  * Result of last
0730: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
0740: 6f 6e 20 70 45 78 70 6c 61 69 6e 20 2a 2f 0a 7d  on pExplain */.}
0750: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  ;../*.** The exp
0760: 6c 61 69 6e 43 6f 6e 6e 65 63 74 28 29 20 6d 65  lainConnect() me
0770: 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  thod is invoked 
0780: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a  to create a new.
0790: 2a 2a 20 65 78 70 6c 61 69 6e 5f 76 74 61 62 20  ** explain_vtab 
07a0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
07b0: 68 65 20 65 78 70 6c 61 69 6e 20 76 69 72 74 75  he explain virtu
07c0: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
07d0: 54 68 69 6e 6b 20 6f 66 20 74 68 69 73 20 72 6f  Think of this ro
07e0: 75 74 69 6e 65 20 61 73 20 74 68 65 20 63 6f 6e  utine as the con
07f0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 78 70  structor for exp
0800: 6c 61 69 6e 5f 76 74 61 62 20 6f 62 6a 65 63 74  lain_vtab object
0810: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 69  s..**.** All thi
0820: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
0830: 74 6f 20 64 6f 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  to do is:.**.** 
0840: 20 20 20 28 31 29 20 41 6c 6c 6f 63 61 74 65 20     (1) Allocate 
0850: 74 68 65 20 65 78 70 6c 61 69 6e 5f 76 74 61 62  the explain_vtab
0860: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 6e 69 74   object and init
0870: 69 61 6c 69 7a 65 20 61 6c 6c 20 66 69 65 6c 64  ialize all field
0880: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  s..**.**    (2) 
0890: 54 65 6c 6c 20 53 51 4c 69 74 65 20 28 76 69 61  Tell SQLite (via
08a0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 64 65 63   the sqlite3_dec
08b0: 6c 61 72 65 5f 76 74 61 62 28 29 20 69 6e 74 65  lare_vtab() inte
08c0: 72 66 61 63 65 29 20 77 68 61 74 20 74 68 65 0a  rface) what the.
08d0: 2a 2a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  **        result
08e0: 20 73 65 74 20 6f 66 20 71 75 65 72 69 65 73 20   set of queries 
08f0: 61 67 61 69 6e 73 74 20 65 78 70 6c 61 69 6e 20  against explain 
0900: 77 69 6c 6c 20 6c 6f 6f 6b 20 6c 69 6b 65 2e 0a  will look like..
0910: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
0920: 70 6c 61 69 6e 43 6f 6e 6e 65 63 74 28 0a 20 20  plainConnect(.  
0930: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
0940: 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
0950: 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
0960: 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
0970: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
0980: 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVtab,.  char *
0990: 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 65 78 70 6c  *pzErr.){.  expl
09a0: 61 69 6e 5f 76 74 61 62 20 2a 70 4e 65 77 3b 0a  ain_vtab *pNew;.
09b0: 20 20 69 6e 74 20 72 63 3b 0a 0a 2f 2a 20 43 6f    int rc;../* Co
09c0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  lumn numbers */.
09d0: 23 64 65 66 69 6e 65 20 45 58 50 4c 4e 5f 43 4f  #define EXPLN_CO
09e0: 4c 55 4d 4e 5f 41 44 44 52 20 20 20 20 20 30 20  LUMN_ADDR     0 
09f0: 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
0a00: 20 61 64 64 72 65 73 73 20 2a 2f 0a 23 64 65 66   address */.#def
0a10: 69 6e 65 20 45 58 50 4c 4e 5f 43 4f 4c 55 4d 4e  ine EXPLN_COLUMN
0a20: 5f 4f 50 43 4f 44 45 20 20 20 31 20 20 20 2f 2a  _OPCODE   1   /*
0a30: 20 4f 70 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69   Opcode */.#defi
0a40: 6e 65 20 45 58 50 4c 4e 5f 43 4f 4c 55 4d 4e 5f  ne EXPLN_COLUMN_
0a50: 50 31 20 20 20 20 20 20 20 32 20 20 20 2f 2a 20  P1       2   /* 
0a60: 4f 70 65 72 61 6e 64 20 31 20 2a 2f 0a 23 64 65  Operand 1 */.#de
0a70: 66 69 6e 65 20 45 58 50 4c 4e 5f 43 4f 4c 55 4d  fine EXPLN_COLUM
0a80: 4e 5f 50 32 20 20 20 20 20 20 20 33 20 20 20 2f  N_P2       3   /
0a90: 2a 20 4f 70 65 72 61 6e 64 20 32 20 2a 2f 0a 23  * Operand 2 */.#
0aa0: 64 65 66 69 6e 65 20 45 58 50 4c 4e 5f 43 4f 4c  define EXPLN_COL
0ab0: 55 4d 4e 5f 50 33 20 20 20 20 20 20 20 34 20 20  UMN_P3       4  
0ac0: 20 2f 2a 20 4f 70 65 72 61 6e 64 20 33 20 2a 2f   /* Operand 3 */
0ad0: 0a 23 64 65 66 69 6e 65 20 45 58 50 4c 4e 5f 43  .#define EXPLN_C
0ae0: 4f 4c 55 4d 4e 5f 50 34 20 20 20 20 20 20 20 35  OLUMN_P4       5
0af0: 20 20 20 2f 2a 20 4f 70 65 72 61 6e 64 20 34 20     /* Operand 4 
0b00: 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 50 4c 4e  */.#define EXPLN
0b10: 5f 43 4f 4c 55 4d 4e 5f 50 35 20 20 20 20 20 20  _COLUMN_P5      
0b20: 20 36 20 20 20 2f 2a 20 4f 70 65 72 61 6e 64 20   6   /* Operand 
0b30: 35 20 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 50  5 */.#define EXP
0b40: 4c 4e 5f 43 4f 4c 55 4d 4e 5f 43 4f 4d 4d 45 4e  LN_COLUMN_COMMEN
0b50: 54 20 20 37 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e  T  7   /* Commen
0b60: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 50  t */.#define EXP
0b70: 4c 4e 5f 43 4f 4c 55 4d 4e 5f 53 51 4c 20 20 20  LN_COLUMN_SQL   
0b80: 20 20 20 38 20 20 20 2f 2a 20 53 51 4c 20 74 68     8   /* SQL th
0b90: 61 74 20 69 73 20 62 65 69 6e 67 20 65 78 70 6c  at is being expl
0ba0: 61 69 6e 65 64 20 2a 2f 0a 0a 0a 20 20 72 63 20  ained */...  rc 
0bb0: 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  = sqlite3_declar
0bc0: 65 5f 76 74 61 62 28 64 62 2c 0a 20 20 20 20 20  e_vtab(db,.     
0bd0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28  "CREATE TABLE x(
0be0: 61 64 64 72 2c 6f 70 63 6f 64 65 2c 70 31 2c 70  addr,opcode,p1,p
0bf0: 32 2c 70 33 2c 70 34 2c 70 35 2c 63 6f 6d 6d 65  2,p3,p4,p5,comme
0c00: 6e 74 2c 73 71 6c 20 48 49 44 44 45 4e 29 22 29  nt,sql HIDDEN)")
0c10: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
0c20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65  TE_OK ){.    pNe
0c30: 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
0c40: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
0c50: 29 20 29 3b 0a 20 20 20 20 2a 70 70 56 74 61 62  ) );.    *ppVtab
0c60: 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62   = (sqlite3_vtab
0c70: 2a 29 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20  *)pNew;.    if( 
0c80: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
0c90: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
0ca0: 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
0cb0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  0, sizeof(*pNew)
0cc0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 64 62 20  );.    pNew->db 
0cd0: 3d 20 64 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = db;.  }.  retu
0ce0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
0cf0: 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 74  This method is t
0d00: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
0d10: 72 20 65 78 70 6c 61 69 6e 5f 63 75 72 73 6f 72  r explain_cursor
0d20: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
0d30: 74 69 63 20 69 6e 74 20 65 78 70 6c 61 69 6e 44  tic int explainD
0d40: 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65  isconnect(sqlite
0d50: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
0d60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
0d70: 56 74 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  Vtab);.  return 
0d80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
0d90: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 6f 72 20  .** Constructor 
0da0: 66 6f 72 20 61 20 6e 65 77 20 65 78 70 6c 61 69  for a new explai
0db0: 6e 5f 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  n_cursor object.
0dc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
0dd0: 78 70 6c 61 69 6e 4f 70 65 6e 28 73 71 6c 69 74  xplainOpen(sqlit
0de0: 65 33 5f 76 74 61 62 20 2a 70 2c 20 73 71 6c 69  e3_vtab *p, sqli
0df0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
0e00: 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 65  **ppCursor){.  e
0e10: 78 70 6c 61 69 6e 5f 63 75 72 73 6f 72 20 2a 70  xplain_cursor *p
0e20: 43 75 72 3b 0a 20 20 70 43 75 72 20 3d 20 73 71  Cur;.  pCur = sq
0e30: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
0e40: 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20  zeof(*pCur) );. 
0e50: 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20 72   if( pCur==0 ) r
0e60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
0e70: 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75  EM;.  memset(pCu
0e80: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43  r, 0, sizeof(*pC
0e90: 75 72 29 29 3b 0a 20 20 70 43 75 72 2d 3e 64 62  ur));.  pCur->db
0ea0: 20 3d 20 28 28 65 78 70 6c 61 69 6e 5f 76 74 61   = ((explain_vta
0eb0: 62 2a 29 70 29 2d 3e 64 62 3b 0a 20 20 2a 70 70  b*)p)->db;.  *pp
0ec0: 43 75 72 73 6f 72 20 3d 20 26 70 43 75 72 2d 3e  Cursor = &pCur->
0ed0: 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  base;.  return S
0ee0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
0ef0: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  ** Destructor fo
0f00: 72 20 61 20 65 78 70 6c 61 69 6e 5f 63 75 72 73  r a explain_curs
0f10: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
0f20: 74 20 65 78 70 6c 61 69 6e 43 6c 6f 73 65 28 73  t explainClose(s
0f30: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
0f40: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 65 78 70 6c  or *cur){.  expl
0f50: 61 69 6e 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ain_cursor *pCur
0f60: 20 3d 20 28 65 78 70 6c 61 69 6e 5f 63 75 72 73   = (explain_curs
0f70: 6f 72 2a 29 63 75 72 3b 0a 20 20 73 71 6c 69 74  or*)cur;.  sqlit
0f80: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 75 72  e3_finalize(pCur
0f90: 2d 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 73  ->pExplain);.  s
0fa0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
0fb0: 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  ->zSql);.  sqlit
0fc0: 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 0a 20  e3_free(pCur);. 
0fd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
0fe0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  K;.}.../*.** Adv
0ff0: 61 6e 63 65 20 61 20 65 78 70 6c 61 69 6e 5f 63  ance a explain_c
1000: 75 72 73 6f 72 20 74 6f 20 69 74 73 20 6e 65 78  ursor to its nex
1010: 74 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e  t row of output.
1020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
1030: 78 70 6c 61 69 6e 4e 65 78 74 28 73 71 6c 69 74  xplainNext(sqlit
1040: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
1050: 63 75 72 29 7b 0a 20 20 65 78 70 6c 61 69 6e 5f  cur){.  explain_
1060: 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
1070: 65 78 70 6c 61 69 6e 5f 63 75 72 73 6f 72 2a 29  explain_cursor*)
1080: 63 75 72 3b 0a 20 20 70 43 75 72 2d 3e 72 63 20  cur;.  pCur->rc 
1090: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
10a0: 43 75 72 2d 3e 70 45 78 70 6c 61 69 6e 29 3b 0a  Cur->pExplain);.
10b0: 20 20 69 66 28 20 70 43 75 72 2d 3e 72 63 21 3d    if( pCur->rc!=
10c0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 70  SQLITE_DONE && p
10d0: 43 75 72 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  Cur->rc!=SQLITE_
10e0: 52 4f 57 20 29 20 72 65 74 75 72 6e 20 70 43 75  ROW ) return pCu
10f0: 72 2d 3e 72 63 3b 0a 20 20 72 65 74 75 72 6e 20  r->rc;.  return 
1100: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1110: 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  .** Return value
1120: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  s of columns for
1130: 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
1140: 68 20 74 68 65 20 65 78 70 6c 61 69 6e 5f 63 75  h the explain_cu
1150: 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65  rsor.** is curre
1160: 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
1170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1180: 6c 61 69 6e 43 6f 6c 75 6d 6e 28 0a 20 20 73 71  lainColumn(.  sq
1190: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
11a0: 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68 65  r *cur,   /* The
11b0: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71 6c   cursor */.  sql
11c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
11d0: 78 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  x,       /* Firs
11e0: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  t argument to sq
11f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e 2e  lite3_result_...
1200: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20 20 20  () */.  int i   
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c      /* Which col
1230: 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  umn to return */
1240: 0a 29 7b 0a 20 20 65 78 70 6c 61 69 6e 5f 63 75  .){.  explain_cu
1250: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 65 78  rsor *pCur = (ex
1260: 70 6c 61 69 6e 5f 63 75 72 73 6f 72 2a 29 63 75  plain_cursor*)cu
1270: 72 3b 0a 20 20 69 66 28 20 69 3d 3d 45 58 50 4c  r;.  if( i==EXPL
1280: 4e 5f 43 4f 4c 55 4d 4e 5f 53 51 4c 20 29 7b 0a  N_COLUMN_SQL ){.
1290: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
12a0: 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43 75  lt_text(ctx, pCu
12b0: 72 2d 3e 7a 53 71 6c 2c 20 2d 31 2c 20 53 51 4c  r->zSql, -1, SQL
12c0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
12d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
12e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
12f0: 65 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 63  e(ctx, sqlite3_c
1300: 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 75 72  olumn_value(pCur
1310: 2d 3e 70 45 78 70 6c 61 69 6e 2c 20 69 29 29 3b  ->pExplain, i));
1320: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1330: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1340: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77  * Return the row
1350: 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  id for the curre
1360: 6e 74 20 72 6f 77 2e 20 20 49 6e 20 74 68 69 73  nt row.  In this
1370: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
1380: 20 74 68 65 0a 2a 2a 20 72 6f 77 69 64 20 69 73   the.** rowid is
1390: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
13a0: 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 0a 2a   output value..*
13b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
13c0: 6c 61 69 6e 52 6f 77 69 64 28 73 71 6c 69 74 65  lainRowid(sqlite
13d0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
13e0: 75 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ur, sqlite_int64
13f0: 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20 65 78 70   *pRowid){.  exp
1400: 6c 61 69 6e 5f 63 75 72 73 6f 72 20 2a 70 43 75  lain_cursor *pCu
1410: 72 20 3d 20 28 65 78 70 6c 61 69 6e 5f 63 75 72  r = (explain_cur
1420: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 2a 70 52 6f  sor*)cur;.  *pRo
1430: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  wid = sqlite3_co
1440: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 43 75 72 2d  lumn_int64(pCur-
1450: 3e 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20  >pExplain, 0);. 
1460: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1470: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
1480: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
1490: 75 72 73 6f 72 20 68 61 73 20 62 65 65 6e 20 6d  ursor has been m
14a0: 6f 76 65 64 20 6f 66 66 20 6f 66 20 74 68 65 20  oved off of the 
14b0: 6c 61 73 74 0a 2a 2a 20 72 6f 77 20 6f 66 20 6f  last.** row of o
14c0: 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  utput..*/.static
14d0: 20 69 6e 74 20 65 78 70 6c 61 69 6e 45 6f 66 28   int explainEof(
14e0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
14f0: 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 65 78 70  sor *cur){.  exp
1500: 6c 61 69 6e 5f 63 75 72 73 6f 72 20 2a 70 43 75  lain_cursor *pCu
1510: 72 20 3d 20 28 65 78 70 6c 61 69 6e 5f 63 75 72  r = (explain_cur
1520: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 72 65 74 75  sor*)cur;.  retu
1530: 72 6e 20 70 43 75 72 2d 3e 72 63 21 3d 53 51 4c  rn pCur->rc!=SQL
1540: 49 54 45 5f 52 4f 57 3b 0a 7d 0a 0a 2f 2a 0a 2a  ITE_ROW;.}../*.*
1550: 2a 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73  * This method is
1560: 20 63 61 6c 6c 65 64 20 74 6f 20 22 72 65 77 69   called to "rewi
1570: 6e 64 22 20 74 68 65 20 65 78 70 6c 61 69 6e 5f  nd" the explain_
1580: 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 62 61  cursor object ba
1590: 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  ck.** to the fir
15a0: 73 74 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  st row of output
15b0: 2e 20 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69  .  This method i
15c0: 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20  s always called 
15d0: 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 63 65  at least.** once
15e0: 20 70 72 69 6f 72 20 74 6f 20 61 6e 79 20 63 61   prior to any ca
15f0: 6c 6c 20 74 6f 20 65 78 70 6c 61 69 6e 43 6f 6c  ll to explainCol
1600: 75 6d 6e 28 29 20 6f 72 20 65 78 70 6c 61 69 6e  umn() or explain
1610: 52 6f 77 69 64 28 29 20 6f 72 20 0a 2a 2a 20 65  Rowid() or .** e
1620: 78 70 6c 61 69 6e 45 6f 66 28 29 2e 0a 2a 2a 0a  xplainEof()..**.
1630: 2a 2a 20 54 68 65 20 61 72 67 76 5b 30 5d 20 69  ** The argv[0] i
1640: 73 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  s the SQL statem
1650: 65 6e 74 20 74 68 61 74 20 69 73 20 74 6f 20 62  ent that is to b
1660: 65 20 65 78 70 6c 61 69 6e 65 64 2e 0a 2a 2f 0a  e explained..*/.
1670: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 6c 61  static int expla
1680: 69 6e 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69  inFilter(.  sqli
1690: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
16a0: 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20  *pVtabCursor, . 
16b0: 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e   int idxNum, con
16c0: 73 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c  st char *idxStr,
16d0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  .  int argc, sql
16e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
16f0: 76 0a 29 7b 0a 20 20 65 78 70 6c 61 69 6e 5f 63  v.){.  explain_c
1700: 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 65  ursor *pCur = (e
1710: 78 70 6c 61 69 6e 5f 63 75 72 73 6f 72 20 2a 29  xplain_cursor *)
1720: 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 63  pVtabCursor;.  c
1730: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20  har *zSql = 0;. 
1740: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1750: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 75 72  e3_finalize(pCur
1760: 2d 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 70  ->pExplain);.  p
1770: 43 75 72 2d 3e 70 45 78 70 6c 61 69 6e 20 3d 20  Cur->pExplain = 
1780: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
1790: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
17a0: 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 54 45 58  [0])!=SQLITE_TEX
17b0: 54 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 72  T ){.    pCur->r
17c0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
17d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17e0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  TE_OK;.  }.  sql
17f0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
1800: 7a 53 71 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 7a  zSql);.  pCur->z
1810: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1820: 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
1830: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1840: 72 67 76 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  rgv[0]));.  if( 
1850: 70 43 75 72 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  pCur->zSql ){.  
1860: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1870: 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49  _mprintf("EXPLAI
1880: 4e 20 25 73 22 2c 20 70 43 75 72 2d 3e 7a 53 71  N %s", pCur->zSq
1890: 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53  l);.  }.  if( zS
18a0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ql==0 ){.    rc 
18b0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
18c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
18d0: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
18e0: 65 5f 76 32 28 70 43 75 72 2d 3e 64 62 2c 20 7a  e_v2(pCur->db, z
18f0: 53 71 6c 2c 20 2d 31 2c 20 26 70 43 75 72 2d 3e  Sql, -1, &pCur->
1900: 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
1910: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1920: 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Sql);.  }.  if( 
1930: 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
1940: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 75 72 2d  3_finalize(pCur-
1950: 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  >pExplain);.    
1960: 70 43 75 72 2d 3e 70 45 78 70 6c 61 69 6e 20 3d  pCur->pExplain =
1970: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
1980: 66 72 65 65 28 70 43 75 72 2d 3e 7a 53 71 6c 29  free(pCur->zSql)
1990: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 7a 53 71 6c  ;.    pCur->zSql
19a0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
19b0: 20 20 20 70 43 75 72 2d 3e 72 63 20 3d 20 73 71     pCur->rc = sq
19c0: 6c 69 74 65 33 5f 73 74 65 70 28 70 43 75 72 2d  lite3_step(pCur-
19d0: 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  >pExplain);.    
19e0: 72 63 20 3d 20 28 70 43 75 72 2d 3e 72 63 3d 3d  rc = (pCur->rc==
19f0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 70  SQLITE_DONE || p
1a00: 43 75 72 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  Cur->rc==SQLITE_
1a10: 52 4f 57 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  ROW) ? SQLITE_OK
1a20: 20 3a 20 70 43 75 72 2d 3e 72 63 3b 0a 20 20 7d   : pCur->rc;.  }
1a30: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a40: 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 77 69  ./*.** SQLite wi
1a50: 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6d  ll invoke this m
1a60: 65 74 68 6f 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  ethod one or mor
1a70: 65 20 74 69 6d 65 73 20 77 68 69 6c 65 20 70 6c  e times while pl
1a80: 61 6e 6e 69 6e 67 20 61 20 71 75 65 72 79 0a 2a  anning a query.*
1a90: 2a 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  * that uses the 
1aa0: 65 78 70 6c 61 69 6e 20 76 69 72 74 75 61 6c 20  explain virtual 
1ab0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  table.  This rou
1ac0: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 63 72  tine needs to cr
1ad0: 65 61 74 65 0a 2a 2a 20 61 20 71 75 65 72 79 20  eate.** a query 
1ae0: 70 6c 61 6e 20 66 6f 72 20 65 61 63 68 20 69 6e  plan for each in
1af0: 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6d  vocation and com
1b00: 70 75 74 65 20 61 6e 20 65 73 74 69 6d 61 74 65  pute an estimate
1b10: 64 20 63 6f 73 74 20 66 6f 72 20 74 68 61 74 0a  d cost for that.
1b20: 2a 2a 20 70 6c 61 6e 2e 0a 2a 2f 0a 73 74 61 74  ** plan..*/.stat
1b30: 69 63 20 69 6e 74 20 65 78 70 6c 61 69 6e 42 65  ic int explainBe
1b40: 73 74 49 6e 64 65 78 28 0a 20 20 73 71 6c 69 74  stIndex(.  sqlit
1b50: 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 0a 20 20  e3_vtab *tab,.  
1b60: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1b70: 66 6f 20 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a  fo *pIdxInfo.){.
1b80: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1ba0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
1bb0: 6e 74 20 69 64 78 20 3d 20 2d 31 3b 20 20 20 20  nt idx = -1;    
1bc0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1bd0: 6f 66 20 61 20 75 73 61 62 6c 65 20 3d 3d 20 63  of a usable == c
1be0: 6f 6e 73 74 72 61 69 6e 74 20 61 67 61 69 6e 73  onstraint agains
1bf0: 74 20 53 51 4c 20 2a 2f 0a 20 20 69 6e 74 20 75  t SQL */.  int u
1c00: 6e 75 73 61 62 6c 65 20 3d 20 30 3b 20 20 20 20  nusable = 0;    
1c10: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1c20: 65 72 65 20 61 72 65 20 75 6e 75 73 61 62 6c 65  ere are unusable
1c30: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
1c40: 53 51 4c 20 2a 2f 0a 0a 20 20 70 49 64 78 49 6e  SQL */..  pIdxIn
1c50: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
1c60: 73 20 3d 20 35 30 30 3b 0a 20 20 66 6f 72 28 69  s = 500;.  for(i
1c70: 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
1c80: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
1c90: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71  ){.    struct sq
1ca0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1cb0: 74 72 61 69 6e 74 20 2a 70 20 3d 20 26 70 49 64  traint *p = &pId
1cc0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
1cd0: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
1ce0: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 45 58 50 4c 4e  ->iColumn!=EXPLN
1cf0: 5f 43 4f 4c 55 4d 4e 5f 53 51 4c 20 29 20 63 6f  _COLUMN_SQL ) co
1d00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1d10: 21 70 2d 3e 75 73 61 62 6c 65 20 29 7b 0a 20 20  !p->usable ){.  
1d20: 20 20 20 20 75 6e 75 73 61 62 6c 65 20 3d 20 31      unusable = 1
1d30: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1d40: 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  p->op==SQLITE_IN
1d50: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
1d60: 51 20 29 7b 0a 20 20 20 20 20 20 69 64 78 20 3d  Q ){.      idx =
1d70: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   i;.    }.  }.  
1d80: 69 66 28 20 69 64 78 3e 3d 30 20 29 7b 0a 20 20  if( idx>=0 ){.  
1d90: 20 20 2f 2a 20 54 68 65 72 65 20 65 78 69 73 74    /* There exist
1da0: 73 20 61 20 75 73 61 62 6c 65 20 3d 3d 20 63 6f  s a usable == co
1db0: 6e 73 74 72 61 69 6e 74 20 61 67 61 69 6e 73 74  nstraint against
1dc0: 20 74 68 65 20 53 51 4c 20 63 6f 6c 75 6d 6e 20   the SQL column 
1dd0: 2a 2f 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  */.    pIdxInfo-
1de0: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
1df0: 20 31 30 2e 30 3b 0a 20 20 20 20 70 49 64 78 49   10.0;.    pIdxI
1e00: 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 31 3b  nfo->idxNum = 1;
1e10: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  .    pIdxInfo->a
1e20: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
1e30: 69 64 78 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  idx].argvIndex =
1e40: 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   1;.    pIdxInfo
1e50: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
1e60: 67 65 5b 69 64 78 5d 2e 6f 6d 69 74 20 3d 20 31  ge[idx].omit = 1
1e70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 75 6e  ;.  }else if( un
1e80: 75 73 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  usable ){.    /*
1e90: 20 54 68 65 72 65 20 61 72 65 20 75 6e 75 73 61   There are unusa
1ea0: 62 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ble constraints 
1eb0: 61 67 61 69 6e 73 74 20 74 68 65 20 53 51 4c 20  against the SQL 
1ec0: 63 6f 6c 75 6d 6e 2e 20 20 44 6f 20 6e 6f 74 20  column.  Do not 
1ed0: 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 74 68 69  allow.    ** thi
1ee0: 73 20 70 6c 61 6e 20 74 6f 20 63 6f 6e 74 69 6e  s plan to contin
1ef0: 75 65 20 66 6f 72 77 61 72 64 2e 20 2a 2f 0a 20  ue forward. */. 
1f00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f10: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 7d  _CONSTRAINT;.  }
1f20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1f40: 69 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  is following str
1f50: 75 63 74 75 72 65 20 64 65 66 69 6e 65 73 20 61  ucture defines a
1f60: 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 66  ll the methods f
1f70: 6f 72 20 74 68 65 20 0a 2a 2a 20 65 78 70 6c 61  or the .** expla
1f80: 69 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  in virtual table
1f90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
1fa0: 74 65 33 5f 6d 6f 64 75 6c 65 20 65 78 70 6c 61  te3_module expla
1fb0: 69 6e 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30  inModule = {.  0
1fc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
1fe0: 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  rsion */.  0,   
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65        /* xCreate
2010: 20 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6e   */.  explainCon
2020: 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  nect,           
2030: 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a   /* xConnect */.
2040: 20 20 65 78 70 6c 61 69 6e 42 65 73 74 49 6e 64    explainBestInd
2050: 65 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ex,          /* 
2060: 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20  xBestIndex */.  
2070: 65 78 70 6c 61 69 6e 44 69 73 63 6f 6e 6e 65 63  explainDisconnec
2080: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  t,         /* xD
2090: 69 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 30  isconnect */.  0
20a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
20c0: 73 74 72 6f 79 20 2a 2f 0a 20 20 65 78 70 6c 61  stroy */.  expla
20d0: 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  inOpen,         
20e0: 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d        /* xOpen -
20f0: 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a   open a cursor *
2100: 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6c 6f 73 65  /.  explainClose
2110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2120: 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65  * xClose - close
2130: 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 65   a cursor */.  e
2140: 78 70 6c 61 69 6e 46 69 6c 74 65 72 2c 20 20 20  xplainFilter,   
2150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
2160: 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65  lter - configure
2170: 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74   scan constraint
2180: 73 20 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 4e 65  s */.  explainNe
2190: 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
21a0: 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76    /* xNext - adv
21b0: 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  ance a cursor */
21c0: 0a 20 20 65 78 70 6c 61 69 6e 45 6f 66 2c 20 20  .  explainEof,  
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21e0: 20 78 45 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f   xEof - check fo
21f0: 72 20 65 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f  r end of scan */
2200: 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6c 75 6d 6e  .  explainColumn
2210: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2220: 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20   xColumn - read 
2230: 64 61 74 61 20 2a 2f 0a 20 20 65 78 70 6c 61 69  data */.  explai
2240: 6e 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  nRowid,         
2250: 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d       /* xRowid -
2260: 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
2270: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2290: 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20 20 20  pdate */.  0,   
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20        /* xBegin 
22c0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c  /* xSync */.  0,
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d           /* xCom
2310: 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  mit */.  0,     
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
2340: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20   /* xFindMethod 
2370: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 20 20  /* xRename */.  
23a0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
23b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
23c0: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c  avepoint */.  0,
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c           /* xRel
23f0: 65 61 73 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  ease */.  0,    
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63       /* xRollbac
2420: 6b 54 6f 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  kTo */.  0,     
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e 61      /* xShadowNa
2450: 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 65 6e 64 69 66  me */.};..#endif
2460: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2470: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
2480: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 6c  .int sqlite3Expl
2490: 61 69 6e 56 74 61 62 49 6e 69 74 28 73 71 6c 69  ainVtabInit(sqli
24a0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
24b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
24e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
24f0: 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62  create_module(db
2500: 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 26 65 78  , "explain", &ex
2510: 70 6c 61 69 6e 4d 6f 64 75 6c 65 2c 20 30 29 3b  plainModule, 0);
2520: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
2530: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f   rc;.}..#ifdef _
2540: 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63  WIN32.__declspec
2550: 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64  (dllexport).#end
2560: 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  if.int sqlite3_e
2570: 78 70 6c 61 69 6e 5f 69 6e 69 74 28 0a 20 20 73  xplain_init(.  s
2580: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
2590: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20  har **pzErrMsg, 
25a0: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
25b0: 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70  _api_routines *p
25c0: 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Api.){.  int rc 
25d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53  = SQLITE_OK;.  S
25e0: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
25f0: 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 23 69 66  INIT2(pApi);.#if
2600: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2610: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
2620: 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 6c  rc = sqlite3Expl
2630: 61 69 6e 56 74 61 62 49 6e 69 74 28 64 62 29 3b  ainVtabInit(db);
2640: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
2650: 20 72 63 3b 0a 7d 0a                              rc;.}.