/ Hex Artifact Content
Login

Artifact 31d0d8f4406795679dcd3a67917c213d3a2a5fb3ea5de35f6e773491ed7e13c9:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 2d 30 38 2d 31 30  /*.** 2017-08-10
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: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 76 69 72  implements a vir
0190: 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
01a0: 70 72 69 6e 74 73 20 64 69 61 67 6e 6f 73 74 69  prints diagnosti
01b0: 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  c information.**
01c0: 20 6f 6e 20 73 74 64 6f 75 74 20 77 68 65 6e 20   on stdout when 
01d0: 69 74 73 20 6b 65 79 20 69 6e 74 65 72 66 61 63  its key interfac
01e0: 65 73 20 61 72 65 20 63 61 6c 6c 65 64 2e 20 20  es are called.  
01f0: 54 68 69 73 20 69 73 20 69 6e 74 65 6e 64 65 64  This is intended
0200: 20 66 6f 72 0a 2a 2a 20 69 6e 74 65 72 61 63 74   for.** interact
0210: 69 76 65 20 61 6e 61 6c 79 73 69 73 20 61 6e 64  ive analysis and
0220: 20 64 65 62 75 67 67 69 6e 67 20 6f 66 20 76 69   debugging of vi
0230: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 74 65  rtual table inte
0240: 72 66 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 55 73  rfaces..**.** Us
0250: 61 67 65 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  age example:.**.
0260: 2a 2a 20 20 20 20 20 2e 6c 6f 61 64 20 2e 2f 76  **     .load ./v
0270: 74 61 62 6c 6f 67 0a 2a 2a 20 20 20 20 20 43 52  tablog.**     CR
0280: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
0290: 4c 45 20 74 65 6d 70 2e 6c 6f 67 20 55 53 49 4e  LE temp.log USIN
02a0: 47 20 76 74 61 62 6c 6f 67 28 0a 2a 2a 20 20 20  G vtablog(.**   
02b0: 20 20 20 20 20 73 63 68 65 6d 61 3d 27 43 52 45       schema='CRE
02c0: 41 54 45 20 54 41 42 4c 45 20 78 28 61 2c 62 2c  ATE TABLE x(a,b,
02d0: 63 29 27 2c 0a 2a 2a 20 20 20 20 20 20 20 20 72  c)',.**        r
02e0: 6f 77 73 3d 32 35 0a 2a 2a 20 20 20 20 20 29 3b  ows=25.**     );
02f0: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a  .**     SELECT *
0300: 20 46 52 4f 4d 20 6c 6f 67 3b 0a 2a 2f 0a 23 69   FROM log;.*/.#i
0310: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 65  nclude "sqlite3e
0320: 78 74 2e 68 22 0a 53 51 4c 49 54 45 5f 45 58 54  xt.h".SQLITE_EXT
0330: 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e  ENSION_INIT1.#in
0340: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0350: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
0360: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .h>.#include <as
0370: 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  sert.h>.#include
0380: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
0390: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a  lude <ctype.h>..
03a0: 0a 2f 2a 20 76 74 61 62 6c 6f 67 5f 76 74 61 62  ./* vtablog_vtab
03b0: 20 69 73 20 61 20 73 75 62 63 6c 61 73 73 20 6f   is a subclass o
03c0: 66 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 77  f sqlite3_vtab w
03d0: 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 73 65 72  hich will.** ser
03e0: 76 65 20 61 73 20 74 68 65 20 75 6e 64 65 72 6c  ve as the underl
03f0: 79 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ying representat
0400: 69 6f 6e 20 6f 66 20 61 20 76 74 61 62 6c 6f 67  ion of a vtablog
0410: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a   virtual table.*
0420: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0430: 20 76 74 61 62 6c 6f 67 5f 76 74 61 62 20 76 74   vtablog_vtab vt
0440: 61 62 6c 6f 67 5f 76 74 61 62 3b 0a 73 74 72 75  ablog_vtab;.stru
0450: 63 74 20 76 74 61 62 6c 6f 67 5f 76 74 61 62 20  ct vtablog_vtab 
0460: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
0470: 20 62 61 73 65 3b 20 20 2f 2a 20 42 61 73 65 20   base;  /* Base 
0480: 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20  class - must be 
0490: 66 69 72 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  first */.  int n
04a0: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Row;           /
04b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
04c0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
04d0: 0a 20 20 69 6e 74 20 69 49 6e 73 74 3b 20 20 20  .  int iInst;   
04e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 61 6e         /* Instan
04f0: 63 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ce number for th
0500: 69 73 20 76 74 61 62 6c 6f 67 20 74 61 62 6c 65  is vtablog table
0510: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f   */.  int nCurso
0520: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  r;        /* Num
0530: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ber of cursors c
0540: 72 65 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  reated */.};../*
0550: 20 76 74 61 62 6c 6f 67 5f 63 75 72 73 6f 72 20   vtablog_cursor 
0560: 69 73 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66  is a subclass of
0570: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
0580: 72 73 6f 72 20 77 68 69 63 68 20 77 69 6c 6c 0a  rsor which will.
0590: 2a 2a 20 73 65 72 76 65 20 61 73 20 74 68 65 20  ** serve as the 
05a0: 75 6e 64 65 72 6c 79 69 6e 67 20 72 65 70 72 65  underlying repre
05b0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 63  sentation of a c
05c0: 75 72 73 6f 72 20 74 68 61 74 20 73 63 61 6e 73  ursor that scans
05d0: 0a 2a 2a 20 6f 76 65 72 20 72 6f 77 73 20 6f 66  .** over rows of
05e0: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2f 0a 74   the result.*/.t
05f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 76 74  ypedef struct vt
0600: 61 62 6c 6f 67 5f 63 75 72 73 6f 72 20 76 74 61  ablog_cursor vta
0610: 62 6c 6f 67 5f 63 75 72 73 6f 72 3b 0a 73 74 72  blog_cursor;.str
0620: 75 63 74 20 76 74 61 62 6c 6f 67 5f 63 75 72 73  uct vtablog_curs
0630: 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  or {.  sqlite3_v
0640: 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b  tab_cursor base;
0650: 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20    /* Base class 
0660: 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73 74 20  - must be first 
0670: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  */.  int iCursor
0680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0690: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
06b0: 74 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  t64 iRowid;     
06c0: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 2a 2f   /* The rowid */
06d0: 0a 7d 3b 0a 0a 2f 2a 20 53 6b 69 70 20 6c 65 61  .};../* Skip lea
06e0: 64 69 6e 67 20 77 68 69 74 65 73 70 61 63 65 2e  ding whitespace.
06f0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
0700: 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
0710: 6e 6f 6e 2d 77 68 69 74 65 73 70 61 63 65 0a 2a  non-whitespace.*
0720: 2a 20 63 68 61 72 61 63 74 65 72 2c 20 6f 72 20  * character, or 
0730: 74 6f 20 74 68 65 20 7a 65 72 6f 20 74 65 72 6d  to the zero term
0740: 69 6e 61 74 6f 72 20 69 66 20 74 68 65 20 73 74  inator if the st
0750: 72 69 6e 67 20 68 61 73 20 6f 6e 6c 79 20 77 68  ring has only wh
0760: 69 74 65 73 70 61 63 65 20 2a 2f 0a 73 74 61 74  itespace */.stat
0770: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76  ic const char *v
0780: 74 61 62 6c 6f 67 5f 73 6b 69 70 5f 77 68 69 74  tablog_skip_whit
0790: 65 73 70 61 63 65 28 63 6f 6e 73 74 20 63 68 61  espace(const cha
07a0: 72 20 2a 7a 29 7b 0a 20 20 77 68 69 6c 65 28 20  r *z){.  while( 
07b0: 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65  isspace((unsigne
07c0: 64 20 63 68 61 72 29 7a 5b 30 5d 29 20 29 20 7a  d char)z[0]) ) z
07d0: 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  ++;.  return z;.
07e0: 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 74 72 61  }../* Remove tra
07f0: 69 6c 69 6e 67 20 77 68 69 74 65 73 70 61 63 65  iling whitespace
0800: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
0810: 20 73 74 72 69 6e 67 20 7a 5b 5d 20 2a 2f 0a 73   string z[] */.s
0820: 74 61 74 69 63 20 76 6f 69 64 20 76 74 61 62 6c  tatic void vtabl
0830: 6f 67 5f 74 72 69 6d 5f 77 68 69 74 65 73 70 61  og_trim_whitespa
0840: 63 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 73  ce(char *z){.  s
0850: 69 7a 65 5f 74 20 6e 20 3d 20 73 74 72 6c 65 6e  ize_t n = strlen
0860: 28 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e  (z);.  while( n>
0870: 30 20 26 26 20 69 73 73 70 61 63 65 28 28 75 6e  0 && isspace((un
0880: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 6e 5d  signed char)z[n]
0890: 29 20 29 20 6e 2d 2d 3b 0a 20 20 7a 5b 6e 5d 20  ) ) n--;.  z[n] 
08a0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 44 65 71 75 6f  = 0;.}../* Dequo
08b0: 74 65 20 74 68 65 20 73 74 72 69 6e 67 20 2a 2f  te the string */
08c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 74 61  .static void vta
08d0: 62 6c 6f 67 5f 64 65 71 75 6f 74 65 28 63 68 61  blog_dequote(cha
08e0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a  r *z){.  int j;.
08f0: 20 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20    char cQuote = 
0900: 7a 5b 30 5d 3b 0a 20 20 73 69 7a 65 5f 74 20 69  z[0];.  size_t i
0910: 2c 20 6e 3b 0a 0a 20 20 69 66 28 20 63 51 75 6f  , n;..  if( cQuo
0920: 74 65 21 3d 27 5c 27 27 20 26 26 20 63 51 75 6f  te!='\'' && cQuo
0930: 74 65 21 3d 27 22 27 20 29 20 72 65 74 75 72 6e  te!='"' ) return
0940: 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  ;.  n = strlen(z
0950: 29 3b 0a 20 20 69 66 28 20 6e 3c 32 20 7c 7c 20  );.  if( n<2 || 
0960: 7a 5b 6e 2d 31 5d 21 3d 7a 5b 30 5d 20 29 20 72  z[n-1]!=z[0] ) r
0970: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 31  eturn;.  for(i=1
0980: 2c 20 6a 3d 30 3b 20 69 3c 6e 2d 31 3b 20 69 2b  , j=0; i<n-1; i+
0990: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  +){.    if( z[i]
09a0: 3d 3d 63 51 75 6f 74 65 20 26 26 20 7a 5b 69 2b  ==cQuote && z[i+
09b0: 31 5d 3d 3d 63 51 75 6f 74 65 20 29 20 69 2b 2b  1]==cQuote ) i++
09c0: 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a  ;.    z[j++] = z
09d0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  [i];.  }.  z[j] 
09e0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b  = 0;.}../* Check
09f0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73   to see if the s
0a00: 74 72 69 6e 67 20 69 73 20 6f 66 20 74 68 65 20  tring is of the 
0a10: 66 6f 72 6d 3a 20 20 22 54 41 47 20 3d 20 56 41  form:  "TAG = VA
0a20: 4c 55 45 22 20 77 69 74 68 20 6f 70 74 69 6f 6e  LUE" with option
0a30: 61 6c 0a 2a 2a 20 77 68 69 74 65 73 70 61 63 65  al.** whitespace
0a40: 20 62 65 66 6f 72 65 20 61 6e 64 20 61 72 6f 75   before and arou
0a50: 6e 64 20 74 6f 6b 65 6e 73 2e 20 20 49 66 20 69  nd tokens.  If i
0a60: 74 20 69 73 2c 20 72 65 74 75 72 6e 20 61 20 70  t is, return a p
0a70: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
0a80: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
0a90: 20 6f 66 20 56 41 4c 55 45 2e 20 20 49 66 20 69   of VALUE.  If i
0aa0: 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
0ab0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
0ac0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 74 61   const char *vta
0ad0: 62 6c 6f 67 5f 70 61 72 61 6d 65 74 65 72 28 63  blog_parameter(c
0ae0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 67 2c  onst char *zTag,
0af0: 20 69 6e 74 20 6e 54 61 67 2c 20 63 6f 6e 73 74   int nTag, const
0b00: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 7a 20 3d   char *z){.  z =
0b10: 20 76 74 61 62 6c 6f 67 5f 73 6b 69 70 5f 77 68   vtablog_skip_wh
0b20: 69 74 65 73 70 61 63 65 28 7a 29 3b 0a 20 20 69  itespace(z);.  i
0b30: 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61 67 2c  f( strncmp(zTag,
0b40: 20 7a 2c 20 6e 54 61 67 29 21 3d 30 20 29 20 72   z, nTag)!=0 ) r
0b50: 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 76  eturn 0;.  z = v
0b60: 74 61 62 6c 6f 67 5f 73 6b 69 70 5f 77 68 69 74  tablog_skip_whit
0b70: 65 73 70 61 63 65 28 7a 2b 6e 54 61 67 29 3b 0a  espace(z+nTag);.
0b80: 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3d 27 20    if( z[0]!='=' 
0b90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
0ba0: 74 75 72 6e 20 76 74 61 62 6c 6f 67 5f 73 6b 69  turn vtablog_ski
0bb0: 70 5f 77 68 69 74 65 73 70 61 63 65 28 7a 2b 31  p_whitespace(z+1
0bc0: 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 63 6f 64 65 20  );.}../* Decode 
0bd0: 61 20 70 61 72 61 6d 65 74 65 72 20 74 68 61 74  a parameter that
0be0: 20 72 65 71 75 69 72 65 73 20 61 20 64 65 71 75   requires a dequ
0bf0: 6f 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  oted string..**.
0c00: 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
0c10: 72 6f 20 6f 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  ro on an error..
0c20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
0c30: 61 62 6c 6f 67 5f 73 74 72 69 6e 67 5f 70 61 72  ablog_string_par
0c40: 61 6d 65 74 65 72 28 0a 20 20 63 68 61 72 20 2a  ameter(.  char *
0c50: 2a 70 7a 45 72 72 2c 20 20 20 20 20 20 20 20 20  *pzErr,         
0c60: 20 20 20 2f 2a 20 4c 65 61 76 65 20 74 68 65 20     /* Leave the 
0c70: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65  error message he
0c80: 72 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  re, if there is 
0c90: 6f 6e 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  one */.  const c
0ca0: 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20  har *zParam,    
0cb0: 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 77    /* Parameter w
0cc0: 65 20 61 72 65 20 63 68 65 63 6b 69 6e 67 20 66  e are checking f
0cd0: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
0ce0: 61 72 20 2a 7a 41 72 67 2c 20 20 20 20 20 20 20  ar *zArg,       
0cf0: 20 2f 2a 20 52 61 77 20 74 65 78 74 20 6f 66 20   /* Raw text of 
0d00: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
0d10: 65 20 61 72 67 6d 65 6e 74 20 2a 2f 0a 20 20 63  e argment */.  c
0d20: 68 61 72 20 2a 2a 70 7a 56 61 6c 20 20 20 20 20  har **pzVal     
0d30: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
0d40: 20 74 68 65 20 64 65 71 75 6f 74 65 64 20 73 74   the dequoted st
0d50: 72 69 6e 67 20 76 61 6c 75 65 20 68 65 72 65 20  ring value here 
0d60: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
0d70: 61 72 20 2a 7a 56 61 6c 75 65 3b 0a 20 20 7a 56  ar *zValue;.  zV
0d80: 61 6c 75 65 20 3d 20 76 74 61 62 6c 6f 67 5f 70  alue = vtablog_p
0d90: 61 72 61 6d 65 74 65 72 28 7a 50 61 72 61 6d 2c  arameter(zParam,
0da0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 50 61 72  (int)strlen(zPar
0db0: 61 6d 29 2c 7a 41 72 67 29 3b 0a 20 20 69 66 28  am),zArg);.  if(
0dc0: 20 7a 56 61 6c 75 65 3d 3d 30 20 29 20 72 65 74   zValue==0 ) ret
0dd0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 2a 70 7a  urn 0;.  if( *pz
0de0: 56 61 6c 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  Val ){.    *pzEr
0df0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
0e00: 6e 74 66 28 22 6d 6f 72 65 20 74 68 61 6e 20 6f  ntf("more than o
0e10: 6e 65 20 27 25 73 27 20 70 61 72 61 6d 65 74 65  ne '%s' paramete
0e20: 72 22 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20  r", zParam);.   
0e30: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
0e40: 20 2a 70 7a 56 61 6c 20 3d 20 73 71 6c 69 74 65   *pzVal = sqlite
0e50: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
0e60: 7a 56 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 2a  zValue);.  if( *
0e70: 70 7a 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pzVal==0 ){.    
0e80: 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
0e90: 5f 6d 70 72 69 6e 74 66 28 22 6f 75 74 20 6f 66  _mprintf("out of
0ea0: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72   memory");.    r
0eb0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 76  eturn 1;.  }.  v
0ec0: 74 61 62 6c 6f 67 5f 74 72 69 6d 5f 77 68 69 74  tablog_trim_whit
0ed0: 65 73 70 61 63 65 28 2a 70 7a 56 61 6c 29 3b 0a  espace(*pzVal);.
0ee0: 20 20 76 74 61 62 6c 6f 67 5f 64 65 71 75 6f 74    vtablog_dequot
0ef0: 65 28 2a 70 7a 56 61 6c 29 3b 0a 20 20 72 65 74  e(*pzVal);.  ret
0f00: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 20 30 20  urn 0;.}..#if 0 
0f10: 2f 2a 20 6e 6f 74 20 75 73 65 64 20 2d 20 79 65  /* not used - ye
0f20: 74 20 2a 2f 0a 2f 2a 20 52 65 74 75 72 6e 20 30  t */./* Return 0
0f30: 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
0f40: 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 31 20   is false and 1 
0f50: 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 20 20  if it is true.  
0f60: 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20  Return -1 if.** 
0f70: 77 65 20 63 61 6e 6e 6f 74 20 72 65 61 6c 6c 79  we cannot really
0f80: 20 74 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   tell..*/.static
0f90: 20 69 6e 74 20 76 74 61 62 6c 6f 67 5f 62 6f 6f   int vtablog_boo
0fa0: 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  lean(const char 
0fb0: 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
0fc0: 65 33 5f 73 74 72 69 63 6d 70 28 22 79 65 73 22  e3_stricmp("yes"
0fd0: 2c 7a 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 71 6c  ,z)==0.   || sql
0fe0: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22 6f 6e  ite3_stricmp("on
0ff0: 22 2c 7a 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 71  ",z)==0.   || sq
1000: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22 74  lite3_stricmp("t
1010: 72 75 65 22 2c 7a 29 3d 3d 30 0a 20 20 20 7c 7c  rue",z)==0.   ||
1020: 20 28 7a 5b 30 5d 3d 3d 27 31 27 20 26 26 20 7a   (z[0]=='1' && z
1030: 5b 31 5d 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  [1]==0).  ){.   
1040: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1050: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1060: 69 63 6d 70 28 22 6e 6f 22 2c 7a 29 3d 3d 30 0a  icmp("no",z)==0.
1070: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74     || sqlite3_st
1080: 72 69 63 6d 70 28 22 6f 66 66 22 2c 7a 29 3d 3d  ricmp("off",z)==
1090: 30 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f  0.   || sqlite3_
10a0: 73 74 72 69 63 6d 70 28 22 66 61 6c 73 65 22 2c  stricmp("false",
10b0: 7a 29 3d 3d 30 0a 20 20 20 7c 7c 20 28 7a 5b 30  z)==0.   || (z[0
10c0: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
10d0: 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  0).  ){.    retu
10e0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
10f0: 72 6e 20 2d 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn -1;.}.#endif.
1100: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76 74 61 62 6c  ./*.** The vtabl
1110: 6f 67 43 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68  ogConnect() meth
1120: 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  od is invoked to
1130: 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a   create a new.**
1140: 20 76 74 61 62 6c 6f 67 5f 76 74 61 62 20 74 68   vtablog_vtab th
1150: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
1160: 20 76 74 61 62 6c 6f 67 20 76 69 72 74 75 61 6c   vtablog virtual
1170: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
1180: 69 6e 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ink of this rout
1190: 69 6e 65 20 61 73 20 74 68 65 20 63 6f 6e 73 74  ine as the const
11a0: 72 75 63 74 6f 72 20 66 6f 72 20 76 74 61 62 6c  ructor for vtabl
11b0: 6f 67 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 2e  og_vtab objects.
11c0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20  .**.** All this 
11d0: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
11e0: 20 64 6f 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   do is:.**.**   
11f0: 20 28 31 29 20 41 6c 6c 6f 63 61 74 65 20 74 68   (1) Allocate th
1200: 65 20 76 74 61 62 6c 6f 67 5f 76 74 61 62 20 6f  e vtablog_vtab o
1210: 62 6a 65 63 74 20 61 6e 64 20 69 6e 69 74 69 61  bject and initia
1220: 6c 69 7a 65 20 61 6c 6c 20 66 69 65 6c 64 73 2e  lize all fields.
1230: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 54 65  .**.**    (2) Te
1240: 6c 6c 20 53 51 4c 69 74 65 20 28 76 69 61 20 74  ll SQLite (via t
1250: 68 65 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  he sqlite3_decla
1260: 72 65 5f 76 74 61 62 28 29 20 69 6e 74 65 72 66  re_vtab() interf
1270: 61 63 65 29 20 77 68 61 74 20 74 68 65 0a 2a 2a  ace) what the.**
1280: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 73          result s
1290: 65 74 20 6f 66 20 71 75 65 72 69 65 73 20 61 67  et of queries ag
12a0: 61 69 6e 73 74 20 76 74 61 62 6c 6f 67 20 77 69  ainst vtablog wi
12b0: 6c 6c 20 6c 6f 6f 6b 20 6c 69 6b 65 2e 0a 2a 2f  ll look like..*/
12c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62  .static int vtab
12d0: 6c 6f 67 43 6f 6e 6e 65 63 74 43 72 65 61 74 65  logConnectCreate
12e0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
12f0: 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20  .  void *pAux,. 
1300: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
1310: 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
1320: 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  v,.  sqlite3_vta
1330: 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68  b **ppVtab,.  ch
1340: 61 72 20 2a 2a 70 7a 45 72 72 2c 0a 20 20 69 6e  ar **pzErr,.  in
1350: 74 20 69 73 43 72 65 61 74 65 0a 29 7b 0a 20 20  t isCreate.){.  
1360: 73 74 61 74 69 63 20 69 6e 74 20 6e 49 6e 73 74  static int nInst
1370: 20 3d 20 30 3b 0a 20 20 76 74 61 62 6c 6f 67 5f   = 0;.  vtablog_
1380: 76 74 61 62 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  vtab *pNew;.  in
1390: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  t i;.  int rc;. 
13a0: 20 69 6e 74 20 69 49 6e 73 74 20 3d 20 2b 2b 6e   int iInst = ++n
13b0: 49 6e 73 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Inst;.  char *zS
13c0: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 63 68 61  chema = 0;.  cha
13d0: 72 20 2a 7a 4e 52 6f 77 20 3d 20 30 3b 0a 0a 20  r *zNRow = 0;.. 
13e0: 20 70 72 69 6e 74 66 28 22 76 74 61 62 6c 6f 67   printf("vtablog
13f0: 25 73 28 74 61 62 3d 25 64 29 3a 5c 6e 22 2c 20  %s(tab=%d):\n", 
1400: 69 73 43 72 65 61 74 65 20 3f 20 22 43 72 65 61  isCreate ? "Crea
1410: 74 65 22 20 3a 20 22 43 6f 6e 6e 65 63 74 22 2c  te" : "Connect",
1420: 20 69 49 6e 73 74 29 3b 0a 20 20 70 72 69 6e 74   iInst);.  print
1430: 66 28 22 20 20 61 72 67 63 3d 25 64 5c 6e 22 2c  f("  argc=%d\n",
1440: 20 61 72 67 63 29 3b 0a 20 20 66 6f 72 28 69 3d   argc);.  for(i=
1450: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
1460: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 61  .    printf("  a
1470: 72 67 76 5b 25 64 5d 20 3d 20 22 2c 20 69 29 3b  rgv[%d] = ", i);
1480: 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d  .    if( argv[i]
1490: 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66   ){.      printf
14a0: 28 22 5b 25 73 5d 5c 6e 22 2c 20 61 72 67 76 5b  ("[%s]\n", argv[
14b0: 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  i]);.    }else{.
14c0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 4e 55        printf("NU
14d0: 4c 4c 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  LL\n");.    }.  
14e0: 7d 0a 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c  }..  for(i=3; i<
14f0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
1500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1510: 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28  argv[i];.    if(
1520: 20 76 74 61 62 6c 6f 67 5f 73 74 72 69 6e 67 5f   vtablog_string_
1530: 70 61 72 61 6d 65 74 65 72 28 70 7a 45 72 72 2c  parameter(pzErr,
1540: 20 22 73 63 68 65 6d 61 22 2c 20 7a 2c 20 26 7a   "schema", z, &z
1550: 53 63 68 65 6d 61 29 20 29 7b 0a 20 20 20 20 20  Schema) ){.     
1560: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1570: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
1580: 69 66 28 20 76 74 61 62 6c 6f 67 5f 73 74 72 69  if( vtablog_stri
1590: 6e 67 5f 70 61 72 61 6d 65 74 65 72 28 70 7a 45  ng_parameter(pzE
15a0: 72 72 2c 20 22 72 6f 77 73 22 2c 20 7a 2c 20 26  rr, "rows", z, &
15b0: 7a 4e 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20  zNRow) ){.      
15c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
15d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ROR;.    }.  }..
15e0: 20 20 69 66 28 20 7a 53 63 68 65 6d 61 3d 3d 30    if( zSchema==0
15f0: 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d   ){.    *pzErr =
1600: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1610: 28 22 6e 6f 20 73 63 68 65 6d 61 20 64 65 66 69  ("no schema defi
1620: 6e 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ned");.    retur
1630: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1640: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1650: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
1660: 64 62 2c 20 7a 53 63 68 65 6d 61 29 3b 0a 20 20  db, zSchema);.  
1670: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1680: 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  K ){.    pNew = 
1690: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
16a0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
16b0: 0a 20 20 20 20 2a 70 70 56 74 61 62 20 3d 20 28  .    *ppVtab = (
16c0: 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 4e  sqlite3_vtab*)pN
16d0: 65 77 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ew;.    if( pNew
16e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
16f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d  ITE_NOMEM;.    m
1700: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
1710: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
1720: 20 20 20 70 4e 65 77 2d 3e 6e 52 6f 77 20 3d 20     pNew->nRow = 
1730: 31 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e 52 6f  10;.    if( zNRo
1740: 77 20 29 20 70 4e 65 77 2d 3e 6e 52 6f 77 20 3d  w ) pNew->nRow =
1750: 20 61 74 6f 69 28 7a 4e 52 6f 77 29 3b 0a 20 20   atoi(zNRow);.  
1760: 20 20 70 4e 65 77 2d 3e 69 49 6e 73 74 20 3d 20    pNew->iInst = 
1770: 69 49 6e 73 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iInst;.  }.  ret
1780: 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
1790: 20 69 6e 74 20 76 74 61 62 6c 6f 67 43 72 65 61   int vtablogCrea
17a0: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
17b0: 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  b,.  void *pAux,
17c0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  .  int argc, con
17d0: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
17e0: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgv,.  sqlite3_v
17f0: 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20  tab **ppVtab,.  
1800: 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
1810: 20 20 72 65 74 75 72 6e 20 76 74 61 62 6c 6f 67    return vtablog
1820: 43 6f 6e 6e 65 63 74 43 72 65 61 74 65 28 64 62  ConnectCreate(db
1830: 2c 70 41 75 78 2c 61 72 67 63 2c 61 72 67 76 2c  ,pAux,argc,argv,
1840: 70 70 56 74 61 62 2c 70 7a 45 72 72 2c 31 29 3b  ppVtab,pzErr,1);
1850: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  .}.static int vt
1860: 61 62 6c 6f 67 43 6f 6e 6e 65 63 74 28 0a 20 20  ablogConnect(.  
1870: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
1880: 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
1890: 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
18a0: 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
18b0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
18c0: 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVtab,.  char *
18d0: 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74 75  *pzErr.){.  retu
18e0: 72 6e 20 76 74 61 62 6c 6f 67 43 6f 6e 6e 65 63  rn vtablogConnec
18f0: 74 43 72 65 61 74 65 28 64 62 2c 70 41 75 78 2c  tCreate(db,pAux,
1900: 61 72 67 63 2c 61 72 67 76 2c 70 70 56 74 61 62  argc,argv,ppVtab
1910: 2c 70 7a 45 72 72 2c 30 29 3b 0a 7d 0a 0a 0a 2f  ,pzErr,0);.}.../
1920: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 74 68 6f 64  *.** This method
1930: 20 69 73 20 74 68 65 20 64 65 73 74 72 75 63 74   is the destruct
1940: 6f 72 20 66 6f 72 20 76 74 61 62 6c 6f 67 5f 63  or for vtablog_c
1950: 75 72 73 6f 72 20 6f 62 6a 65 63 74 73 2e 0a 2a  ursor objects..*
1960: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
1970: 62 6c 6f 67 44 69 73 63 6f 6e 6e 65 63 74 28 73  blogDisconnect(s
1980: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
1990: 61 62 29 7b 0a 20 20 76 74 61 62 6c 6f 67 5f 76  ab){.  vtablog_v
19a0: 74 61 62 20 2a 70 54 61 62 20 3d 20 28 76 74 61  tab *pTab = (vta
19b0: 62 6c 6f 67 5f 76 74 61 62 2a 29 70 56 74 61 62  blog_vtab*)pVtab
19c0: 3b 0a 20 20 70 72 69 6e 74 66 28 22 76 74 61 62  ;.  printf("vtab
19d0: 6c 6f 67 44 69 73 63 6f 6e 6e 65 63 74 28 25 64  logDisconnect(%d
19e0: 29 5c 6e 22 2c 20 70 54 61 62 2d 3e 69 49 6e 73  )\n", pTab->iIns
19f0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
1a00: 65 65 28 70 56 74 61 62 29 3b 0a 20 20 72 65 74  ee(pVtab);.  ret
1a10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 74  ../*.** This met
1a30: 68 6f 64 20 69 73 20 74 68 65 20 64 65 73 74 72  hod is the destr
1a40: 75 63 74 6f 72 20 66 6f 72 20 76 74 61 62 6c 6f  uctor for vtablo
1a50: 67 5f 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 73  g_cursor objects
1a60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a70: 76 74 61 62 6c 6f 67 44 65 73 74 72 6f 79 28 73  vtablogDestroy(s
1a80: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
1a90: 61 62 29 7b 0a 20 20 76 74 61 62 6c 6f 67 5f 76  ab){.  vtablog_v
1aa0: 74 61 62 20 2a 70 54 61 62 20 3d 20 28 76 74 61  tab *pTab = (vta
1ab0: 62 6c 6f 67 5f 76 74 61 62 2a 29 70 56 74 61 62  blog_vtab*)pVtab
1ac0: 3b 0a 20 20 70 72 69 6e 74 66 28 22 76 74 61 62  ;.  printf("vtab
1ad0: 6c 6f 67 44 65 73 74 72 6f 79 28 25 64 29 5c 6e  logDestroy(%d)\n
1ae0: 22 2c 20 70 54 61 62 2d 3e 69 49 6e 73 74 29 3b  ", pTab->iInst);
1af0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1b00: 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75 72 6e  pVtab);.  return
1b10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b20: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 6f 72  *.** Constructor
1b30: 20 66 6f 72 20 61 20 6e 65 77 20 76 74 61 62 6c   for a new vtabl
1b40: 6f 67 5f 63 75 72 73 6f 72 20 6f 62 6a 65 63 74  og_cursor object
1b50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b60: 76 74 61 62 6c 6f 67 4f 70 65 6e 28 73 71 6c 69  vtablogOpen(sqli
1b70: 74 65 33 5f 76 74 61 62 20 2a 70 2c 20 73 71 6c  te3_vtab *p, sql
1b80: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
1b90: 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20   **ppCursor){.  
1ba0: 76 74 61 62 6c 6f 67 5f 76 74 61 62 20 2a 70 54  vtablog_vtab *pT
1bb0: 61 62 20 3d 20 28 76 74 61 62 6c 6f 67 5f 76 74  ab = (vtablog_vt
1bc0: 61 62 2a 29 70 3b 0a 20 20 76 74 61 62 6c 6f 67  ab*)p;.  vtablog
1bd0: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  _cursor *pCur;. 
1be0: 20 70 72 69 6e 74 66 28 22 76 74 61 62 6c 6f 67   printf("vtablog
1bf0: 4f 70 65 6e 28 74 61 62 3d 25 64 2c 20 63 75 72  Open(tab=%d, cur
1c00: 73 6f 72 3d 25 64 29 5c 6e 22 2c 20 70 54 61 62  sor=%d)\n", pTab
1c10: 2d 3e 69 49 6e 73 74 2c 20 2b 2b 70 54 61 62 2d  ->iInst, ++pTab-
1c20: 3e 6e 43 75 72 73 6f 72 29 3b 0a 20 20 70 43 75  >nCursor);.  pCu
1c30: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
1c40: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 75 72  oc( sizeof(*pCur
1c50: 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d  ) );.  if( pCur=
1c60: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1c70: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
1c80: 65 74 28 70 43 75 72 2c 20 30 2c 20 73 69 7a 65  et(pCur, 0, size
1c90: 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 70 43  of(*pCur));.  pC
1ca0: 75 72 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 54  ur->iCursor = pT
1cb0: 61 62 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 2a  ab->nCursor;.  *
1cc0: 70 70 43 75 72 73 6f 72 20 3d 20 26 70 43 75 72  ppCursor = &pCur
1cd0: 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e  ->base;.  return
1ce0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1cf0: 2a 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 20  *.** Destructor 
1d00: 66 6f 72 20 61 20 76 74 61 62 6c 6f 67 5f 63 75  for a vtablog_cu
1d10: 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsor..*/.static 
1d20: 69 6e 74 20 76 74 61 62 6c 6f 67 43 6c 6f 73 65  int vtablogClose
1d30: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
1d40: 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 76 74  rsor *cur){.  vt
1d50: 61 62 6c 6f 67 5f 63 75 72 73 6f 72 20 2a 70 43  ablog_cursor *pC
1d60: 75 72 20 3d 20 28 76 74 61 62 6c 6f 67 5f 63 75  ur = (vtablog_cu
1d70: 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 76 74 61  rsor*)cur;.  vta
1d80: 62 6c 6f 67 5f 76 74 61 62 20 2a 70 54 61 62 20  blog_vtab *pTab 
1d90: 3d 20 28 76 74 61 62 6c 6f 67 5f 76 74 61 62 2a  = (vtablog_vtab*
1da0: 29 63 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70  )cur->pVtab;.  p
1db0: 72 69 6e 74 66 28 22 76 74 61 62 6c 6f 67 43 6c  rintf("vtablogCl
1dc0: 6f 73 65 28 74 61 62 3d 25 64 2c 20 63 75 72 73  ose(tab=%d, curs
1dd0: 6f 72 3d 25 64 29 5c 6e 22 2c 20 70 54 61 62 2d  or=%d)\n", pTab-
1de0: 3e 69 49 6e 73 74 2c 20 70 43 75 72 2d 3e 69 43  >iInst, pCur->iC
1df0: 75 72 73 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  ursor);.  sqlite
1e00: 33 5f 66 72 65 65 28 63 75 72 29 3b 0a 20 20 72  3_free(cur);.  r
1e10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  .}.../*.** Advan
1e30: 63 65 20 61 20 76 74 61 62 6c 6f 67 5f 63 75 72  ce a vtablog_cur
1e40: 73 6f 72 20 74 6f 20 69 74 73 20 6e 65 78 74 20  sor to its next 
1e50: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 0a 2a  row of output..*
1e60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
1e70: 62 6c 6f 67 4e 65 78 74 28 73 71 6c 69 74 65 33  blogNext(sqlite3
1e80: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
1e90: 72 29 7b 0a 20 20 76 74 61 62 6c 6f 67 5f 63 75  r){.  vtablog_cu
1ea0: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 76 74  rsor *pCur = (vt
1eb0: 61 62 6c 6f 67 5f 63 75 72 73 6f 72 2a 29 63 75  ablog_cursor*)cu
1ec0: 72 3b 0a 20 20 76 74 61 62 6c 6f 67 5f 76 74 61  r;.  vtablog_vta
1ed0: 62 20 2a 70 54 61 62 20 3d 20 28 76 74 61 62 6c  b *pTab = (vtabl
1ee0: 6f 67 5f 76 74 61 62 2a 29 63 75 72 2d 3e 70 56  og_vtab*)cur->pV
1ef0: 74 61 62 3b 0a 20 20 70 72 69 6e 74 66 28 22 76  tab;.  printf("v
1f00: 74 61 62 6c 6f 67 4e 65 78 74 28 74 61 62 3d 25  tablogNext(tab=%
1f10: 64 2c 20 63 75 72 73 6f 72 3d 25 64 29 20 20 72  d, cursor=%d)  r
1f20: 6f 77 69 64 20 25 64 20 2d 3e 20 25 64 5c 6e 22  owid %d -> %d\n"
1f30: 2c 20 0a 20 20 20 20 20 20 20 20 20 70 54 61 62  , .         pTab
1f40: 2d 3e 69 49 6e 73 74 2c 20 70 43 75 72 2d 3e 69  ->iInst, pCur->i
1f50: 43 75 72 73 6f 72 2c 20 28 69 6e 74 29 70 43 75  Cursor, (int)pCu
1f60: 72 2d 3e 69 52 6f 77 69 64 2c 20 28 69 6e 74 29  r->iRowid, (int)
1f70: 70 43 75 72 2d 3e 69 52 6f 77 69 64 2b 31 29 3b  pCur->iRowid+1);
1f80: 0a 20 20 70 43 75 72 2d 3e 69 52 6f 77 69 64 2b  .  pCur->iRowid+
1f90: 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  +;.  return SQLI
1fa0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1fb0: 52 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66  Return values of
1fc0: 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68 65   columns for the
1fd0: 20 72 6f 77 20 61 74 20 77 68 69 63 68 20 74 68   row at which th
1fe0: 65 20 76 74 61 62 6c 6f 67 5f 63 75 72 73 6f 72  e vtablog_cursor
1ff0: 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
2000: 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 73 74   pointing..*/.st
2010: 61 74 69 63 20 69 6e 74 20 76 74 61 62 6c 6f 67  atic int vtablog
2020: 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65  Column(.  sqlite
2030: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
2040: 75 72 2c 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ur,   /* The cur
2050: 73 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  sor */.  sqlite3
2060: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 20  _context *ctx,  
2070: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
2080: 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65  gument to sqlite
2090: 33 5f 72 65 73 75 6c 74 5f 2e 2e 2e 28 29 20 2a  3_result_...() *
20a0: 2f 0a 20 20 69 6e 74 20 69 20 20 20 20 20 20 20  /.  int i       
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20  /* Which column 
20d0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a  to return */.){.
20e0: 20 20 76 74 61 62 6c 6f 67 5f 63 75 72 73 6f 72    vtablog_cursor
20f0: 20 2a 70 43 75 72 20 3d 20 28 76 74 61 62 6c 6f   *pCur = (vtablo
2100: 67 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20  g_cursor*)cur;. 
2110: 20 76 74 61 62 6c 6f 67 5f 76 74 61 62 20 2a 70   vtablog_vtab *p
2120: 54 61 62 20 3d 20 28 76 74 61 62 6c 6f 67 5f 76  Tab = (vtablog_v
2130: 74 61 62 2a 29 63 75 72 2d 3e 70 56 74 61 62 3b  tab*)cur->pVtab;
2140: 0a 20 20 63 68 61 72 20 7a 56 61 6c 5b 35 30 5d  .  char zVal[50]
2150: 3b 0a 0a 20 20 69 66 28 20 69 3c 32 36 20 29 7b  ;..  if( i<26 ){
2160: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2170: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 56 61  rintf(sizeof(zVa
2180: 6c 29 2c 7a 56 61 6c 2c 22 25 63 25 64 22 2c 20  l),zVal,"%c%d", 
2190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21a0: 20 20 20 20 20 20 22 61 62 63 64 65 66 67 68 69        "abcdefghi
21b0: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 7a  jklmnopqrstuvwyz
21c0: 22 5b 69 5d 2c 20 70 43 75 72 2d 3e 69 52 6f 77  "[i], pCur->iRow
21d0: 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  id);.  }else{.  
21e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
21f0: 74 66 28 73 69 7a 65 6f 66 28 7a 56 61 6c 29 2c  tf(sizeof(zVal),
2200: 7a 56 61 6c 2c 22 7b 25 64 7d 25 64 22 2c 20 69  zVal,"{%d}%d", i
2210: 2c 20 70 43 75 72 2d 3e 69 52 6f 77 69 64 29 3b  , pCur->iRowid);
2220: 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 76  .  }.  printf("v
2230: 74 61 62 6c 6f 67 43 6f 6c 75 6d 6e 28 74 61 62  tablogColumn(tab
2240: 3d 25 64 2c 20 63 75 72 73 6f 72 3d 25 64 2c 20  =%d, cursor=%d, 
2250: 69 3d 25 64 29 3a 20 5b 25 73 5d 5c 6e 22 2c 0a  i=%d): [%s]\n",.
2260: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 69           pTab->i
2270: 49 6e 73 74 2c 20 70 43 75 72 2d 3e 69 43 75 72  Inst, pCur->iCur
2280: 73 6f 72 2c 20 69 2c 20 7a 56 61 6c 29 3b 0a 20  sor, i, zVal);. 
2290: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
22a0: 74 65 78 74 28 63 74 78 2c 20 7a 56 61 6c 2c 20  text(ctx, zVal, 
22b0: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
22c0: 49 45 4e 54 29 3b 0a 20 20 72 65 74 75 72 6e 20  IENT);.  return 
22d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
22e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
22f0: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72  owid for the cur
2300: 72 65 6e 74 20 72 6f 77 2e 20 20 49 6e 20 74 68  rent row.  In th
2310: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
2320: 6e 2c 20 74 68 65 0a 2a 2a 20 72 6f 77 69 64 20  n, the.** rowid 
2330: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
2340: 68 65 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e  he output value.
2350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
2360: 74 61 62 6c 6f 67 52 6f 77 69 64 28 73 71 6c 69  tablogRowid(sqli
2370: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
2380: 2a 63 75 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74  *cur, sqlite_int
2390: 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20 76  64 *pRowid){.  v
23a0: 74 61 62 6c 6f 67 5f 63 75 72 73 6f 72 20 2a 70  tablog_cursor *p
23b0: 43 75 72 20 3d 20 28 76 74 61 62 6c 6f 67 5f 63  Cur = (vtablog_c
23c0: 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 76 74  ursor*)cur;.  vt
23d0: 61 62 6c 6f 67 5f 76 74 61 62 20 2a 70 54 61 62  ablog_vtab *pTab
23e0: 20 3d 20 28 76 74 61 62 6c 6f 67 5f 76 74 61 62   = (vtablog_vtab
23f0: 2a 29 63 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20  *)cur->pVtab;.  
2400: 70 72 69 6e 74 66 28 22 76 74 61 62 6c 6f 67 52  printf("vtablogR
2410: 6f 77 69 64 28 74 61 62 3d 25 64 2c 20 63 75 72  owid(tab=%d, cur
2420: 73 6f 72 3d 25 64 29 3a 20 25 64 5c 6e 22 2c 0a  sor=%d): %d\n",.
2430: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 69           pTab->i
2440: 49 6e 73 74 2c 20 70 43 75 72 2d 3e 69 43 75 72  Inst, pCur->iCur
2450: 73 6f 72 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e  sor, (int)pCur->
2460: 69 52 6f 77 69 64 29 3b 0a 20 20 2a 70 52 6f 77  iRowid);.  *pRow
2470: 69 64 20 3d 20 70 43 75 72 2d 3e 69 52 6f 77 69  id = pCur->iRowi
2480: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
2490: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
24a0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
24b0: 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 62 65  he cursor has be
24c0: 65 6e 20 6d 6f 76 65 64 20 6f 66 66 20 6f 66 20  en moved off of 
24d0: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 77 20  the last.** row 
24e0: 6f 66 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74  of output..*/.st
24f0: 61 74 69 63 20 69 6e 74 20 76 74 61 62 6c 6f 67  atic int vtablog
2500: 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62  Eof(sqlite3_vtab
2510: 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20  _cursor *cur){. 
2520: 20 76 74 61 62 6c 6f 67 5f 63 75 72 73 6f 72 20   vtablog_cursor 
2530: 2a 70 43 75 72 20 3d 20 28 76 74 61 62 6c 6f 67  *pCur = (vtablog
2540: 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20  _cursor*)cur;.  
2550: 76 74 61 62 6c 6f 67 5f 76 74 61 62 20 2a 70 54  vtablog_vtab *pT
2560: 61 62 20 3d 20 28 76 74 61 62 6c 6f 67 5f 76 74  ab = (vtablog_vt
2570: 61 62 2a 29 63 75 72 2d 3e 70 56 74 61 62 3b 0a  ab*)cur->pVtab;.
2580: 20 20 69 6e 74 20 72 63 20 3d 20 70 43 75 72 2d    int rc = pCur-
2590: 3e 69 52 6f 77 69 64 20 3e 3d 20 70 54 61 62 2d  >iRowid >= pTab-
25a0: 3e 6e 52 6f 77 3b 0a 20 20 70 72 69 6e 74 66 28  >nRow;.  printf(
25b0: 22 76 74 61 62 6c 6f 67 45 6f 66 28 74 61 62 3d  "vtablogEof(tab=
25c0: 25 64 2c 20 63 75 72 73 6f 72 3d 25 64 29 3a 20  %d, cursor=%d): 
25d0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
25e0: 70 54 61 62 2d 3e 69 49 6e 73 74 2c 20 70 43 75  pTab->iInst, pCu
25f0: 72 2d 3e 69 43 75 72 73 6f 72 2c 20 72 63 29 3b  r->iCursor, rc);
2600: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2610: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 6e  ./*.** Output an
2620: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f   sqlite3_value o
2630: 62 6a 65 63 74 27 73 20 76 61 6c 75 65 20 61 73  bject's value as
2640: 20 61 6e 20 53 51 4c 20 6c 69 74 65 72 61 6c 2e   an SQL literal.
2650: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2660: 76 74 61 62 6c 6f 67 51 75 6f 74 65 28 73 71 6c  vtablogQuote(sql
2670: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 29 7b 0a  ite3_value *p){.
2680: 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20    char z[50];.  
2690: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
26a0: 76 61 6c 75 65 5f 74 79 70 65 28 70 29 20 29 7b  value_type(p) ){
26b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
26c0: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 70  _NULL: {.      p
26d0: 72 69 6e 74 66 28 22 4e 55 4c 4c 22 29 3b 0a 20  rintf("NULL");. 
26e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26f0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2700: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
2710: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2720: 6e 74 66 28 35 30 2c 7a 2c 22 25 6c 6c 64 22 2c  ntf(50,z,"%lld",
2730: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2740: 6e 74 36 34 28 70 29 29 3b 0a 20 20 20 20 20 20  nt64(p));.      
2750: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 29 3b  printf("%s", z);
2760: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2770: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2780: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
2790: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
27a0: 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67  ntf(50,z,"%!.20g
27b0: 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ", sqlite3_value
27c0: 5f 64 6f 75 62 6c 65 28 70 29 29 3b 0a 20 20 20  _double(p));.   
27d0: 20 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 20     printf("%s", 
27e0: 7a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  z);.      break;
27f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2800: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20  SQLITE_BLOB: {. 
2810: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
2820: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
2830: 28 70 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  (p);.      const
2840: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2850: 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  z = (const unsig
2860: 6e 65 64 20 63 68 61 72 2a 29 73 71 6c 69 74 65  ned char*)sqlite
2870: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 29 3b  3_value_blob(p);
2880: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2890: 20 20 20 20 70 72 69 6e 74 66 28 22 78 27 22 29      printf("x'")
28a0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
28b0: 20 69 3c 6e 3b 20 69 2b 2b 29 20 70 72 69 6e 74   i<n; i++) print
28c0: 66 28 22 25 30 32 78 22 2c 20 7a 5b 69 5d 29 3b  f("%02x", z[i]);
28d0: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 27  .      printf("'
28e0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
28f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2900: 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20  SQLITE_TEXT: {. 
2910: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2920: 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
2930: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
2940: 74 65 78 74 28 70 29 3b 0a 20 20 20 20 20 20 69  text(p);.      i
2950: 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72  nt i;.      char
2960: 20 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   c;.      for(i=
2970: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
2980: 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b   && c!='\''; i++
2990: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ){}.      if( c=
29a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
29b0: 69 6e 74 66 28 22 27 25 73 27 22 2c 7a 29 3b 0a  intf("'%s'",z);.
29c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29d0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 27 22 29       printf("'")
29e0: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
29f0: 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20   *z ){.         
2a00: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
2a10: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  [i])!=0 && c!='\
2a20: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ''; i++){}.     
2a30: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27       if( c=='\''
2a40: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) i++;.        
2a50: 20 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20    if( i ){.     
2a60: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25         printf("%
2a70: 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20  .*s", i, z);.   
2a80: 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b           z += i;
2a90: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2aa0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
2ab0: 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  '' ){.          
2ac0: 20 20 70 72 69 6e 74 66 28 22 27 22 29 3b 0a 20    printf("'");. 
2ad0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2ae0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
2af0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
2b00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2b10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b30: 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  z++;.        }. 
2b40: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 27         printf("'
2b50: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
2b60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2b70: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
2b80: 73 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  s method is call
2b90: 65 64 20 74 6f 20 22 72 65 77 69 6e 64 22 20 74  ed to "rewind" t
2ba0: 68 65 20 76 74 61 62 6c 6f 67 5f 63 75 72 73 6f  he vtablog_curso
2bb0: 72 20 6f 62 6a 65 63 74 20 62 61 63 6b 0a 2a 2a  r object back.**
2bc0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
2bd0: 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 54 68  w of output.  Th
2be0: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 61 6c 77  is method is alw
2bf0: 61 79 73 20 63 61 6c 6c 65 64 20 61 74 20 6c 65  ays called at le
2c00: 61 73 74 0a 2a 2a 20 6f 6e 63 65 20 70 72 69 6f  ast.** once prio
2c10: 72 20 74 6f 20 61 6e 79 20 63 61 6c 6c 20 74 6f  r to any call to
2c20: 20 76 74 61 62 6c 6f 67 43 6f 6c 75 6d 6e 28 29   vtablogColumn()
2c30: 20 6f 72 20 76 74 61 62 6c 6f 67 52 6f 77 69 64   or vtablogRowid
2c40: 28 29 20 6f 72 20 0a 2a 2a 20 76 74 61 62 6c 6f  () or .** vtablo
2c50: 67 45 6f 66 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  gEof()..*/.stati
2c60: 63 20 69 6e 74 20 76 74 61 62 6c 6f 67 46 69 6c  c int vtablogFil
2c70: 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ter(.  sqlite3_v
2c80: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c  tab_cursor *cur,
2c90: 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63  .  int idxNum, c
2ca0: 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53 74  onst char *idxSt
2cb0: 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73  r,.  int argc, s
2cc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2cd0: 72 67 76 0a 29 7b 0a 20 20 76 74 61 62 6c 6f 67  rgv.){.  vtablog
2ce0: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
2cf0: 28 76 74 61 62 6c 6f 67 5f 63 75 72 73 6f 72 20  (vtablog_cursor 
2d00: 2a 29 63 75 72 3b 0a 20 20 76 74 61 62 6c 6f 67  *)cur;.  vtablog
2d10: 5f 76 74 61 62 20 2a 70 54 61 62 20 3d 20 28 76  _vtab *pTab = (v
2d20: 74 61 62 6c 6f 67 5f 76 74 61 62 2a 29 63 75 72  tablog_vtab*)cur
2d30: 2d 3e 70 56 74 61 62 3b 0a 20 20 70 72 69 6e 74  ->pVtab;.  print
2d40: 66 28 22 76 74 61 62 6c 6f 67 46 69 6c 74 65 72  f("vtablogFilter
2d50: 28 74 61 62 3d 25 64 2c 20 63 75 72 73 6f 72 3d  (tab=%d, cursor=
2d60: 25 64 29 3a 5c 6e 22 2c 20 70 54 61 62 2d 3e 69  %d):\n", pTab->i
2d70: 49 6e 73 74 2c 20 70 43 75 72 2d 3e 69 43 75 72  Inst, pCur->iCur
2d80: 73 6f 72 29 3b 0a 20 20 70 43 75 72 2d 3e 69 52  sor);.  pCur->iR
2d90: 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  owid = 0;.  retu
2da0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2db0: 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 77 69  ./*.** SQLite wi
2dc0: 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6d  ll invoke this m
2dd0: 65 74 68 6f 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  ethod one or mor
2de0: 65 20 74 69 6d 65 73 20 77 68 69 6c 65 20 70 6c  e times while pl
2df0: 61 6e 6e 69 6e 67 20 61 20 71 75 65 72 79 0a 2a  anning a query.*
2e00: 2a 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  * that uses the 
2e10: 76 74 61 62 6c 6f 67 20 76 69 72 74 75 61 6c 20  vtablog virtual 
2e20: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  table.  This rou
2e30: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 63 72  tine needs to cr
2e40: 65 61 74 65 0a 2a 2a 20 61 20 71 75 65 72 79 20  eate.** a query 
2e50: 70 6c 61 6e 20 66 6f 72 20 65 61 63 68 20 69 6e  plan for each in
2e60: 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6d  vocation and com
2e70: 70 75 74 65 20 61 6e 20 65 73 74 69 6d 61 74 65  pute an estimate
2e80: 64 20 63 6f 73 74 20 66 6f 72 20 74 68 61 74 0a  d cost for that.
2e90: 2a 2a 20 70 6c 61 6e 2e 0a 2a 2f 0a 73 74 61 74  ** plan..*/.stat
2ea0: 69 63 20 69 6e 74 20 76 74 61 62 6c 6f 67 42 65  ic int vtablogBe
2eb0: 73 74 49 6e 64 65 78 28 0a 20 20 73 71 6c 69 74  stIndex(.  sqlit
2ec0: 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 0a 20 20  e3_vtab *tab,.  
2ed0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
2ee0: 66 6f 20 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a  fo *pIdxInfo.){.
2ef0: 20 20 76 74 61 62 6c 6f 67 5f 76 74 61 62 20 2a    vtablog_vtab *
2f00: 70 54 61 62 20 3d 20 28 76 74 61 62 6c 6f 67 5f  pTab = (vtablog_
2f10: 76 74 61 62 2a 29 74 61 62 3b 0a 20 20 70 72 69  vtab*)tab;.  pri
2f20: 6e 74 66 28 22 76 74 61 62 6c 6f 67 42 65 73 74  ntf("vtablogBest
2f30: 49 6e 64 65 78 28 74 61 62 3d 25 64 29 3a 5c 6e  Index(tab=%d):\n
2f40: 22 2c 20 70 54 61 62 2d 3e 69 49 6e 73 74 29 3b  ", pTab->iInst);
2f50: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
2f60: 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f  imatedCost = (do
2f70: 75 62 6c 65 29 35 30 30 3b 0a 20 20 70 49 64 78  uble)500;.  pIdx
2f80: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
2f90: 6f 77 73 20 3d 20 35 30 30 3b 0a 20 20 72 65 74  ows = 500;.  ret
2fa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2fb0: 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 69  ../*.** SQLite i
2fc0: 6e 76 6f 6b 65 73 20 74 68 69 73 20 6d 65 74 68  nvokes this meth
2fd0: 6f 64 20 74 6f 20 49 4e 53 45 52 54 2c 20 55 50  od to INSERT, UP
2fe0: 44 41 54 45 2c 20 6f 72 20 44 45 4c 45 54 45 20  DATE, or DELETE 
2ff0: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20  content from.** 
3000: 74 68 65 20 74 61 62 6c 65 2e 20 0a 2a 2a 0a 2a  the table. .**.*
3010: 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * This implement
3020: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ation does not a
3030: 63 74 75 61 6c 6c 79 20 6d 61 6b 65 20 61 6e 79  ctually make any
3040: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
3050: 74 61 62 6c 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  table.** content
3060: 2e 20 20 49 74 20 6d 65 72 65 6c 79 20 6c 6f 67  .  It merely log
3070: 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  s the fact that 
3080: 74 68 65 20 6d 65 74 68 6f 64 20 77 61 73 20 69  the method was i
3090: 6e 76 6f 6b 65 64 0a 2a 2f 0a 73 74 61 74 69 63  nvoked.*/.static
30a0: 20 69 6e 74 20 76 74 61 62 6c 6f 67 55 70 64 61   int vtablogUpda
30b0: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  te(.  sqlite3_vt
30c0: 61 62 20 2a 74 61 62 2c 0a 20 20 69 6e 74 20 61  ab *tab,.  int a
30d0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
30e0: 61 6c 75 65 20 2a 2a 61 72 67 76 2c 0a 20 20 73  alue **argv,.  s
30f0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f  qlite_int64 *pRo
3100: 77 69 64 0a 29 7b 0a 20 20 76 74 61 62 6c 6f 67  wid.){.  vtablog
3110: 5f 76 74 61 62 20 2a 70 54 61 62 20 3d 20 28 76  _vtab *pTab = (v
3120: 74 61 62 6c 6f 67 5f 76 74 61 62 2a 29 74 61 62  tablog_vtab*)tab
3130: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 72 69  ;.  int i;.  pri
3140: 6e 74 66 28 22 76 74 61 62 6c 6f 67 55 70 64 61  ntf("vtablogUpda
3150: 74 65 28 74 61 62 3d 25 64 29 3a 5c 6e 22 2c 20  te(tab=%d):\n", 
3160: 70 54 61 62 2d 3e 69 49 6e 73 74 29 3b 0a 20 20  pTab->iInst);.  
3170: 70 72 69 6e 74 66 28 22 20 20 61 72 67 63 3d 25  printf("  argc=%
3180: 64 5c 6e 22 2c 20 61 72 67 63 29 3b 0a 20 20 66  d\n", argc);.  f
3190: 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
31a0: 69 2b 2b 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  i++){.    printf
31b0: 28 22 20 20 61 72 67 76 5b 25 64 5d 3d 22 2c 20  ("  argv[%d]=", 
31c0: 69 29 3b 0a 20 20 20 20 76 74 61 62 6c 6f 67 51  i);.    vtablogQ
31d0: 75 6f 74 65 28 61 72 67 76 5b 69 5d 29 3b 0a 20  uote(argv[i]);. 
31e0: 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
31f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
3200: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3210: 2a 20 54 68 69 73 20 66 6f 6c 6c 6f 77 69 6e 67  * This following
3220: 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e   structure defin
3230: 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
3240: 64 73 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 76  ds for the .** v
3250: 74 61 62 6c 6f 67 20 76 69 72 74 75 61 6c 20 74  tablog virtual t
3260: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
3270: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 76  sqlite3_module v
3280: 74 61 62 6c 6f 67 4d 6f 64 75 6c 65 20 3d 20 7b  tablogModule = {
3290: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32b0: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 76   iVersion */.  v
32c0: 74 61 62 6c 6f 67 43 72 65 61 74 65 2c 20 20 20  tablogCreate,   
32d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72            /* xCr
32e0: 65 61 74 65 20 2a 2f 0a 20 20 76 74 61 62 6c 6f  eate */.  vtablo
32f0: 67 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  gConnect,       
3300: 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74       /* xConnect
3310: 20 2a 2f 0a 20 20 76 74 61 62 6c 6f 67 42 65 73   */.  vtablogBes
3320: 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  tIndex,         
3330: 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2a   /* xBestIndex *
3340: 2f 0a 20 20 76 74 61 62 6c 6f 67 44 69 73 63 6f  /.  vtablogDisco
3350: 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 2f  nnect,         /
3360: 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f  * xDisconnect */
3370: 0a 20 20 76 74 61 62 6c 6f 67 44 65 73 74 72 6f  .  vtablogDestro
3380: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y,            /*
3390: 20 78 44 65 73 74 72 6f 79 20 2a 2f 0a 20 20 76   xDestroy */.  v
33a0: 74 61 62 6c 6f 67 4f 70 65 6e 2c 20 20 20 20 20  tablogOpen,     
33b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
33c0: 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73  en - open a curs
33d0: 6f 72 20 2a 2f 0a 20 20 76 74 61 62 6c 6f 67 43  or */.  vtablogC
33e0: 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
33f0: 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63     /* xClose - c
3400: 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  lose a cursor */
3410: 0a 20 20 76 74 61 62 6c 6f 67 46 69 6c 74 65 72  .  vtablogFilter
3420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3430: 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69   xFilter - confi
3440: 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72  gure scan constr
3450: 61 69 6e 74 73 20 2a 2f 0a 20 20 76 74 61 62 6c  aints */.  vtabl
3460: 6f 67 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20  ogNext,         
3470: 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d        /* xNext -
3480: 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f   advance a curso
3490: 72 20 2a 2f 0a 20 20 76 74 61 62 6c 6f 67 45 6f  r */.  vtablogEo
34a0: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
34b0: 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63    /* xEof - chec
34c0: 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61  k for end of sca
34d0: 6e 20 2a 2f 0a 20 20 76 74 61 62 6c 6f 67 43 6f  n */.  vtablogCo
34e0: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
34f0: 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72    /* xColumn - r
3500: 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 76 74  ead data */.  vt
3510: 61 62 6c 6f 67 52 6f 77 69 64 2c 20 20 20 20 20  ablogRowid,     
3520: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77           /* xRow
3530: 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  id - read data *
3540: 2f 0a 20 20 76 74 61 62 6c 6f 67 55 70 64 61 74  /.  vtablogUpdat
3550: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
3560: 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30  * xUpdate */.  0
3570: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65            /* xBe
3590: 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  gin */.  0,     
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
35c0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35e0: 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20  xCommit */.  0, 
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3600: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
3610: 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20  back */.  0,    
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3630: 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74       /* xFindMet
3640: 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  hod */.  0,     
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a      /* xRename *
3670: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3690: 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  * xSavepoint */.
36a0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36c0: 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 2c  xRelease */.  0,
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c           /* xRol
36f0: 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 23  lbackTo */.};..#
3700: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64  ifdef _WIN32.__d
3710: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
3720: 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71  t).#endif.int sq
3730: 6c 69 74 65 33 5f 76 74 61 62 6c 6f 67 5f 69 6e  lite3_vtablog_in
3740: 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  it(.  sqlite3 *d
3750: 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  b, .  char **pzE
3760: 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e 73 74 20  rrMsg, .  const 
3770: 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
3780: 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20  ines *pApi.){.  
3790: 69 6e 74 20 72 63 3b 0a 20 20 53 51 4c 49 54 45  int rc;.  SQLITE
37a0: 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32  _EXTENSION_INIT2
37b0: 28 70 41 70 69 29 3b 0a 20 20 72 63 20 3d 20 73  (pApi);.  rc = s
37c0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f  qlite3_create_mo
37d0: 64 75 6c 65 28 64 62 2c 20 22 76 74 61 62 6c 6f  dule(db, "vtablo
37e0: 67 22 2c 20 26 76 74 61 62 6c 6f 67 4d 6f 64 75  g", &vtablogModu
37f0: 6c 65 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  le, 0);.  return
3800: 20 72 63 3b 0a 7d 0a                              rc;.}.