/ Hex Artifact Content
Login

Artifact 88333dc9f7dcf6a8148406f10ae04261e24e3b4c721550ae33e9e71f1265c1f1:


0000: 2f 2a 0a 2a 2a 20 32 30 31 36 2d 30 35 2d 32 38  /*.** 2016-05-28
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 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
0190: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
01a0: 20 6f 66 20 61 6e 20 53 51 4c 69 74 65 20 76 69   of an SQLite vi
01b0: 72 74 75 61 6c 20 74 61 62 6c 65 20 66 6f 72 0a  rtual table for.
01c0: 2a 2a 20 72 65 61 64 69 6e 67 20 43 53 56 20 66  ** reading CSV f
01d0: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  iles..**.** Usag
01e0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2e 6c 6f 61  e:.**.**    .loa
01f0: 64 20 2e 2f 63 73 76 0a 2a 2a 20 20 20 20 43 52  d ./csv.**    CR
0200: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
0210: 4c 45 20 74 65 6d 70 2e 63 73 76 20 55 53 49 4e  LE temp.csv USIN
0220: 47 20 63 73 76 28 66 69 6c 65 6e 61 6d 65 3d 46  G csv(filename=F
0230: 49 4c 45 4e 41 4d 45 29 3b 0a 2a 2a 20 20 20 20  ILENAME);.**    
0240: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 73  SELECT * FROM cs
0250: 76 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  v;.**.** The col
0260: 75 6d 6e 73 20 61 72 65 20 6e 61 6d 65 64 20 22  umns are named "
0270: 63 31 22 2c 20 22 63 32 22 2c 20 22 63 33 22 2c  c1", "c2", "c3",
0280: 20 2e 2e 2e 20 62 79 20 64 65 66 61 75 6c 74 2e   ... by default.
0290: 20 20 4f 72 20 74 68 65 0a 2a 2a 20 61 70 70 6c    Or the.** appl
02a0: 69 63 61 74 69 6f 6e 20 63 61 6e 20 64 65 66 69  ication can defi
02b0: 6e 65 20 69 74 73 20 6f 77 6e 20 43 52 45 41 54  ne its own CREAT
02c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
02d0: 74 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73  t using the.** s
02e0: 63 68 65 6d 61 3d 20 70 61 72 61 6d 65 74 65 72  chema= parameter
02f0: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
0300: 2a 2a 20 20 20 20 43 52 45 41 54 45 20 56 49 52  **    CREATE VIR
0310: 54 55 41 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e  TUAL TABLE temp.
0320: 63 73 76 32 20 55 53 49 4e 47 20 63 73 76 28 0a  csv2 USING csv(.
0330: 2a 2a 20 20 20 20 20 20 20 66 69 6c 65 6e 61 6d  **       filenam
0340: 65 20 3d 20 22 2e 2e 2f 68 74 74 70 2e 6c 6f 67  e = "../http.log
0350: 22 2c 0a 2a 2a 20 20 20 20 20 20 20 73 63 68 65  ",.**       sche
0360: 6d 61 20 3d 20 22 43 52 45 41 54 45 20 54 41 42  ma = "CREATE TAB
0370: 4c 45 20 78 28 64 61 74 65 2c 69 70 61 64 64 72  LE x(date,ipaddr
0380: 2c 75 72 6c 2c 72 65 66 65 72 72 65 72 2c 75 73  ,url,referrer,us
0390: 65 72 41 67 65 6e 74 29 22 0a 2a 2a 20 20 20 20  erAgent)".**    
03a0: 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  );.**.** Instead
03b0: 20 6f 66 20 73 70 65 63 69 66 79 69 6e 67 20 61   of specifying a
03c0: 20 66 69 6c 65 2c 20 74 68 65 20 74 65 78 74 20   file, the text 
03d0: 6f 66 20 74 68 65 20 43 53 56 20 63 61 6e 20 62  of the CSV can b
03e0: 65 20 6c 6f 61 64 65 64 20 75 73 69 6e 67 0a 2a  e loaded using.*
03f0: 2a 20 74 68 65 20 64 61 74 61 3d 20 70 61 72 61  * the data= para
0400: 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  meter..**.** If 
0410: 74 68 65 20 63 6f 6c 75 6d 6e 73 3d 4e 20 70 61  the columns=N pa
0420: 72 61 6d 65 74 65 72 20 69 73 20 73 75 70 70 6c  rameter is suppl
0430: 69 65 64 2c 20 74 68 65 6e 20 74 68 65 20 43 53  ied, then the CS
0440: 56 20 66 69 6c 65 20 69 73 20 61 73 73 75 6d 65  V file is assume
0450: 64 20 74 6f 20 68 61 76 65 0a 2a 2a 20 4e 20 63  d to have.** N c
0460: 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 62 6f 74 68  olumns.  If both
0470: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 3d 20 61 6e   the columns= an
0480: 64 20 73 63 68 65 6d 61 3d 20 70 61 72 61 6d 65  d schema= parame
0490: 74 65 72 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ters are omitted
04a0: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6e 75  , then.** the nu
04b0: 6d 62 65 72 20 61 6e 64 20 6e 61 6d 65 73 20 6f  mber and names o
04c0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 73  f the columns is
04d0: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
04e0: 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66  he first line of
04f0: 0a 2a 2a 20 74 68 65 20 43 53 56 20 69 6e 70 75  .** the CSV inpu
0500: 74 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 65 78  t..**.** Some ex
0510: 74 72 61 20 64 65 62 75 67 67 69 6e 67 20 66 65  tra debugging fe
0520: 61 74 75 72 65 73 20 28 75 73 65 64 20 66 6f 72  atures (used for
0530: 20 74 65 73 74 69 6e 67 20 76 69 72 74 75 61 6c   testing virtual
0540: 20 74 61 62 6c 65 73 29 20 61 72 65 20 61 76 61   tables) are ava
0550: 69 6c 61 62 6c 65 0a 2a 2a 20 69 66 20 74 68 69  ilable.** if thi
0560: 73 20 6d 6f 64 75 6c 65 20 69 73 20 63 6f 6d 70  s module is comp
0570: 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49  iled with -DSQLI
0580: 54 45 5f 54 45 53 54 2e 0a 2a 2f 0a 23 69 6e 63  TE_TEST..*/.#inc
0590: 6c 75 64 65 20 3c 73 71 6c 69 74 65 33 65 78 74  lude <sqlite3ext
05a0: 2e 68 3e 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e  .h>.SQLITE_EXTEN
05b0: 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c  SION_INIT1.#incl
05c0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
05d0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
05e0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h>.#include <ass
05f0: 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ert.h>.#include 
0600: 3c 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c  <stdarg.h>.#incl
0610: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0620: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
0630: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0640: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
0650: 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72  LE../*.** A macr
0660: 6f 20 74 6f 20 68 69 6e 74 20 74 6f 20 74 68 65  o to hint to the
0670: 20 63 6f 6d 70 69 6c 65 72 20 74 68 61 74 20 61   compiler that a
0680: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
0690: 20 6e 6f 74 20 62 65 0a 2a 2a 20 69 6e 6c 69 6e   not be.** inlin
06a0: 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ed..*/.#if defin
06b0: 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 20 20  ed(__GNUC__).#  
06c0: 64 65 66 69 6e 65 20 43 53 56 5f 4e 4f 49 4e 4c  define CSV_NOINL
06d0: 49 4e 45 20 20 5f 5f 61 74 74 72 69 62 75 74 65  INE  __attribute
06e0: 5f 5f 28 28 6e 6f 69 6e 6c 69 6e 65 29 29 0a 23  __((noinline)).#
06f0: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53  elif defined(_MS
0700: 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56  C_VER) && _MSC_V
0710: 45 52 3e 3d 31 33 31 30 0a 23 20 20 64 65 66 69  ER>=1310.#  defi
0720: 6e 65 20 43 53 56 5f 4e 4f 49 4e 4c 49 4e 45 20  ne CSV_NOINLINE 
0730: 20 5f 5f 64 65 63 6c 73 70 65 63 28 6e 6f 69 6e   __declspec(noin
0740: 6c 69 6e 65 29 0a 23 65 6c 73 65 0a 23 20 20 64  line).#else.#  d
0750: 65 66 69 6e 65 20 43 53 56 5f 4e 4f 49 4e 4c 49  efine CSV_NOINLI
0760: 4e 45 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 4d  NE.#endif.../* M
0770: 61 78 20 73 69 7a 65 20 6f 66 20 74 68 65 20 65  ax size of the e
0780: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
0790: 61 20 43 73 76 52 65 61 64 65 72 20 2a 2f 0a 23  a CsvReader */.#
07a0: 64 65 66 69 6e 65 20 43 53 56 5f 4d 58 45 52 52  define CSV_MXERR
07b0: 20 32 30 30 0a 0a 2f 2a 20 53 69 7a 65 20 6f 66   200../* Size of
07c0: 20 74 68 65 20 43 73 76 52 65 61 64 65 72 20 69   the CsvReader i
07d0: 6e 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23  nput buffer */.#
07e0: 64 65 66 69 6e 65 20 43 53 56 5f 49 4e 42 55 46  define CSV_INBUF
07f0: 53 5a 20 31 30 32 34 0a 0a 2f 2a 20 41 20 63 6f  SZ 1024../* A co
0800: 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 75 73 65  ntext object use
0810: 64 20 77 68 65 6e 20 72 65 61 64 20 61 20 43 53  d when read a CS
0820: 56 20 66 69 6c 65 2e 20 2a 2f 0a 74 79 70 65 64  V file. */.typed
0830: 65 66 20 73 74 72 75 63 74 20 43 73 76 52 65 61  ef struct CsvRea
0840: 64 65 72 20 43 73 76 52 65 61 64 65 72 3b 0a 73  der CsvReader;.s
0850: 74 72 75 63 74 20 43 73 76 52 65 61 64 65 72 20  truct CsvReader 
0860: 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20  {.  FILE *in;   
0870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
0880: 61 64 20 74 68 65 20 43 53 56 20 74 65 78 74 20  ad the CSV text 
0890: 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20  from this input 
08a0: 73 74 72 65 61 6d 20 2a 2f 0a 20 20 63 68 61 72  stream */.  char
08b0: 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
08c0: 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65     /* Accumulate
08d0: 64 20 74 65 78 74 20 66 6f 72 20 61 20 66 69 65  d text for a fie
08e0: 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ld */.  int n;  
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0900: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
0910: 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20  s in z */.  int 
0920: 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  nAlloc;         
0930: 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f     /* Space allo
0940: 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f  cated for z[] */
0950: 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20  .  int nLine;   
0960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
0970: 72 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  rent line number
0980: 20 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69   */.  int bNotFi
0990: 72 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rst;         /* 
09a0: 54 72 75 65 20 69 66 20 70 72 69 6f 72 20 74 65  True if prior te
09b0: 78 74 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  xt has been seen
09c0: 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b   */.  int cTerm;
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
09e0: 43 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74  Character that t
09f0: 65 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f  erminated the mo
0a00: 73 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20  st recent field 
0a10: 2a 2f 0a 20 20 73 69 7a 65 5f 74 20 69 49 6e 3b  */.  size_t iIn;
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0a30: 65 78 74 20 75 6e 72 65 61 64 20 63 68 61 72 61  ext unread chara
0a40: 63 74 65 72 20 69 6e 20 74 68 65 20 69 6e 70 75  cter in the inpu
0a50: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 73 69  t buffer */.  si
0a60: 7a 65 5f 74 20 6e 49 6e 3b 20 20 20 20 20 20 20  ze_t nIn;       
0a70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0a80: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
0a90: 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
0aa0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6e 3b   */.  char *zIn;
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0ac0: 54 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  The input buffer
0ad0: 20 2a 2f 0a 20 20 63 68 61 72 20 7a 45 72 72 5b   */.  char zErr[
0ae0: 43 53 56 5f 4d 58 45 52 52 5d 3b 20 20 2f 2a 20  CSV_MXERR];  /* 
0af0: 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  Error message */
0b00: 0a 7d 3b 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69  .};../* Initiali
0b10: 7a 65 20 61 20 43 73 76 52 65 61 64 65 72 20 6f  ze a CsvReader o
0b20: 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20  bject */.static 
0b30: 76 6f 69 64 20 63 73 76 5f 72 65 61 64 65 72 5f  void csv_reader_
0b40: 69 6e 69 74 28 43 73 76 52 65 61 64 65 72 20 2a  init(CsvReader *
0b50: 70 29 7b 0a 20 20 70 2d 3e 69 6e 20 3d 20 30 3b  p){.  p->in = 0;
0b60: 0a 20 20 70 2d 3e 7a 20 3d 20 30 3b 0a 20 20 70  .  p->z = 0;.  p
0b70: 2d 3e 6e 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 41  ->n = 0;.  p->nA
0b80: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  lloc = 0;.  p->n
0b90: 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 62  Line = 0;.  p->b
0ba0: 4e 6f 74 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  NotFirst = 0;.  
0bb0: 70 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 70 2d  p->nIn = 0;.  p-
0bc0: 3e 7a 49 6e 20 3d 20 30 3b 0a 20 20 70 2d 3e 7a  >zIn = 0;.  p->z
0bd0: 45 72 72 5b 30 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  Err[0] = 0;.}../
0be0: 2a 20 43 6c 6f 73 65 20 61 6e 64 20 72 65 73 65  * Close and rese
0bf0: 74 20 61 20 43 73 76 52 65 61 64 65 72 20 6f 62  t a CsvReader ob
0c00: 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 76  ject */.static v
0c10: 6f 69 64 20 63 73 76 5f 72 65 61 64 65 72 5f 72  oid csv_reader_r
0c20: 65 73 65 74 28 43 73 76 52 65 61 64 65 72 20 2a  eset(CsvReader *
0c30: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 20  p){.  if( p->in 
0c40: 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 70 2d  ){.    fclose(p-
0c50: 3e 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >in);.    sqlite
0c60: 33 5f 66 72 65 65 28 70 2d 3e 7a 49 6e 29 3b 0a  3_free(p->zIn);.
0c70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
0c80: 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 63 73 76 5f  ee(p->z);.  csv_
0c90: 72 65 61 64 65 72 5f 69 6e 69 74 28 70 29 3b 0a  reader_init(p);.
0ca0: 7d 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20  }../* Report an 
0cb0: 65 72 72 6f 72 20 6f 6e 20 61 20 43 73 76 52 65  error on a CsvRe
0cc0: 61 64 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 76  ader */.static v
0cd0: 6f 69 64 20 63 73 76 5f 65 72 72 6d 73 67 28 43  oid csv_errmsg(C
0ce0: 73 76 52 65 61 64 65 72 20 2a 70 2c 20 63 6f 6e  svReader *p, con
0cf0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
0d00: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
0d10: 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
0d20: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
0d30: 20 73 71 6c 69 74 65 33 5f 76 73 6e 70 72 69 6e   sqlite3_vsnprin
0d40: 74 66 28 43 53 56 5f 4d 58 45 52 52 2c 20 70 2d  tf(CSV_MXERR, p-
0d50: 3e 7a 45 72 72 2c 20 7a 46 6f 72 6d 61 74 2c 20  >zErr, zFormat, 
0d60: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
0d70: 29 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 74 68  );.}../* Open th
0d80: 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  e file associate
0d90: 64 20 77 69 74 68 20 61 20 43 73 76 52 65 61 64  d with a CsvRead
0da0: 65 72 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  er.** Return the
0db0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
0dc0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
0dd0: 20 63 73 76 5f 72 65 61 64 65 72 5f 6f 70 65 6e   csv_reader_open
0de0: 28 0a 20 20 43 73 76 52 65 61 64 65 72 20 2a 70  (.  CsvReader *p
0df0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
0e00: 2f 2a 20 54 68 65 20 72 65 61 64 65 72 20 74 6f  /* The reader to
0e10: 20 6f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74   open */.  const
0e20: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
0e30: 2c 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 66  ,      /* Read f
0e40: 72 6f 6d 20 74 68 69 73 20 66 69 6c 65 6e 61 6d  rom this filenam
0e50: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
0e60: 72 20 2a 7a 44 61 74 61 20 20 20 20 20 20 20 20  r *zData        
0e70: 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 72 20 75 73     /*  ... or us
0e80: 65 20 74 68 69 73 20 64 61 74 61 20 2a 2f 0a 29  e this data */.)
0e90: 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  {.  if( zFilenam
0ea0: 65 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 49 6e 20  e ){.    p->zIn 
0eb0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
0ec0: 28 20 43 53 56 5f 49 4e 42 55 46 53 5a 20 29 3b  ( CSV_INBUFSZ );
0ed0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 49 6e 3d  .    if( p->zIn=
0ee0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 73 76 5f  =0 ){.      csv_
0ef0: 65 72 72 6d 73 67 28 70 2c 20 22 6f 75 74 20 6f  errmsg(p, "out o
0f00: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
0f10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
0f20: 7d 0a 20 20 20 20 70 2d 3e 69 6e 20 3d 20 66 6f  }.    p->in = fo
0f30: 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  pen(zFilename, "
0f40: 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  rb");.    if( p-
0f50: 3e 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >in==0 ){.      
0f60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
0f70: 7a 49 6e 29 3b 0a 20 20 20 20 20 20 63 73 76 5f  zIn);.      csv_
0f80: 72 65 61 64 65 72 5f 72 65 73 65 74 28 70 29 3b  reader_reset(p);
0f90: 0a 20 20 20 20 20 20 63 73 76 5f 65 72 72 6d 73  .      csv_errms
0fa0: 67 28 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  g(p, "cannot ope
0fb0: 6e 20 27 25 73 27 20 66 6f 72 20 72 65 61 64 69  n '%s' for readi
0fc0: 6e 67 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  ng", zFilename);
0fd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
0fe0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
0ff0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
1000: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 7a  n==0 );.    p->z
1010: 49 6e 20 3d 20 28 63 68 61 72 2a 29 7a 44 61 74  In = (char*)zDat
1020: 61 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 20 3d 20  a;.    p->nIn = 
1030: 73 74 72 6c 65 6e 28 7a 44 61 74 61 29 3b 0a 20  strlen(zData);. 
1040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1050: 0a 0a 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 62  ../* The input b
1060: 75 66 66 65 72 20 68 61 73 20 6f 76 65 72 66 6c  uffer has overfl
1070: 6f 77 65 64 2e 20 20 52 65 66 69 6c 6c 20 74 68  owed.  Refill th
1080: 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 2c 20  e input buffer, 
1090: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74  then.** return t
10a0: 68 65 20 6e 65 78 74 20 63 68 61 72 61 63 74 65  he next characte
10b0: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 43 53 56 5f  r.*/.static CSV_
10c0: 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 63 73 76  NOINLINE int csv
10d0: 5f 67 65 74 63 5f 72 65 66 69 6c 6c 28 43 73 76  _getc_refill(Csv
10e0: 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20 73 69  Reader *p){.  si
10f0: 7a 65 5f 74 20 67 6f 74 3b 0a 0a 20 20 61 73 73  ze_t got;..  ass
1100: 65 72 74 28 20 70 2d 3e 69 49 6e 3e 3d 70 2d 3e  ert( p->iIn>=p->
1110: 6e 49 6e 20 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20  nIn );  /* Only 
1120: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 65 6d 70  called on an emp
1130: 74 79 20 69 6e 70 75 74 20 62 75 66 66 65 72 20  ty input buffer 
1140: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
1150: 69 6e 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  in!=0 );        
1160: 2f 2a 20 4f 6e 6c 79 20 63 61 6c 6c 65 64 20 69  /* Only called i
1170: 66 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 61 20  f reading froma 
1180: 66 69 6c 65 20 2a 2f 0a 0a 20 20 67 6f 74 20 3d  file */..  got =
1190: 20 66 72 65 61 64 28 70 2d 3e 7a 49 6e 2c 20 31   fread(p->zIn, 1
11a0: 2c 20 43 53 56 5f 49 4e 42 55 46 53 5a 2c 20 70  , CSV_INBUFSZ, p
11b0: 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 67 6f 74  ->in);.  if( got
11c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 45 4f 46  ==0 ) return EOF
11d0: 3b 0a 20 20 70 2d 3e 6e 49 6e 20 3d 20 67 6f 74  ;.  p->nIn = got
11e0: 3b 0a 20 20 70 2d 3e 69 49 6e 20 3d 20 31 3b 0a  ;.  p->iIn = 1;.
11f0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 49 6e 5b    return p->zIn[
1200: 30 5d 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  0];.}../* Return
1210: 20 74 68 65 20 6e 65 78 74 20 63 68 61 72 61 63   the next charac
1220: 74 65 72 20 6f 66 20 69 6e 70 75 74 2e 20 20 52  ter of input.  R
1230: 65 74 75 72 6e 20 45 4f 46 20 61 74 20 65 6e 64  eturn EOF at end
1240: 20 6f 66 20 69 6e 70 75 74 2e 20 2a 2f 0a 73 74   of input. */.st
1250: 61 74 69 63 20 69 6e 74 20 63 73 76 5f 67 65 74  atic int csv_get
1260: 63 28 43 73 76 52 65 61 64 65 72 20 2a 70 29 7b  c(CsvReader *p){
1270: 0a 20 20 69 66 28 20 70 2d 3e 69 49 6e 20 3e 3d  .  if( p->iIn >=
1280: 20 70 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 69   p->nIn ){.    i
1290: 66 28 20 70 2d 3e 69 6e 21 3d 30 20 29 20 72 65  f( p->in!=0 ) re
12a0: 74 75 72 6e 20 63 73 76 5f 67 65 74 63 5f 72 65  turn csv_getc_re
12b0: 66 69 6c 6c 28 70 29 3b 0a 20 20 20 20 72 65 74  fill(p);.    ret
12c0: 75 72 6e 20 45 4f 46 3b 0a 20 20 7d 0a 20 20 72  urn EOF;.  }.  r
12d0: 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
12e0: 20 63 68 61 72 2a 29 70 2d 3e 7a 49 6e 29 5b 70   char*)p->zIn)[p
12f0: 2d 3e 69 49 6e 2b 2b 5d 3b 0a 7d 0a 0a 2f 2a 20  ->iIn++];.}../* 
1300: 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  Increase the siz
1310: 65 20 6f 66 20 70 2d 3e 7a 20 61 6e 64 20 61 70  e of p->z and ap
1320: 70 65 6e 64 20 63 68 61 72 61 63 74 65 72 20 63  pend character c
1330: 20 74 6f 20 74 68 65 20 65 6e 64 2e 20 0a 2a 2a   to the end. .**
1340: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
1350: 63 65 73 73 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72  cess and non-zer
1360: 6f 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  o if there is an
1370: 20 4f 4f 4d 20 65 72 72 6f 72 20 2a 2f 0a 73 74   OOM error */.st
1380: 61 74 69 63 20 43 53 56 5f 4e 4f 49 4e 4c 49 4e  atic CSV_NOINLIN
1390: 45 20 69 6e 74 20 63 73 76 5f 72 65 73 69 7a 65  E int csv_resize
13a0: 5f 61 6e 64 5f 61 70 70 65 6e 64 28 43 73 76 52  _and_append(CsvR
13b0: 65 61 64 65 72 20 2a 70 2c 20 63 68 61 72 20 63  eader *p, char c
13c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  ){.  char *zNew;
13d0: 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 2d  .  int nNew = p-
13e0: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 30 3b  >nAlloc*2 + 100;
13f0: 0a 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  zNew = sqlite
1400: 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a  3_realloc64(p->z
1410: 2c 20 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 7a  , nNew);.  if( z
1420: 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 20  New ){.    p->z 
1430: 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e  = zNew;.    p->n
1440: 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20  Alloc = nNew;.  
1450: 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d    p->z[p->n++] =
1460: 20 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   c;.    return 0
1470: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
1480: 73 76 5f 65 72 72 6d 73 67 28 70 2c 20 22 6f 75  sv_errmsg(p, "ou
1490: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
14a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
14b0: 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20  .}../* Append a 
14c0: 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72  single character
14d0: 20 74 6f 20 74 68 65 20 43 73 76 52 65 61 64 65   to the CsvReade
14e0: 72 2e 7a 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20  r.z[] array..** 
14f0: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
1500: 65 73 73 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  ess and non-zero
1510: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1520: 4f 4f 4d 20 65 72 72 6f 72 20 2a 2f 0a 73 74 61  OOM error */.sta
1530: 74 69 63 20 69 6e 74 20 63 73 76 5f 61 70 70 65  tic int csv_appe
1540: 6e 64 28 43 73 76 52 65 61 64 65 72 20 2a 70 2c  nd(CsvReader *p,
1550: 20 63 68 61 72 20 63 29 7b 0a 20 20 69 66 28 20   char c){.  if( 
1560: 70 2d 3e 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 2d  p->n>=p->nAlloc-
1570: 31 20 29 20 72 65 74 75 72 6e 20 63 73 76 5f 72  1 ) return csv_r
1580: 65 73 69 7a 65 5f 61 6e 64 5f 61 70 70 65 6e 64  esize_and_append
1590: 28 70 2c 20 63 29 3b 0a 20 20 70 2d 3e 7a 5b 70  (p, c);.  p->z[p
15a0: 2d 3e 6e 2b 2b 5d 20 3d 20 63 3b 0a 20 20 72 65  ->n++] = c;.  re
15b0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 0;.}../* Re
15c0: 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c  ad a single fiel
15d0: 64 20 6f 66 20 43 53 56 20 74 65 78 74 2e 20 20  d of CSV text.  
15e0: 43 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  Compatible with 
15f0: 72 66 63 34 31 38 30 20 61 6e 64 20 65 78 74 65  rfc4180 and exte
1600: 6e 64 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  nded.** with the
1610: 20 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e   option of havin
1620: 67 20 61 20 73 65 70 61 72 61 74 6f 72 20 6f 74  g a separator ot
1630: 68 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a  her than ","..**
1640: 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63  .**   +  Input c
1650: 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e  omes from p->in.
1660: 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72  .**   +  Store r
1670: 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f  esults in p->z o
1680: 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20  f length p->n.  
1690: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d  Space to hold p-
16a0: 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20  >z comes.**     
16b0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
16c0: 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b  lloc64()..**   +
16d0: 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
16e0: 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  the line number 
16f0: 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20  in p->nLine..** 
1700: 20 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63    +  Store the c
1710: 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65  haracter that te
1720: 72 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69 65  rminates the fie
1730: 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20  ld in p->cTerm. 
1740: 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45   Store.**      E
1750: 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c  OF on end-of-fil
1760: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
1770: 30 20 61 74 20 45 4f 46 20 6f 72 20 6f 6e 20 4f  0 at EOF or on O
1780: 4f 4d 2e 20 20 4f 6e 20 45 4f 46 2c 20 74 68 65  OM.  On EOF, the
1790: 20 70 2d 3e 63 54 65 72 6d 20 63 68 61 72 61 63   p->cTerm charac
17a0: 74 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ter will have.**
17b0: 20 62 65 65 6e 20 73 65 74 20 74 6f 20 45 4f 46   been set to EOF
17c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
17d0: 20 2a 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66   *csv_read_one_f
17e0: 69 65 6c 64 28 43 73 76 52 65 61 64 65 72 20 2a  ield(CsvReader *
17f0: 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 70  p){.  int c;.  p
1800: 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 63  ->n = 0;.  c = c
1810: 73 76 5f 67 65 74 63 28 70 29 3b 0a 20 20 69 66  sv_getc(p);.  if
1820: 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20  ( c==EOF ){.    
1830: 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a  p->cTerm = EOF;.
1840: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1850: 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29  }.  if( c=='"' )
1860: 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 70 70  {.    int pc, pp
1870: 63 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  c;.    int start
1880: 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b  Line = p->nLine;
1890: 0a 20 20 20 20 70 63 20 3d 20 70 70 63 20 3d 20  .    pc = ppc = 
18a0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  0;.    while( 1 
18b0: 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 63 73 76  ){.      c = csv
18c0: 5f 67 65 74 63 28 70 29 3b 0a 20 20 20 20 20 20  _getc(p);.      
18d0: 69 66 28 20 63 3c 3d 27 22 27 20 7c 7c 20 70 63  if( c<='"' || pc
18e0: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20  =='"' ){.       
18f0: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 70   if( c=='\n' ) p
1900: 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20  ->nLine++;.     
1910: 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b     if( c=='"' ){
1920: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1930: 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  c=='"' ){.      
1940: 20 20 20 20 20 20 70 63 20 3d 20 30 3b 0a 20 20        pc = 0;.  
1950: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1960: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
1970: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1980: 20 20 69 66 28 20 28 63 3d 3d 27 2c 27 20 26 26    if( (c==',' &&
1990: 20 70 63 3d 3d 27 22 27 29 0a 20 20 20 20 20 20   pc=='"').      
19a0: 20 20 20 7c 7c 20 28 63 3d 3d 27 5c 6e 27 20 26     || (c=='\n' &
19b0: 26 20 70 63 3d 3d 27 22 27 29 0a 20 20 20 20 20  & pc=='"').     
19c0: 20 20 20 20 7c 7c 20 28 63 3d 3d 27 5c 6e 27 20      || (c=='\n' 
19d0: 26 26 20 70 63 3d 3d 27 5c 72 27 20 26 26 20 70  && pc=='\r' && p
19e0: 70 63 3d 3d 27 22 27 29 0a 20 20 20 20 20 20 20  pc=='"').       
19f0: 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20 26 26 20    || (c==EOF && 
1a00: 70 63 3d 3d 27 22 27 29 0a 20 20 20 20 20 20 20  pc=='"').       
1a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f   ){.          do
1a20: 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65  { p->n--; }while
1a30: 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 27 22  ( p->z[p->n]!='"
1a40: 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ' );.          p
1a50: 2d 3e 63 54 65 72 6d 20 3d 20 28 63 68 61 72 29  ->cTerm = (char)
1a60: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  c;.          bre
1a70: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1a80: 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 22        if( pc=='"
1a90: 27 20 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a  ' && c!='\r' ){.
1aa0: 20 20 20 20 20 20 20 20 20 20 63 73 76 5f 65 72            csv_er
1ab0: 72 6d 73 67 28 70 2c 20 22 6c 69 6e 65 20 25 64  rmsg(p, "line %d
1ac0: 3a 20 75 6e 65 73 63 61 70 65 64 20 25 63 20 63  : unescaped %c c
1ad0: 68 61 72 61 63 74 65 72 22 2c 20 70 2d 3e 6e 4c  haracter", p->nL
1ae0: 69 6e 65 2c 20 27 22 27 29 3b 0a 20 20 20 20 20  ine, '"');.     
1af0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1b10: 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20  ( c==EOF ){.    
1b20: 20 20 20 20 20 20 63 73 76 5f 65 72 72 6d 73 67        csv_errmsg
1b30: 28 70 2c 20 22 6c 69 6e 65 20 25 64 3a 20 75 6e  (p, "line %d: un
1b40: 74 65 72 6d 69 6e 61 74 65 64 20 25 63 2d 71 75  terminated %c-qu
1b50: 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c 0a 20  oted field\n",. 
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 20 20 20 73 74 61 72 74 4c 69 6e 65 2c 20 27      startLine, '
1b80: 22 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  "');.          p
1b90: 2d 3e 63 54 65 72 6d 20 3d 20 28 63 68 61 72 29  ->cTerm = (char)
1ba0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  c;.          bre
1bb0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1bc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1bd0: 63 73 76 5f 61 70 70 65 6e 64 28 70 2c 20 28 63  csv_append(p, (c
1be0: 68 61 72 29 63 29 20 29 20 72 65 74 75 72 6e 20  har)c) ) return 
1bf0: 30 3b 0a 20 20 20 20 20 20 70 70 63 20 3d 20 70  0;.      ppc = p
1c00: 63 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 63 3b  c;.      pc = c;
1c10: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1c20: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1c30: 73 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  s the first fiel
1c40: 64 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 61  d being parsed a
1c50: 6e 64 20 69 74 20 62 65 67 69 6e 73 20 77 69 74  nd it begins wit
1c60: 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 55 54 46  h the.    ** UTF
1c70: 2d 38 20 42 4f 4d 20 20 28 30 78 45 46 20 42 42  -8 BOM  (0xEF BB
1c80: 20 42 46 29 20 74 68 65 6e 20 73 6b 69 70 20 74   BF) then skip t
1c90: 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66  he BOM */.    if
1ca0: 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 65 66  ( (c&0xff)==0xef
1cb0: 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74   && p->bNotFirst
1cc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 73 76  ==0 ){.      csv
1cd0: 5f 61 70 70 65 6e 64 28 70 2c 20 28 63 68 61 72  _append(p, (char
1ce0: 29 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 63  )c);.      c = c
1cf0: 73 76 5f 67 65 74 63 28 70 29 3b 0a 20 20 20 20  sv_getc(p);.    
1d00: 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
1d10: 30 78 62 62 20 29 7b 0a 20 20 20 20 20 20 20 20  0xbb ){.        
1d20: 63 73 76 5f 61 70 70 65 6e 64 28 70 2c 20 28 63  csv_append(p, (c
1d30: 68 61 72 29 63 29 3b 0a 20 20 20 20 20 20 20 20  har)c);.        
1d40: 63 20 3d 20 63 73 76 5f 67 65 74 63 28 70 29 3b  c = csv_getc(p);
1d50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63 26  .        if( (c&
1d60: 30 78 66 66 29 3d 3d 30 78 62 66 20 29 7b 0a 20  0xff)==0xbf ){. 
1d70: 20 20 20 20 20 20 20 20 20 70 2d 3e 62 4e 6f 74           p->bNot
1d80: 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  First = 1;.     
1d90: 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20       p->n = 0;. 
1da0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1db0: 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65  csv_read_one_fie
1dc0: 6c 64 28 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  ld(p);.        }
1dd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1de0: 20 20 20 77 68 69 6c 65 28 20 63 3e 27 2c 27 20     while( c>',' 
1df0: 7c 7c 20 28 63 21 3d 45 4f 46 20 26 26 20 63 21  || (c!=EOF && c!
1e00: 3d 27 2c 27 20 26 26 20 63 21 3d 27 5c 6e 27 29  =',' && c!='\n')
1e10: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 73   ){.      if( cs
1e20: 76 5f 61 70 70 65 6e 64 28 70 2c 20 28 63 68 61  v_append(p, (cha
1e30: 72 29 63 29 20 29 20 72 65 74 75 72 6e 20 30 3b  r)c) ) return 0;
1e40: 0a 20 20 20 20 20 20 63 20 3d 20 63 73 76 5f 67  .      c = csv_g
1e50: 65 74 63 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  etc(p);.    }.  
1e60: 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b    if( c=='\n' ){
1e70: 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b  .      p->nLine+
1e80: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
1e90: 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e  n>0 && p->z[p->n
1ea0: 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e  -1]=='\r' ) p->n
1eb0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  --;.    }.    p-
1ec0: 3e 63 54 65 72 6d 20 3d 20 28 63 68 61 72 29 63  >cTerm = (char)c
1ed0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a  ;.  }.  if( p->z
1ee0: 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20   ) p->z[p->n] = 
1ef0: 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73  0;.  p->bNotFirs
1f00: 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
1f10: 70 2d 3e 7a 3b 0a 7d 0a 0a 0a 2f 2a 20 46 6f 72  p->z;.}.../* For
1f20: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
1f30: 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20 76  to the various v
1f40: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 65 74  irtual table met
1f50: 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  hods implemented
1f60: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66 69 6c 65  .** in this file
1f70: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1f80: 63 73 76 74 61 62 43 72 65 61 74 65 28 73 71 6c  csvtabCreate(sql
1f90: 69 74 65 33 2a 2c 20 76 6f 69 64 2a 2c 20 69 6e  ite3*, void*, in
1fa0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 63 6f  t, const char*co
1fb0: 6e 73 74 2a 2c 20 0a 20 20 20 20 20 20 20 20 20  nst*, .         
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 2a    sqlite3_vtab**
1fe0: 2c 63 68 61 72 2a 2a 29 3b 0a 73 74 61 74 69 63  ,char**);.static
1ff0: 20 69 6e 74 20 63 73 76 74 61 62 43 6f 6e 6e 65   int csvtabConne
2000: 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 76 6f 69  ct(sqlite3*, voi
2010: 64 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63  d*, int, const c
2020: 68 61 72 2a 63 6f 6e 73 74 2a 2c 20 0a 20 20 20  har*const*, .   
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2050: 76 74 61 62 2a 2a 2c 63 68 61 72 2a 2a 29 3b 0a  vtab**,char**);.
2060: 73 74 61 74 69 63 20 69 6e 74 20 63 73 76 74 61  static int csvta
2070: 62 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74  bBestIndex(sqlit
2080: 65 33 5f 76 74 61 62 2a 2c 73 71 6c 69 74 65 33  e3_vtab*,sqlite3
2090: 5f 69 6e 64 65 78 5f 69 6e 66 6f 2a 29 3b 0a 73  _index_info*);.s
20a0: 74 61 74 69 63 20 69 6e 74 20 63 73 76 74 61 62  tatic int csvtab
20b0: 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74  Disconnect(sqlit
20c0: 65 33 5f 76 74 61 62 2a 29 3b 0a 73 74 61 74 69  e3_vtab*);.stati
20d0: 63 20 69 6e 74 20 63 73 76 74 61 62 4f 70 65 6e  c int csvtabOpen
20e0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 2c 20  (sqlite3_vtab*, 
20f0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
2100: 73 6f 72 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69  sor**);.static i
2110: 6e 74 20 63 73 76 74 61 62 43 6c 6f 73 65 28 73  nt csvtabClose(s
2120: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
2130: 6f 72 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  or*);.static int
2140: 20 63 73 76 74 61 62 46 69 6c 74 65 72 28 73 71   csvtabFilter(sq
2150: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
2160: 72 2a 2c 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20  r*, int idxNum, 
2170: 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53  const char *idxS
2180: 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tr,.            
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
21a0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
21b0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 3b 0a 73  value **argv);.s
21c0: 74 61 74 69 63 20 69 6e 74 20 63 73 76 74 61 62  tatic int csvtab
21d0: 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61  Next(sqlite3_vta
21e0: 62 5f 63 75 72 73 6f 72 2a 29 3b 0a 73 74 61 74  b_cursor*);.stat
21f0: 69 63 20 69 6e 74 20 63 73 76 74 61 62 45 6f 66  ic int csvtabEof
2200: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
2210: 72 73 6f 72 2a 29 3b 0a 73 74 61 74 69 63 20 69  rsor*);.static i
2220: 6e 74 20 63 73 76 74 61 62 43 6f 6c 75 6d 6e 28  nt csvtabColumn(
2230: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
2240: 73 6f 72 2a 2c 73 71 6c 69 74 65 33 5f 63 6f 6e  sor*,sqlite3_con
2250: 74 65 78 74 2a 2c 69 6e 74 29 3b 0a 73 74 61 74  text*,int);.stat
2260: 69 63 20 69 6e 74 20 63 73 76 74 61 62 52 6f 77  ic int csvtabRow
2270: 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  id(sqlite3_vtab_
2280: 63 75 72 73 6f 72 2a 2c 73 71 6c 69 74 65 33 5f  cursor*,sqlite3_
2290: 69 6e 74 36 34 2a 29 3b 0a 0a 2f 2a 20 41 6e 20  int64*);../* An 
22a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
22b0: 43 53 56 20 76 69 72 74 75 61 6c 20 74 61 62 6c  CSV virtual tabl
22c0: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
22d0: 75 63 74 20 43 73 76 54 61 62 6c 65 20 7b 0a 20  uct CsvTable {. 
22e0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61   sqlite3_vtab ba
22f0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2300: 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20   /* Base class. 
2310: 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   Must be first *
2320: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
2330: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
2340: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2350: 68 65 20 43 53 56 20 66 69 6c 65 20 2a 2f 0a 20  he CSV file */. 
2360: 20 63 68 61 72 20 2a 7a 44 61 74 61 3b 20 20 20   char *zData;   
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 2f 2a 20 52 61 77 20 43 53 56 20 64 61 74 61   /* Raw CSV data
2390: 20 69 6e 20 6c 69 65 75 20 6f 66 20 7a 46 69 6c   in lieu of zFil
23a0: 65 6e 61 6d 65 20 2a 2f 0a 20 20 6c 6f 6e 67 20  ename */.  long 
23b0: 69 53 74 61 72 74 3b 20 20 20 20 20 20 20 20 20  iStart;         
23c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
23d0: 66 73 65 74 20 74 6f 20 73 74 61 72 74 20 6f 66  fset to start of
23e0: 20 64 61 74 61 20 69 6e 20 7a 46 69 6c 65 6e 61   data in zFilena
23f0: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  me */.  int nCol
2400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2410: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2420: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
2430: 74 68 65 20 43 53 56 20 66 69 6c 65 20 2a 2f 0a  the CSV file */.
2440: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 74    unsigned int t
2450: 73 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  stFlags;        
2460: 20 20 2f 2a 20 42 69 74 20 76 61 6c 75 65 73 20    /* Bit values 
2470: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
2480: 20 2a 2f 0a 7d 20 43 73 76 54 61 62 6c 65 3b 0a   */.} CsvTable;.
2490: 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  ./* Allowed valu
24a0: 65 73 20 66 6f 72 20 74 73 74 46 6c 61 67 73 20  es for tstFlags 
24b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 53 56 54 45  */.#define CSVTE
24c0: 53 54 5f 46 49 44 58 20 20 30 78 30 30 30 31 20  ST_FIDX  0x0001 
24d0: 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20       /* Pretend 
24e0: 74 68 61 74 20 63 6f 6e 73 74 72 61 69 6e 65 64  that constrained
24f0: 20 73 65 61 72 63 68 73 20 63 6f 73 74 20 6c 65   searchs cost le
2500: 73 73 2a 2f 0a 0a 2f 2a 20 41 20 63 75 72 73 6f  ss*/../* A curso
2510: 72 20 66 6f 72 20 74 68 65 20 43 53 56 20 76 69  r for the CSV vi
2520: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 74  rtual table */.t
2530: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 73  ypedef struct Cs
2540: 76 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69  vCursor {.  sqli
2550: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
2560: 62 61 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 42  base;       /* B
2570: 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74  ase class.  Must
2580: 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 43   be first */.  C
2590: 73 76 52 65 61 64 65 72 20 72 64 72 3b 20 20 20  svReader rdr;   
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b0: 2a 20 54 68 65 20 43 73 76 52 65 61 64 65 72 20  * The CsvReader 
25c0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
25d0: 20 2a 2a 61 7a 56 61 6c 3b 20 20 20 20 20 20 20   **azVal;       
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
25f0: 61 6c 75 65 20 6f 66 20 74 68 65 20 63 75 72 72  alue of the curr
2600: 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ent row */.  int
2610: 20 2a 61 4c 65 6e 3b 20 20 20 20 20 20 20 20 20   *aLen;         
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2630: 4c 65 6e 67 74 68 20 6f 66 20 65 61 63 68 20 65  Length of each e
2640: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
2650: 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 3b 20  3_int64 iRowid; 
2660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2670: 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20   current rowid. 
2680: 20 4e 65 67 61 74 69 76 65 20 66 6f 72 20 45 4f   Negative for EO
2690: 46 20 2a 2f 0a 7d 20 43 73 76 43 75 72 73 6f 72  F */.} CsvCursor
26a0: 3b 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20 65  ;../* Transfer e
26b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
26c0: 74 20 66 72 6f 6d 20 61 20 72 65 61 64 65 72 20  t from a reader 
26d0: 69 6e 74 6f 20 61 20 43 73 76 54 61 62 6c 65 20  into a CsvTable 
26e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
26f0: 73 76 5f 78 66 65 72 5f 65 72 72 6f 72 28 43 73  sv_xfer_error(Cs
2700: 76 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 73  vTable *pTab, Cs
2710: 76 52 65 61 64 65 72 20 2a 70 52 64 72 29 7b 0a  vReader *pRdr){.
2720: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2730: 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73  Tab->base.zErrMs
2740: 67 29 3b 0a 20 20 70 54 61 62 2d 3e 62 61 73 65  g);.  pTab->base
2750: 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  .zErrMsg = sqlit
2760: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
2770: 20 70 52 64 72 2d 3e 7a 45 72 72 29 3b 0a 7d 0a   pRdr->zErr);.}.
2780: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 74 68  ./*.** This meth
2790: 6f 64 20 69 73 20 74 68 65 20 64 65 73 74 72 75  od is the destru
27a0: 63 74 6f 72 20 66 6f 20 61 20 43 73 76 54 61 62  ctor fo a CsvTab
27b0: 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  le object..*/.st
27c0: 61 74 69 63 20 69 6e 74 20 63 73 76 74 61 62 44  atic int csvtabD
27d0: 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65  isconnect(sqlite
27e0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
27f0: 20 20 43 73 76 54 61 62 6c 65 20 2a 70 20 3d 20    CsvTable *p = 
2800: 28 43 73 76 54 61 62 6c 65 2a 29 70 56 74 61 62  (CsvTable*)pVtab
2810: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
2820: 28 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  (p->zFilename);.
2830: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2840: 2d 3e 7a 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->zData);.  sqli
2850: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
2860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2870: 0a 7d 0a 0a 2f 2a 20 53 6b 69 70 20 6c 65 61 64  .}../* Skip lead
2880: 69 6e 67 20 77 68 69 74 65 73 70 61 63 65 2e 20  ing whitespace. 
2890: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
28a0: 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6e  r to the first n
28b0: 6f 6e 2d 77 68 69 74 65 73 70 61 63 65 0a 2a 2a  on-whitespace.**
28c0: 20 63 68 61 72 61 63 74 65 72 2c 20 6f 72 20 74   character, or t
28d0: 6f 20 74 68 65 20 7a 65 72 6f 20 74 65 72 6d 69  o the zero termi
28e0: 6e 61 74 6f 72 20 69 66 20 74 68 65 20 73 74 72  nator if the str
28f0: 69 6e 67 20 68 61 73 20 6f 6e 6c 79 20 77 68 69  ing has only whi
2900: 74 65 73 70 61 63 65 20 2a 2f 0a 73 74 61 74 69  tespace */.stati
2910: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 73  c const char *cs
2920: 76 5f 73 6b 69 70 5f 77 68 69 74 65 73 70 61 63  v_skip_whitespac
2930: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  e(const char *z)
2940: 7b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61  {.  while( isspa
2950: 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
2960: 72 29 7a 5b 30 5d 29 20 29 20 7a 2b 2b 3b 0a 20  r)z[0]) ) z++;. 
2970: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
2980: 20 52 65 6d 6f 76 65 20 74 72 61 69 6c 69 6e 67   Remove trailing
2990: 20 77 68 69 74 65 73 70 61 63 65 20 66 72 6f 6d   whitespace from
29a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 73 74 72 69   the end of stri
29b0: 6e 67 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63  ng z[] */.static
29c0: 20 76 6f 69 64 20 63 73 76 5f 74 72 69 6d 5f 77   void csv_trim_w
29d0: 68 69 74 65 73 70 61 63 65 28 63 68 61 72 20 2a  hitespace(char *
29e0: 7a 29 7b 0a 20 20 73 69 7a 65 5f 74 20 6e 20 3d  z){.  size_t n =
29f0: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 77 68   strlen(z);.  wh
2a00: 69 6c 65 28 20 6e 3e 30 20 26 26 20 69 73 73 70  ile( n>0 && issp
2a10: 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68  ace((unsigned ch
2a20: 61 72 29 7a 5b 6e 5d 29 20 29 20 6e 2d 2d 3b 0a  ar)z[n]) ) n--;.
2a30: 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f    z[n] = 0;.}../
2a40: 2a 20 44 65 71 75 6f 74 65 20 74 68 65 20 73 74  * Dequote the st
2a50: 72 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 76  ring */.static v
2a60: 6f 69 64 20 63 73 76 5f 64 65 71 75 6f 74 65 28  oid csv_dequote(
2a70: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
2a80: 6a 3b 0a 20 20 63 68 61 72 20 63 51 75 6f 74 65  j;.  char cQuote
2a90: 20 3d 20 7a 5b 30 5d 3b 0a 20 20 73 69 7a 65 5f   = z[0];.  size_
2aa0: 74 20 69 2c 20 6e 3b 0a 0a 20 20 69 66 28 20 63  t i, n;..  if( c
2ab0: 51 75 6f 74 65 21 3d 27 5c 27 27 20 26 26 20 63  Quote!='\'' && c
2ac0: 51 75 6f 74 65 21 3d 27 22 27 20 29 20 72 65 74  Quote!='"' ) ret
2ad0: 75 72 6e 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65  urn;.  n = strle
2ae0: 6e 28 7a 29 3b 0a 20 20 69 66 28 20 6e 3c 32 20  n(z);.  if( n<2 
2af0: 7c 7c 20 7a 5b 6e 2d 31 5d 21 3d 7a 5b 30 5d 20  || z[n-1]!=z[0] 
2b00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
2b10: 69 3d 31 2c 20 6a 3d 30 3b 20 69 3c 6e 2d 31 3b  i=1, j=0; i<n-1;
2b20: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
2b30: 5b 69 5d 3d 3d 63 51 75 6f 74 65 20 26 26 20 7a  [i]==cQuote && z
2b40: 5b 69 2b 31 5d 3d 3d 63 51 75 6f 74 65 20 29 20  [i+1]==cQuote ) 
2b50: 69 2b 2b 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20  i++;.    z[j++] 
2b60: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
2b70: 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 43 68  j] = 0;.}../* Ch
2b80: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
2b90: 65 20 73 74 72 69 6e 67 20 69 73 20 6f 66 20 74  e string is of t
2ba0: 68 65 20 66 6f 72 6d 3a 20 20 22 54 41 47 20 3d  he form:  "TAG =
2bb0: 20 56 41 4c 55 45 22 20 77 69 74 68 20 6f 70 74   VALUE" with opt
2bc0: 69 6f 6e 61 6c 0a 2a 2a 20 77 68 69 74 65 73 70  ional.** whitesp
2bd0: 61 63 65 20 62 65 66 6f 72 65 20 61 6e 64 20 61  ace before and a
2be0: 72 6f 75 6e 64 20 74 6f 6b 65 6e 73 2e 20 20 49  round tokens.  I
2bf0: 66 20 69 74 20 69 73 2c 20 72 65 74 75 72 6e 20  f it is, return 
2c00: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2c10: 0a 2a 2a 20 66 69 72 73 74 20 63 68 61 72 61 63  .** first charac
2c20: 74 65 72 20 6f 66 20 56 41 4c 55 45 2e 20 20 49  ter of VALUE.  I
2c30: 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74  f it is not, ret
2c40: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
2c50: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2c60: 63 73 76 5f 70 61 72 61 6d 65 74 65 72 28 63 6f  csv_parameter(co
2c70: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 67 2c 20  nst char *zTag, 
2c80: 69 6e 74 20 6e 54 61 67 2c 20 63 6f 6e 73 74 20  int nTag, const 
2c90: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 7a 20 3d 20  char *z){.  z = 
2ca0: 63 73 76 5f 73 6b 69 70 5f 77 68 69 74 65 73 70  csv_skip_whitesp
2cb0: 61 63 65 28 7a 29 3b 0a 20 20 69 66 28 20 73 74  ace(z);.  if( st
2cc0: 72 6e 63 6d 70 28 7a 54 61 67 2c 20 7a 2c 20 6e  rncmp(zTag, z, n
2cd0: 54 61 67 29 21 3d 30 20 29 20 72 65 74 75 72 6e  Tag)!=0 ) return
2ce0: 20 30 3b 0a 20 20 7a 20 3d 20 63 73 76 5f 73 6b   0;.  z = csv_sk
2cf0: 69 70 5f 77 68 69 74 65 73 70 61 63 65 28 7a 2b  ip_whitespace(z+
2d00: 6e 54 61 67 29 3b 0a 20 20 69 66 28 20 7a 5b 30  nTag);.  if( z[0
2d10: 5d 21 3d 27 3d 27 20 29 20 72 65 74 75 72 6e 20  ]!='=' ) return 
2d20: 30 3b 0a 20 20 72 65 74 75 72 6e 20 63 73 76 5f  0;.  return csv_
2d30: 73 6b 69 70 5f 77 68 69 74 65 73 70 61 63 65 28  skip_whitespace(
2d40: 7a 2b 31 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 63 6f  z+1);.}../* Deco
2d50: 64 65 20 61 20 70 61 72 61 6d 65 74 65 72 20 74  de a parameter t
2d60: 68 61 74 20 72 65 71 75 69 72 65 73 20 61 20 64  hat requires a d
2d70: 65 71 75 6f 74 65 64 20 73 74 72 69 6e 67 2e 0a  equoted string..
2d80: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  **.** Return 1 i
2d90: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
2da0: 69 73 20 73 65 65 6e 2c 20 6f 72 20 30 20 69 66  is seen, or 0 if
2db0: 20 6e 6f 74 2e 20 20 31 20 69 73 20 72 65 74 75   not.  1 is retu
2dc0: 72 6e 65 64 0a 2a 2a 20 65 76 65 6e 20 69 66 20  rned.** even if 
2dd0: 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f  there is an erro
2de0: 72 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  r.  If an error 
2df0: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20  occurs, then an 
2e00: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
2e10: 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 7a   is left in p->z
2e20: 45 72 72 2e 20 20 49 66 20 74 68 65 72 65 20 61  Err.  If there a
2e30: 72 65 20 6e 6f 20 65 72 72 6f 72 73 2c 20 70 2d  re no errors, p-
2e40: 3e 7a 45 72 72 5b 30 5d 3d 3d 30 2e 0a 2a 2f 0a  >zErr[0]==0..*/.
2e50: 73 74 61 74 69 63 20 69 6e 74 20 63 73 76 5f 73  static int csv_s
2e60: 74 72 69 6e 67 5f 70 61 72 61 6d 65 74 65 72 28  tring_parameter(
2e70: 0a 20 20 43 73 76 52 65 61 64 65 72 20 2a 70 2c  .  CsvReader *p,
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2e90: 65 61 76 65 20 74 68 65 20 65 72 72 6f 72 20 6d  eave the error m
2ea0: 65 73 73 61 67 65 20 68 65 72 65 2c 20 69 66 20  essage here, if 
2eb0: 74 68 65 72 65 20 69 73 20 6f 6e 65 20 2a 2f 0a  there is one */.
2ec0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2ed0: 61 72 61 6d 2c 20 20 20 20 20 20 2f 2a 20 50 61  aram,      /* Pa
2ee0: 72 61 6d 65 74 65 72 20 77 65 20 61 72 65 20 63  rameter we are c
2ef0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  hecking for */. 
2f00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
2f10: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 61 77  g,        /* Raw
2f20: 20 74 65 78 74 20 6f 66 20 74 68 65 20 76 69 72   text of the vir
2f30: 74 75 61 6c 20 74 61 62 6c 65 20 61 72 67 6d 65  tual table argme
2f40: 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  nt */.  char **p
2f50: 7a 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 20  zVal            
2f60: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 65   /* Write the de
2f70: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 76 61  quoted string va
2f80: 6c 75 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lue here */.){. 
2f90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
2fa0: 6c 75 65 3b 0a 20 20 7a 56 61 6c 75 65 20 3d 20  lue;.  zValue = 
2fb0: 63 73 76 5f 70 61 72 61 6d 65 74 65 72 28 7a 50  csv_parameter(zP
2fc0: 61 72 61 6d 2c 28 69 6e 74 29 73 74 72 6c 65 6e  aram,(int)strlen
2fd0: 28 7a 50 61 72 61 6d 29 2c 7a 41 72 67 29 3b 0a  (zParam),zArg);.
2fe0: 20 20 69 66 28 20 7a 56 61 6c 75 65 3d 3d 30 20    if( zValue==0 
2ff0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d  ) return 0;.  p-
3000: 3e 7a 45 72 72 5b 30 5d 20 3d 20 30 3b 0a 20 20  >zErr[0] = 0;.  
3010: 69 66 28 20 2a 70 7a 56 61 6c 20 29 7b 0a 20 20  if( *pzVal ){.  
3020: 20 20 63 73 76 5f 65 72 72 6d 73 67 28 70 2c 20    csv_errmsg(p, 
3030: 22 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 27  "more than one '
3040: 25 73 27 20 70 61 72 61 6d 65 74 65 72 22 2c 20  %s' parameter", 
3050: 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 72 65 74  zParam);.    ret
3060: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 2a 70 7a  urn 1;.  }.  *pz
3070: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Val = sqlite3_mp
3080: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 56 61 6c  rintf("%s", zVal
3090: 75 65 29 3b 0a 20 20 69 66 28 20 2a 70 7a 56 61  ue);.  if( *pzVa
30a0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 63 73 76 5f  l==0 ){.    csv_
30b0: 65 72 72 6d 73 67 28 70 2c 20 22 6f 75 74 20 6f  errmsg(p, "out o
30c0: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
30d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
30e0: 63 73 76 5f 74 72 69 6d 5f 77 68 69 74 65 73 70  csv_trim_whitesp
30f0: 61 63 65 28 2a 70 7a 56 61 6c 29 3b 0a 20 20 63  ace(*pzVal);.  c
3100: 73 76 5f 64 65 71 75 6f 74 65 28 2a 70 7a 56 61  sv_dequote(*pzVa
3110: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  l);.  return 1;.
3120: 7d 0a 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 30 20  }.../* Return 0 
3130: 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
3140: 69 73 20 66 61 6c 73 65 20 61 6e 64 20 31 20 69  is false and 1 i
3150: 66 20 69 74 20 69 73 20 74 72 75 65 2e 20 20 52  f it is true.  R
3160: 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 77  eturn -1 if.** w
3170: 65 20 63 61 6e 6e 6f 74 20 72 65 61 6c 6c 79 20  e cannot really 
3180: 74 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tell..*/.static 
3190: 69 6e 74 20 63 73 76 5f 62 6f 6f 6c 65 61 6e 28  int csv_boolean(
31a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
31b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
31c0: 72 69 63 6d 70 28 22 79 65 73 22 2c 7a 29 3d 3d  ricmp("yes",z)==
31d0: 30 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f  0.   || sqlite3_
31e0: 73 74 72 69 63 6d 70 28 22 6f 6e 22 2c 7a 29 3d  stricmp("on",z)=
31f0: 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  =0.   || sqlite3
3200: 5f 73 74 72 69 63 6d 70 28 22 74 72 75 65 22 2c  _stricmp("true",
3210: 7a 29 3d 3d 30 0a 20 20 20 7c 7c 20 28 7a 5b 30  z)==0.   || (z[0
3220: 5d 3d 3d 27 31 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='1' && z[1]==
3230: 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  0).  ){.    retu
3240: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
3250: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
3260: 22 6e 6f 22 2c 7a 29 3d 3d 30 0a 20 20 20 7c 7c  "no",z)==0.   ||
3270: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
3280: 28 22 6f 66 66 22 2c 7a 29 3d 3d 30 0a 20 20 20  ("off",z)==0.   
3290: 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
32a0: 6d 70 28 22 66 61 6c 73 65 22 2c 7a 29 3d 3d 30  mp("false",z)==0
32b0: 0a 20 20 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 30  .   || (z[0]=='0
32c0: 27 20 26 26 20 7a 5b 31 5d 3d 3d 30 29 0a 20 20  ' && z[1]==0).  
32d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
32e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
32f0: 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f  ;.}../* Check to
3300: 20 73 65 65 20 69 66 20 74 68 65 20 73 74 72 69   see if the stri
3310: 6e 67 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  ng is of the for
3320: 6d 3a 20 20 22 54 41 47 20 3d 20 42 4f 4f 4c 45  m:  "TAG = BOOLE
3330: 41 4e 22 20 6f 72 20 6a 75 73 74 20 22 54 41 47  AN" or just "TAG
3340: 22 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20  "..** If it is, 
3350: 73 65 74 20 2a 70 56 61 6c 75 65 20 74 6f 20 62  set *pValue to b
3360: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
3370: 68 65 20 62 6f 6f 6c 65 61 6e 20 28 22 74 72 75  he boolean ("tru
3380: 65 22 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  e" if there is.*
3390: 2a 20 6e 6f 74 20 22 3d 20 42 4f 4f 4c 45 41 4e  * not "= BOOLEAN
33a0: 22 20 63 6f 6d 70 6f 6e 65 6e 74 29 20 61 6e 64  " component) and
33b0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
33c0: 2e 20 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  .  If the input 
33d0: 73 74 72 69 6e 67 0a 2a 2a 20 64 6f 65 73 20 6e  string.** does n
33e0: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 54 41  ot begin with TA
33f0: 47 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a  G, return zero..
3400: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73  */.static int cs
3410: 76 5f 62 6f 6f 6c 65 61 6e 5f 70 61 72 61 6d 65  v_boolean_parame
3420: 74 65 72 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ter(.  const cha
3430: 72 20 2a 7a 54 61 67 2c 20 20 20 20 20 20 20 2f  r *zTag,       /
3440: 2a 20 54 61 67 20 77 65 20 61 72 65 20 6c 6f 6f  * Tag we are loo
3450: 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  king for */.  in
3460: 74 20 6e 54 61 67 2c 20 20 20 20 20 20 20 20 20  t nTag,         
3470: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
3480: 20 74 68 65 20 74 61 67 20 69 6e 20 62 79 74 65   the tag in byte
3490: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
34a0: 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 2f  r *z,          /
34b0: 2a 20 49 6e 70 75 74 20 70 61 72 61 6d 65 74 65  * Input paramete
34c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 56 61 6c  r */.  int *pVal
34d0: 75 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ue             /
34e0: 2a 20 57 72 69 74 65 20 62 6f 6f 6c 65 61 6e 20  * Write boolean 
34f0: 76 61 6c 75 65 20 68 65 72 65 20 2a 2f 0a 29 7b  value here */.){
3500: 0a 20 20 69 6e 74 20 62 3b 0a 20 20 7a 20 3d 20  .  int b;.  z = 
3510: 63 73 76 5f 73 6b 69 70 5f 77 68 69 74 65 73 70  csv_skip_whitesp
3520: 61 63 65 28 7a 29 3b 0a 20 20 69 66 28 20 73 74  ace(z);.  if( st
3530: 72 6e 63 6d 70 28 7a 54 61 67 2c 20 7a 2c 20 6e  rncmp(zTag, z, n
3540: 54 61 67 29 21 3d 30 20 29 20 72 65 74 75 72 6e  Tag)!=0 ) return
3550: 20 30 3b 0a 20 20 7a 20 3d 20 63 73 76 5f 73 6b   0;.  z = csv_sk
3560: 69 70 5f 77 68 69 74 65 73 70 61 63 65 28 7a 20  ip_whitespace(z 
3570: 2b 20 6e 54 61 67 29 3b 0a 20 20 69 66 28 20 7a  + nTag);.  if( z
3580: 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  [0]==0 ){.    *p
3590: 56 61 6c 75 65 20 3d 20 31 3b 0a 20 20 20 20 72  Value = 1;.    r
35a0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
35b0: 66 28 20 7a 5b 30 5d 21 3d 27 3d 27 20 29 20 72  f( z[0]!='=' ) r
35c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 63  eturn 0;.  z = c
35d0: 73 76 5f 73 6b 69 70 5f 77 68 69 74 65 73 70 61  sv_skip_whitespa
35e0: 63 65 28 7a 2b 31 29 3b 0a 20 20 62 20 3d 20 63  ce(z+1);.  b = c
35f0: 73 76 5f 62 6f 6f 6c 65 61 6e 28 7a 29 3b 0a 20  sv_boolean(z);. 
3600: 20 69 66 28 20 62 3e 3d 30 20 29 7b 0a 20 20 20   if( b>=0 ){.   
3610: 20 2a 70 56 61 6c 75 65 20 3d 20 62 3b 0a 20 20   *pValue = b;.  
3620: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
3630: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
3640: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
3650: 0a 2a 2a 20 20 20 20 66 69 6c 65 6e 61 6d 65 3d  .**    filename=
3660: 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 20  FILENAME        
3670: 20 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 63    Name of file c
3680: 6f 6e 74 61 69 6e 69 6e 67 20 43 53 56 20 63 6f  ontaining CSV co
3690: 6e 74 65 6e 74 0a 2a 2a 20 20 20 20 64 61 74 61  ntent.**    data
36a0: 3d 54 45 58 54 20 20 20 20 20 20 20 20 20 20 20  =TEXT           
36b0: 20 20 20 20 20 20 20 44 69 72 65 63 74 20 43 53         Direct CS
36c0: 56 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 20 20 20  V content..**   
36d0: 20 73 63 68 65 6d 61 3d 53 43 48 45 4d 41 20 20   schema=SCHEMA  
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 41 6c 74 65              Alte
36f0: 72 6e 61 74 69 76 65 20 43 53 56 20 73 63 68 65  rnative CSV sche
3700: 6d 61 2e 0a 2a 2a 20 20 20 20 68 65 61 64 65 72  ma..**    header
3710: 3d 59 45 53 7c 4e 4f 20 20 20 20 20 20 20 20 20  =YES|NO         
3720: 20 20 20 20 20 46 69 72 73 74 20 72 6f 77 20 6f       First row o
3730: 66 20 43 53 56 20 64 65 66 69 6e 65 73 20 74 68  f CSV defines th
3740: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 20 20  e names of.**   
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
3770: 6d 6e 73 20 69 66 20 22 79 65 73 22 2e 20 20 44  mns if "yes".  D
3780: 65 66 61 75 6c 74 20 22 6e 6f 22 2e 0a 2a 2a 20  efault "no"..** 
3790: 20 20 20 63 6f 6c 75 6d 6e 73 3d 4e 20 20 20 20     columns=N    
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 73                As
37b0: 73 75 6d 65 20 74 68 65 20 43 53 56 20 66 69 6c  sume the CSV fil
37c0: 65 20 63 6f 6e 74 61 69 6e 73 20 4e 20 63 6f 6c  e contains N col
37d0: 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  umns..**.** Only
37e0: 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20 63 6f   available if co
37f0: 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
3800: 54 45 5f 54 45 53 54 3a 0a 2a 2a 20 20 20 20 0a  TE_TEST:.**    .
3810: 2a 2a 20 20 20 20 74 65 73 74 66 6c 61 67 73 3d  **    testflags=
3820: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3830: 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 65 73 74   Bitmask of test
3840: 20 66 6c 61 67 73 2e 20 20 4f 70 74 69 6f 6e 61   flags.  Optiona
3850: 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 73 63 68 65 6d  l.**.** If schem
3860: 61 3d 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74  a= is omitted, t
3870: 68 65 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  hen the columns 
3880: 61 72 65 20 6e 61 6d 65 64 20 22 63 30 22 2c 20  are named "c0", 
3890: 22 63 31 22 2c 20 22 63 32 22 2c 0a 2a 2a 20 61  "c1", "c2",.** a
38a0: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66  nd so forth.  If
38b0: 20 63 6f 6c 75 6d 6e 73 3d 4e 20 69 73 20 6f 6d   columns=N is om
38c0: 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
38d0: 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 61  file is opened a
38e0: 6e 64 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  nd.** the number
38f0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
3900: 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 73 20  he first row is 
3910: 63 6f 75 6e 74 65 64 20 74 6f 20 64 65 74 65 72  counted to deter
3920: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  mine the.** colu
3930: 6d 6e 20 63 6f 75 6e 74 2e 20 20 49 66 20 68 65  mn count.  If he
3940: 61 64 65 72 3d 59 45 53 2c 20 74 68 65 6e 20 74  ader=YES, then t
3950: 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 73 20  he first row is 
3960: 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
3970: 69 63 20 69 6e 74 20 63 73 76 74 61 62 43 6f 6e  ic int csvtabCon
3980: 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  nect(.  sqlite3 
3990: 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75  *db,.  void *pAu
39a0: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63  x,.  int argc, c
39b0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
39c0: 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33  *argv,.  sqlite3
39d0: 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a  _vtab **ppVtab,.
39e0: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
39f0: 7b 0a 20 20 43 73 76 54 61 62 6c 65 20 2a 70 4e  {.  CsvTable *pN
3a00: 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ew = 0;        /
3a10: 2a 20 54 68 65 20 43 73 76 54 61 62 6c 65 20 6f  * The CsvTable o
3a20: 62 6a 65 63 74 20 74 6f 20 63 6f 6e 73 74 72 75  bject to constru
3a30: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 62 48 65 61  ct */.  int bHea
3a40: 64 65 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  der = -1;       
3a50: 20 20 20 2f 2a 20 68 65 61 64 65 72 3d 20 66 6c     /* header= fl
3a60: 61 67 73 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e  ags.  -1 means n
3a70: 6f 74 20 73 65 65 6e 20 79 65 74 20 2a 2f 0a 20  ot seen yet */. 
3a80: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
3a90: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  _OK;        /* R
3aa0: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
3ab0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
3ac0: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ae0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
3af0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3b00: 45 53 54 0a 20 20 69 6e 74 20 74 73 74 46 6c 61  EST.  int tstFla
3b10: 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
3b20: 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 74 65   /* Value for te
3b30: 73 74 66 6c 61 67 73 3d 4e 20 70 61 72 61 6d 65  stflags=N parame
3b40: 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ter */.#endif.  
3b50: 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20  int b;          
3b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
3b70: 6c 75 65 20 6f 66 20 61 20 62 6f 6f 6c 65 61 6e  lue of a boolean
3b80: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
3b90: 69 6e 74 20 6e 43 6f 6c 20 3d 20 2d 39 39 3b 20  int nCol = -99; 
3ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
3bb0: 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  lue of the colum
3bc0: 6e 73 3d 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  ns= parameter */
3bd0: 0a 20 20 43 73 76 52 65 61 64 65 72 20 73 52 64  .  CsvReader sRd
3be0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
3bf0: 20 41 20 43 53 56 20 66 69 6c 65 20 72 65 61 64   A CSV file read
3c00: 65 72 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  er used to store
3c10: 20 61 6e 20 65 72 72 6f 72 0a 20 20 20 20 20 20   an error.      
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c30: 20 20 20 20 20 20 20 2a 2a 20 6d 65 73 73 61 67         ** messag
3c40: 65 20 61 6e 64 2f 6f 72 20 74 6f 20 63 6f 75 6e  e and/or to coun
3c50: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
3c60: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 73 74 61  columns */.  sta
3c70: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3c80: 61 7a 50 61 72 61 6d 5b 5d 20 3d 20 7b 0a 20 20  azParam[] = {.  
3c90: 20 20 20 22 66 69 6c 65 6e 61 6d 65 22 2c 20 22     "filename", "
3ca0: 64 61 74 61 22 2c 20 22 73 63 68 65 6d 61 22 2c  data", "schema",
3cb0: 20 0a 20 20 7d 3b 0a 20 20 63 68 61 72 20 2a 61   .  };.  char *a
3cc0: 7a 50 56 61 6c 75 65 5b 33 5d 3b 20 20 20 20 20  zPValue[3];     
3cd0: 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72      /* Parameter
3ce0: 20 76 61 6c 75 65 73 20 2a 2f 0a 23 20 64 65 66   values */.# def
3cf0: 69 6e 65 20 43 53 56 5f 46 49 4c 45 4e 41 4d 45  ine CSV_FILENAME
3d00: 20 28 61 7a 50 56 61 6c 75 65 5b 30 5d 29 0a 23   (azPValue[0]).#
3d10: 20 64 65 66 69 6e 65 20 43 53 56 5f 44 41 54 41   define CSV_DATA
3d20: 20 20 20 20 20 28 61 7a 50 56 61 6c 75 65 5b 31       (azPValue[1
3d30: 5d 29 0a 23 20 64 65 66 69 6e 65 20 43 53 56 5f  ]).# define CSV_
3d40: 53 43 48 45 4d 41 20 20 20 28 61 7a 50 56 61 6c  SCHEMA   (azPVal
3d50: 75 65 5b 32 5d 29 0a 0a 0a 20 20 61 73 73 65 72  ue[2])...  asser
3d60: 74 28 20 73 69 7a 65 6f 66 28 61 7a 50 56 61 6c  t( sizeof(azPVal
3d70: 75 65 29 3d 3d 73 69 7a 65 6f 66 28 61 7a 50 61  ue)==sizeof(azPa
3d80: 72 61 6d 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74  ram) );.  memset
3d90: 28 26 73 52 64 72 2c 20 30 2c 20 73 69 7a 65 6f  (&sRdr, 0, sizeo
3da0: 66 28 73 52 64 72 29 29 3b 0a 20 20 6d 65 6d 73  f(sRdr));.  mems
3db0: 65 74 28 61 7a 50 56 61 6c 75 65 2c 20 30 2c 20  et(azPValue, 0, 
3dc0: 73 69 7a 65 6f 66 28 61 7a 50 56 61 6c 75 65 29  sizeof(azPValue)
3dd0: 29 3b 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c  );.  for(i=3; i<
3de0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
3df0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
3e00: 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 63 6f 6e  argv[i];.    con
3e10: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 3b  st char *zValue;
3e20: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
3e30: 73 69 7a 65 6f 66 28 61 7a 50 61 72 61 6d 29 2f  sizeof(azParam)/
3e40: 73 69 7a 65 6f 66 28 61 7a 50 61 72 61 6d 5b 30  sizeof(azParam[0
3e50: 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); j++){.      
3e60: 69 66 28 20 63 73 76 5f 73 74 72 69 6e 67 5f 70  if( csv_string_p
3e70: 61 72 61 6d 65 74 65 72 28 26 73 52 64 72 2c 20  arameter(&sRdr, 
3e80: 61 7a 50 61 72 61 6d 5b 6a 5d 2c 20 7a 2c 20 26  azParam[j], z, &
3e90: 61 7a 50 56 61 6c 75 65 5b 6a 5d 29 20 29 20 62  azPValue[j]) ) b
3ea0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3eb0: 69 66 28 20 6a 3c 73 69 7a 65 6f 66 28 61 7a 50  if( j<sizeof(azP
3ec0: 61 72 61 6d 29 2f 73 69 7a 65 6f 66 28 61 7a 50  aram)/sizeof(azP
3ed0: 61 72 61 6d 5b 30 5d 29 20 29 7b 0a 20 20 20 20  aram[0]) ){.    
3ee0: 20 20 69 66 28 20 73 52 64 72 2e 7a 45 72 72 5b    if( sRdr.zErr[
3ef0: 30 5d 20 29 20 67 6f 74 6f 20 63 73 76 74 61 62  0] ) goto csvtab
3f00: 5f 63 6f 6e 6e 65 63 74 5f 65 72 72 6f 72 3b 0a  _connect_error;.
3f10: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 69 66      }else.    if
3f20: 28 20 63 73 76 5f 62 6f 6f 6c 65 61 6e 5f 70 61  ( csv_boolean_pa
3f30: 72 61 6d 65 74 65 72 28 22 68 65 61 64 65 72 22  rameter("header"
3f40: 2c 36 2c 7a 2c 26 62 29 20 29 7b 0a 20 20 20 20  ,6,z,&b) ){.    
3f50: 20 20 69 66 28 20 62 48 65 61 64 65 72 3e 3d 30    if( bHeader>=0
3f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 73 76 5f   ){.        csv_
3f70: 65 72 72 6d 73 67 28 26 73 52 64 72 2c 20 22 6d  errmsg(&sRdr, "m
3f80: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 27 68 65  ore than one 'he
3f90: 61 64 65 72 27 20 70 61 72 61 6d 65 74 65 72 22  ader' parameter"
3fa0: 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
3fb0: 63 73 76 74 61 62 5f 63 6f 6e 6e 65 63 74 5f 65  csvtab_connect_e
3fc0: 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rror;.      }.  
3fd0: 20 20 20 20 62 48 65 61 64 65 72 20 3d 20 62 3b      bHeader = b;
3fe0: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 64 65  .    }else.#ifde
3ff0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
4000: 20 20 69 66 28 20 28 7a 56 61 6c 75 65 20 3d 20    if( (zValue = 
4010: 63 73 76 5f 70 61 72 61 6d 65 74 65 72 28 22 74  csv_parameter("t
4020: 65 73 74 66 6c 61 67 73 22 2c 39 2c 7a 29 29 21  estflags",9,z))!
4030: 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 73 74 46  =0 ){.      tstF
4040: 6c 61 67 73 20 3d 20 28 75 6e 73 69 67 6e 65 64  lags = (unsigned
4050: 20 69 6e 74 29 61 74 6f 69 28 7a 56 61 6c 75 65   int)atoi(zValue
4060: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
4070: 64 69 66 0a 20 20 20 20 69 66 28 20 28 7a 56 61  dif.    if( (zVa
4080: 6c 75 65 20 3d 20 63 73 76 5f 70 61 72 61 6d 65  lue = csv_parame
4090: 74 65 72 28 22 63 6f 6c 75 6d 6e 73 22 2c 37 2c  ter("columns",7,
40a0: 7a 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  z))!=0 ){.      
40b0: 69 66 28 20 6e 43 6f 6c 3e 30 20 29 7b 0a 20 20  if( nCol>0 ){.  
40c0: 20 20 20 20 20 20 63 73 76 5f 65 72 72 6d 73 67        csv_errmsg
40d0: 28 26 73 52 64 72 2c 20 22 6d 6f 72 65 20 74 68  (&sRdr, "more th
40e0: 61 6e 20 6f 6e 65 20 27 63 6f 6c 75 6d 6e 73 27  an one 'columns'
40f0: 20 70 61 72 61 6d 65 74 65 72 22 29 3b 0a 20 20   parameter");.  
4100: 20 20 20 20 20 20 67 6f 74 6f 20 63 73 76 74 61        goto csvta
4110: 62 5f 63 6f 6e 6e 65 63 74 5f 65 72 72 6f 72 3b  b_connect_error;
4120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
4130: 43 6f 6c 20 3d 20 61 74 6f 69 28 7a 56 61 6c 75  Col = atoi(zValu
4140: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43  e);.      if( nC
4150: 6f 6c 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ol<=0 ){.       
4160: 20 63 73 76 5f 65 72 72 6d 73 67 28 26 73 52 64   csv_errmsg(&sRd
4170: 72 2c 20 22 63 6f 6c 75 6d 6e 3d 20 76 61 6c 75  r, "column= valu
4180: 65 20 6d 75 73 74 20 62 65 20 70 6f 73 69 74 69  e must be positi
4190: 76 65 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ve");.        go
41a0: 74 6f 20 63 73 76 74 61 62 5f 63 6f 6e 6e 65 63  to csvtab_connec
41b0: 74 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  t_error;.      }
41c0: 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 7b  .    }else.    {
41d0: 0a 20 20 20 20 20 20 63 73 76 5f 65 72 72 6d 73  .      csv_errms
41e0: 67 28 26 73 52 64 72 2c 20 22 62 61 64 20 70 61  g(&sRdr, "bad pa
41f0: 72 61 6d 65 74 65 72 3a 20 27 25 73 27 22 2c 20  rameter: '%s'", 
4200: 7a 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63  z);.      goto c
4210: 73 76 74 61 62 5f 63 6f 6e 6e 65 63 74 5f 65 72  svtab_connect_er
4220: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
4230: 20 69 66 28 20 28 43 53 56 5f 46 49 4c 45 4e 41   if( (CSV_FILENA
4240: 4d 45 3d 3d 30 29 3d 3d 28 43 53 56 5f 44 41 54  ME==0)==(CSV_DAT
4250: 41 3d 3d 30 29 20 29 7b 0a 20 20 20 20 63 73 76  A==0) ){.    csv
4260: 5f 65 72 72 6d 73 67 28 26 73 52 64 72 2c 20 22  _errmsg(&sRdr, "
4270: 6d 75 73 74 20 73 70 65 63 69 66 79 20 65 69 74  must specify eit
4280: 68 65 72 20 66 69 6c 65 6e 61 6d 65 3d 20 6f 72  her filename= or
4290: 20 64 61 74 61 3d 20 62 75 74 20 6e 6f 74 20 62   data= but not b
42a0: 6f 74 68 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  oth");.    goto 
42b0: 63 73 76 74 61 62 5f 63 6f 6e 6e 65 63 74 5f 65  csvtab_connect_e
42c0: 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rror;.  }..  if(
42d0: 20 28 6e 43 6f 6c 3c 3d 30 20 7c 7c 20 62 48 65   (nCol<=0 || bHe
42e0: 61 64 65 72 3d 3d 31 29 0a 20 20 20 26 26 20 63  ader==1).   && c
42f0: 73 76 5f 72 65 61 64 65 72 5f 6f 70 65 6e 28 26  sv_reader_open(&
4300: 73 52 64 72 2c 20 43 53 56 5f 46 49 4c 45 4e 41  sRdr, CSV_FILENA
4310: 4d 45 2c 20 43 53 56 5f 44 41 54 41 29 0a 20 20  ME, CSV_DATA).  
4320: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 73 76 74  ){.    goto csvt
4330: 61 62 5f 63 6f 6e 6e 65 63 74 5f 65 72 72 6f 72  ab_connect_error
4340: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73  ;.  }.  pNew = s
4350: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
4360: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
4370: 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c    *ppVtab = (sql
4380: 69 74 65 33 5f 76 74 61 62 2a 29 70 4e 65 77 3b  ite3_vtab*)pNew;
4390: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
43a0: 20 67 6f 74 6f 20 63 73 76 74 61 62 5f 63 6f 6e   goto csvtab_con
43b0: 6e 65 63 74 5f 6f 6f 6d 3b 0a 20 20 6d 65 6d 73  nect_oom;.  mems
43c0: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
43d0: 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66  of(*pNew));.  if
43e0: 28 20 43 53 56 5f 53 43 48 45 4d 41 3d 3d 30 20  ( CSV_SCHEMA==0 
43f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
4400: 74 72 20 2a 70 53 74 72 20 3d 20 73 71 6c 69 74  tr *pStr = sqlit
4410: 65 33 5f 73 74 72 5f 6e 65 77 28 30 29 3b 0a 20  e3_str_new(0);. 
4420: 20 20 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20     char *zSep = 
4430: 22 22 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  "";.    int iCol
4440: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
4450: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 53  3_str_appendf(pS
4460: 74 72 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  tr, "CREATE TABL
4470: 45 20 78 28 22 29 3b 0a 20 20 20 20 69 66 28 20  E x(");.    if( 
4480: 6e 43 6f 6c 3c 30 20 26 26 20 62 48 65 61 64 65  nCol<0 && bHeade
4490: 72 3c 31 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f  r<1 ){.      nCo
44a0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 7b  l = 0;.      do{
44b0: 0a 20 20 20 20 20 20 20 20 63 73 76 5f 72 65 61  .        csv_rea
44c0: 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 26 73 52 64  d_one_field(&sRd
44d0: 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  r);.        nCol
44e0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  ++;.      }while
44f0: 28 20 73 52 64 72 2e 63 54 65 72 6d 3d 3d 27 2c  ( sRdr.cTerm==',
4500: 27 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ' );.    }.    i
4510: 66 28 20 6e 43 6f 6c 3e 30 20 26 26 20 62 48 65  f( nCol>0 && bHe
4520: 61 64 65 72 3c 31 20 29 7b 0a 20 20 20 20 20 20  ader<1 ){.      
4530: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
4540: 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  <nCol; iCol++){.
4550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
4560: 73 74 72 5f 61 70 70 65 6e 64 66 28 70 53 74 72  str_appendf(pStr
4570: 2c 20 22 25 73 63 25 64 20 54 45 58 54 22 2c 20  , "%sc%d TEXT", 
4580: 7a 53 65 70 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  zSep, iCol);.   
4590: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b       zSep = ",";
45a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
45b0: 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  se{.      do{.  
45c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
45d0: 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65  csv_read_one_fie
45e0: 6c 64 28 26 73 52 64 72 29 3b 0a 20 20 20 20 20  ld(&sRdr);.     
45f0: 20 20 20 69 66 28 20 28 6e 43 6f 6c 3e 30 20 26     if( (nCol>0 &
4600: 26 20 69 43 6f 6c 3c 6e 43 6f 6c 29 20 7c 7c 20  & iCol<nCol) || 
4610: 28 6e 43 6f 6c 3c 30 20 26 26 20 62 48 65 61 64  (nCol<0 && bHead
4620: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
4630: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
4640: 65 6e 64 66 28 70 53 74 72 2c 22 25 73 5c 22 25  endf(pStr,"%s\"%
4650: 77 5c 22 20 54 45 58 54 22 2c 20 7a 53 65 70 2c  w\" TEXT", zSep,
4660: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a   z);.          z
4670: 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20 20  Sep = ",";.     
4680: 20 20 20 20 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20       iCol++;.   
4690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 77 68       }.      }wh
46a0: 69 6c 65 28 20 73 52 64 72 2e 63 54 65 72 6d 3d  ile( sRdr.cTerm=
46b0: 3d 27 2c 27 20 29 3b 0a 20 20 20 20 20 20 69 66  =',' );.      if
46c0: 28 20 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( nCol<0 ){.    
46d0: 20 20 20 20 6e 43 6f 6c 20 3d 20 69 43 6f 6c 3b      nCol = iCol;
46e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
46f0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 43 6f        while( iCo
4700: 6c 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  l<nCol ){.      
4710: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
4720: 61 70 70 65 6e 64 66 28 70 53 74 72 2c 22 25 73  appendf(pStr,"%s
4730: 63 25 64 20 54 45 58 54 22 2c 20 7a 53 65 70 2c  c%d TEXT", zSep,
4740: 20 2b 2b 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20   ++iCol);.      
4750: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a      zSep = ",";.
4760: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4770: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  }.    }.    pNew
4780: 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
4790: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
47a0: 70 70 65 6e 64 66 28 70 53 74 72 2c 20 22 29 22  ppendf(pStr, ")"
47b0: 29 3b 0a 20 20 20 20 43 53 56 5f 53 43 48 45 4d  );.    CSV_SCHEM
47c0: 41 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 5f  A = sqlite3_str_
47d0: 66 69 6e 69 73 68 28 70 53 74 72 29 3b 0a 20 20  finish(pStr);.  
47e0: 20 20 69 66 28 20 43 53 56 5f 53 43 48 45 4d 41    if( CSV_SCHEMA
47f0: 3d 3d 30 20 29 20 67 6f 74 6f 20 63 73 76 74 61  ==0 ) goto csvta
4800: 62 5f 63 6f 6e 6e 65 63 74 5f 6f 6f 6d 3b 0a 20  b_connect_oom;. 
4810: 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 6f 6c 3c   }else if( nCol<
4820: 30 20 29 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  0 ){.    do{.   
4830: 20 20 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f     csv_read_one_
4840: 66 69 65 6c 64 28 26 73 52 64 72 29 3b 0a 20 20  field(&sRdr);.  
4850: 20 20 20 20 70 4e 65 77 2d 3e 6e 43 6f 6c 2b 2b      pNew->nCol++
4860: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 52  ;.    }while( sR
4870: 64 72 2e 63 54 65 72 6d 3d 3d 27 2c 27 20 29 3b  dr.cTerm==',' );
4880: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
4890: 65 77 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ew->nCol = nCol;
48a0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69  .  }.  pNew->zFi
48b0: 6c 65 6e 61 6d 65 20 3d 20 43 53 56 5f 46 49 4c  lename = CSV_FIL
48c0: 45 4e 41 4d 45 3b 20 20 43 53 56 5f 46 49 4c 45  ENAME;  CSV_FILE
48d0: 4e 41 4d 45 20 3d 20 30 3b 0a 20 20 70 4e 65 77  NAME = 0;.  pNew
48e0: 2d 3e 7a 44 61 74 61 20 3d 20 43 53 56 5f 44 41  ->zData = CSV_DA
48f0: 54 41 3b 20 20 20 20 20 20 20 20 20 20 43 53 56  TA;          CSV
4900: 5f 44 41 54 41 20 3d 20 30 3b 0a 23 69 66 64 65  _DATA = 0;.#ifde
4910: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
4920: 70 4e 65 77 2d 3e 74 73 74 46 6c 61 67 73 20 3d  pNew->tstFlags =
4930: 20 74 73 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69   tstFlags;.#endi
4940: 66 0a 20 20 69 66 28 20 62 48 65 61 64 65 72 21  f.  if( bHeader!
4950: 3d 31 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  =1 ){.    pNew->
4960: 69 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65  iStart = 0;.  }e
4970: 6c 73 65 20 69 66 28 20 70 4e 65 77 2d 3e 7a 44  lse if( pNew->zD
4980: 61 74 61 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  ata ){.    pNew-
4990: 3e 69 53 74 61 72 74 20 3d 20 28 69 6e 74 29 73  >iStart = (int)s
49a0: 52 64 72 2e 69 49 6e 3b 0a 20 20 7d 65 6c 73 65  Rdr.iIn;.  }else
49b0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 74 61  {.    pNew->iSta
49c0: 72 74 20 3d 20 66 74 65 6c 6c 28 73 52 64 72 2e  rt = ftell(sRdr.
49d0: 69 6e 29 3b 0a 20 20 7d 0a 20 20 63 73 76 5f 72  in);.  }.  csv_r
49e0: 65 61 64 65 72 5f 72 65 73 65 74 28 26 73 52 64  eader_reset(&sRd
49f0: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
4a00: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
4a10: 64 62 2c 20 43 53 56 5f 53 43 48 45 4d 41 29 3b  db, CSV_SCHEMA);
4a20: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
4a30: 20 63 73 76 5f 65 72 72 6d 73 67 28 26 73 52 64   csv_errmsg(&sRd
4a40: 72 2c 20 22 62 61 64 20 73 63 68 65 6d 61 3a 20  r, "bad schema: 
4a50: 27 25 73 27 20 2d 20 25 73 22 2c 20 43 53 56 5f  '%s' - %s", CSV_
4a60: 53 43 48 45 4d 41 2c 20 73 71 6c 69 74 65 33 5f  SCHEMA, sqlite3_
4a70: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
4a80: 20 67 6f 74 6f 20 63 73 76 74 61 62 5f 63 6f 6e   goto csvtab_con
4a90: 6e 65 63 74 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  nect_error;.  }.
4aa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4ab0: 65 6f 66 28 61 7a 50 56 61 6c 75 65 29 2f 73 69  eof(azPValue)/si
4ac0: 7a 65 6f 66 28 61 7a 50 56 61 6c 75 65 5b 30 5d  zeof(azPValue[0]
4ad0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
4ae0: 69 74 65 33 5f 66 72 65 65 28 61 7a 50 56 61 6c  ite3_free(azPVal
4af0: 75 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  ue[i]);.  }.  re
4b00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4b10: 0a 63 73 76 74 61 62 5f 63 6f 6e 6e 65 63 74 5f  .csvtab_connect_
4b20: 6f 6f 6d 3a 0a 20 20 72 63 20 3d 20 53 51 4c 49  oom:.  rc = SQLI
4b30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 63 73 76 5f  TE_NOMEM;.  csv_
4b40: 65 72 72 6d 73 67 28 26 73 52 64 72 2c 20 22 6f  errmsg(&sRdr, "o
4b50: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
4b60: 0a 63 73 76 74 61 62 5f 63 6f 6e 6e 65 63 74 5f  .csvtab_connect_
4b70: 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 4e 65  error:.  if( pNe
4b80: 77 20 29 20 63 73 76 74 61 62 44 69 73 63 6f 6e  w ) csvtabDiscon
4b90: 6e 65 63 74 28 26 70 4e 65 77 2d 3e 62 61 73 65  nect(&pNew->base
4ba0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4bb0: 73 69 7a 65 6f 66 28 61 7a 50 56 61 6c 75 65 29  sizeof(azPValue)
4bc0: 2f 73 69 7a 65 6f 66 28 61 7a 50 56 61 6c 75 65  /sizeof(azPValue
4bd0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
4be0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 50  sqlite3_free(azP
4bf0: 56 61 6c 75 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20  Value[i]);.  }. 
4c00: 20 69 66 28 20 73 52 64 72 2e 7a 45 72 72 5b 30   if( sRdr.zErr[0
4c10: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
4c20: 5f 66 72 65 65 28 2a 70 7a 45 72 72 29 3b 0a 20  _free(*pzErr);. 
4c30: 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
4c40: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
4c50: 2c 20 73 52 64 72 2e 7a 45 72 72 29 3b 0a 20 20  , sRdr.zErr);.  
4c60: 7d 0a 20 20 63 73 76 5f 72 65 61 64 65 72 5f 72  }.  csv_reader_r
4c70: 65 73 65 74 28 26 73 52 64 72 29 3b 0a 20 20 69  eset(&sRdr);.  i
4c80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4c90: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45   ) rc = SQLITE_E
4ca0: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 72  RROR;.  return r
4cb0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  c;.}../*.** Rese
4cc0: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  t the current ro
4cd0: 77 20 63 6f 6e 74 65 6e 74 20 68 65 6c 64 20 62  w content held b
4ce0: 79 20 61 20 43 73 76 43 75 72 73 6f 72 2e 0a 2a  y a CsvCursor..*
4cf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 73  /.static void cs
4d00: 76 74 61 62 43 75 72 73 6f 72 52 6f 77 52 65 73  vtabCursorRowRes
4d10: 65 74 28 43 73 76 43 75 72 73 6f 72 20 2a 70 43  et(CsvCursor *pC
4d20: 75 72 29 7b 0a 20 20 43 73 76 54 61 62 6c 65 20  ur){.  CsvTable 
4d30: 2a 70 54 61 62 20 3d 20 28 43 73 76 54 61 62 6c  *pTab = (CsvTabl
4d40: 65 2a 29 70 43 75 72 2d 3e 62 61 73 65 2e 70 56  e*)pCur->base.pV
4d50: 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tab;.  int i;.  
4d60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
4d70: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
4d80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
4d90: 75 72 2d 3e 61 7a 56 61 6c 5b 69 5d 29 3b 0a 20  ur->azVal[i]);. 
4da0: 20 20 20 70 43 75 72 2d 3e 61 7a 56 61 6c 5b 69     pCur->azVal[i
4db0: 5d 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  ] = 0;.    pCur-
4dc0: 3e 61 4c 65 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20  >aLen[i] = 0;.  
4dd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  }.}../*.** The x
4de0: 43 6f 6e 6e 65 63 74 20 61 6e 64 20 78 43 72 65  Connect and xCre
4df0: 61 74 65 20 6d 65 74 68 6f 64 73 20 64 6f 20 74  ate methods do t
4e00: 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2c 20 62  he same thing, b
4e10: 75 74 20 74 68 65 79 20 6d 75 73 74 20 62 65 0a  ut they must be.
4e20: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20  ** different so 
4e30: 74 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c  that the virtual
4e40: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 6e   table is not an
4e50: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
4e60: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
4e70: 74 69 63 20 69 6e 74 20 63 73 76 74 61 62 43 72  tic int csvtabCr
4e80: 65 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  eate(.  sqlite3 
4e90: 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75  *db,.  void *pAu
4ea0: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63  x,.  int argc, c
4eb0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
4ec0: 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33  *argv,.  sqlite3
4ed0: 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a  _vtab **ppVtab,.
4ee0: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
4ef0: 7b 0a 20 72 65 74 75 72 6e 20 63 73 76 74 61 62  {. return csvtab
4f00: 43 6f 6e 6e 65 63 74 28 64 62 2c 20 70 41 75 78  Connect(db, pAux
4f10: 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 70 70  , argc, argv, pp
4f20: 56 74 61 62 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a  Vtab, pzErr);.}.
4f30: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  ./*.** Destructo
4f40: 72 20 66 6f 72 20 61 20 43 73 76 43 75 72 73 6f  r for a CsvCurso
4f50: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
4f60: 20 63 73 76 74 61 62 43 6c 6f 73 65 28 73 71 6c   csvtabClose(sql
4f70: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
4f80: 20 2a 63 75 72 29 7b 0a 20 20 43 73 76 43 75 72   *cur){.  CsvCur
4f90: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 43 73 76  sor *pCur = (Csv
4fa0: 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 63  Cursor*)cur;.  c
4fb0: 73 76 74 61 62 43 75 72 73 6f 72 52 6f 77 52 65  svtabCursorRowRe
4fc0: 73 65 74 28 70 43 75 72 29 3b 0a 20 20 63 73 76  set(pCur);.  csv
4fd0: 5f 72 65 61 64 65 72 5f 72 65 73 65 74 28 26 70  _reader_reset(&p
4fe0: 43 75 72 2d 3e 72 64 72 29 3b 0a 20 20 73 71 6c  Cur->rdr);.  sql
4ff0: 69 74 65 33 5f 66 72 65 65 28 63 75 72 29 3b 0a  ite3_free(cur);.
5000: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5010: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  OK;.}../*.** Con
5020: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20 6e  structor for a n
5030: 65 77 20 43 73 76 54 61 62 6c 65 20 63 75 72 73  ew CsvTable curs
5040: 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  or object..*/.st
5050: 61 74 69 63 20 69 6e 74 20 63 73 76 74 61 62 4f  atic int csvtabO
5060: 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62  pen(sqlite3_vtab
5070: 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61   *p, sqlite3_vta
5080: 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72  b_cursor **ppCur
5090: 73 6f 72 29 7b 0a 20 20 43 73 76 54 61 62 6c 65  sor){.  CsvTable
50a0: 20 2a 70 54 61 62 20 3d 20 28 43 73 76 54 61 62   *pTab = (CsvTab
50b0: 6c 65 2a 29 70 3b 0a 20 20 43 73 76 43 75 72 73  le*)p;.  CsvCurs
50c0: 6f 72 20 2a 70 43 75 72 3b 0a 20 20 73 69 7a 65  or *pCur;.  size
50d0: 5f 74 20 6e 42 79 74 65 3b 0a 20 20 6e 42 79 74  _t nByte;.  nByt
50e0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 43 75 72  e = sizeof(*pCur
50f0: 29 20 2b 20 28 73 69 7a 65 6f 66 28 63 68 61 72  ) + (sizeof(char
5100: 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 2a  *)+sizeof(int))*
5110: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 43  pTab->nCol;.  pC
5120: 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ur = sqlite3_mal
5130: 6c 6f 63 36 34 28 20 6e 42 79 74 65 20 29 3b 0a  loc64( nByte );.
5140: 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20    if( pCur==0 ) 
5150: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5160: 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  MEM;.  memset(pC
5170: 75 72 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  ur, 0, nByte);. 
5180: 20 70 43 75 72 2d 3e 61 7a 56 61 6c 20 3d 20 28   pCur->azVal = (
5190: 63 68 61 72 2a 2a 29 26 70 43 75 72 5b 31 5d 3b  char**)&pCur[1];
51a0: 0a 20 20 70 43 75 72 2d 3e 61 4c 65 6e 20 3d 20  .  pCur->aLen = 
51b0: 28 69 6e 74 2a 29 26 70 43 75 72 2d 3e 61 7a 56  (int*)&pCur->azV
51c0: 61 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 5d 3b 0a  al[pTab->nCol];.
51d0: 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 26 70    *ppCursor = &p
51e0: 43 75 72 2d 3e 62 61 73 65 3b 0a 20 20 69 66 28  Cur->base;.  if(
51f0: 20 63 73 76 5f 72 65 61 64 65 72 5f 6f 70 65 6e   csv_reader_open
5200: 28 26 70 43 75 72 2d 3e 72 64 72 2c 20 70 54 61  (&pCur->rdr, pTa
5210: 62 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 54  b->zFilename, pT
5220: 61 62 2d 3e 7a 44 61 74 61 29 20 29 7b 0a 20 20  ab->zData) ){.  
5230: 20 20 63 73 76 5f 78 66 65 72 5f 65 72 72 6f 72    csv_xfer_error
5240: 28 70 54 61 62 2c 20 26 70 43 75 72 2d 3e 72 64  (pTab, &pCur->rd
5250: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  r);.    return S
5260: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
5270: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5280: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  _OK;.}.../*.** A
5290: 64 76 61 6e 63 65 20 61 20 43 73 76 43 75 72 73  dvance a CsvCurs
52a0: 6f 72 20 74 6f 20 69 74 73 20 6e 65 78 74 20 72  or to its next r
52b0: 6f 77 20 6f 66 20 69 6e 70 75 74 2e 0a 2a 2a 20  ow of input..** 
52c0: 53 65 74 20 74 68 65 20 45 4f 46 20 6d 61 72 6b  Set the EOF mark
52d0: 65 72 20 69 66 20 77 65 20 72 65 61 63 68 20 74  er if we reach t
52e0: 68 65 20 65 6e 64 20 6f 66 20 69 6e 70 75 74 2e  he end of input.
52f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
5300: 73 76 74 61 62 4e 65 78 74 28 73 71 6c 69 74 65  svtabNext(sqlite
5310: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
5320: 75 72 29 7b 0a 20 20 43 73 76 43 75 72 73 6f 72  ur){.  CsvCursor
5330: 20 2a 70 43 75 72 20 3d 20 28 43 73 76 43 75 72   *pCur = (CsvCur
5340: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 43 73 76 54  sor*)cur;.  CsvT
5350: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 43 73  able *pTab = (Cs
5360: 76 54 61 62 6c 65 2a 29 63 75 72 2d 3e 70 56 74  vTable*)cur->pVt
5370: 61 62 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  ab;.  int i = 0;
5380: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 64 6f  .  char *z;.  do
5390: 7b 0a 20 20 20 20 7a 20 3d 20 63 73 76 5f 72 65  {.    z = csv_re
53a0: 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 26 70 43  ad_one_field(&pC
53b0: 75 72 2d 3e 72 64 72 29 3b 0a 20 20 20 20 69 66  ur->rdr);.    if
53c0: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
53d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
53e0: 20 69 66 28 20 69 3c 70 54 61 62 2d 3e 6e 43 6f   if( i<pTab->nCo
53f0: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l ){.      if( p
5400: 43 75 72 2d 3e 61 4c 65 6e 5b 69 5d 20 3c 20 70  Cur->aLen[i] < p
5410: 43 75 72 2d 3e 72 64 72 2e 6e 2b 31 20 29 7b 0a  Cur->rdr.n+1 ){.
5420: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
5430: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
5440: 6c 6c 6f 63 36 34 28 70 43 75 72 2d 3e 61 7a 56  lloc64(pCur->azV
5450: 61 6c 5b 69 5d 2c 20 70 43 75 72 2d 3e 72 64 72  al[i], pCur->rdr
5460: 2e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69  .n+1);.        i
5470: 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( zNew==0 ){.  
5480: 20 20 20 20 20 20 20 20 63 73 76 5f 65 72 72 6d          csv_errm
5490: 73 67 28 26 70 43 75 72 2d 3e 72 64 72 2c 20 22  sg(&pCur->rdr, "
54a0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
54b0: 0a 20 20 20 20 20 20 20 20 20 20 63 73 76 5f 78  .          csv_x
54c0: 66 65 72 5f 65 72 72 6f 72 28 70 54 61 62 2c 20  fer_error(pTab, 
54d0: 26 70 43 75 72 2d 3e 72 64 72 29 3b 0a 20 20 20  &pCur->rdr);.   
54e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
54f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5500: 70 43 75 72 2d 3e 61 7a 56 61 6c 5b 69 5d 20 3d  pCur->azVal[i] =
5510: 20 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70   zNew;.        p
5520: 43 75 72 2d 3e 61 4c 65 6e 5b 69 5d 20 3d 20 70  Cur->aLen[i] = p
5530: 43 75 72 2d 3e 72 64 72 2e 6e 2b 31 3b 0a 20 20  Cur->rdr.n+1;.  
5540: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
5550: 70 79 28 70 43 75 72 2d 3e 61 7a 56 61 6c 5b 69  py(pCur->azVal[i
5560: 5d 2c 20 7a 2c 20 70 43 75 72 2d 3e 72 64 72 2e  ], z, pCur->rdr.
5570: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b  n+1);.      i++;
5580: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
5590: 20 70 43 75 72 2d 3e 72 64 72 2e 63 54 65 72 6d   pCur->rdr.cTerm
55a0: 3d 3d 27 2c 27 20 29 3b 0a 20 20 69 66 28 20 7a  ==',' );.  if( z
55b0: 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 72 64  ==0 || (pCur->rd
55c0: 72 2e 63 54 65 72 6d 3d 3d 45 4f 46 20 26 26 20  r.cTerm==EOF && 
55d0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 7b  i<pTab->nCol) ){
55e0: 0a 20 20 20 20 70 43 75 72 2d 3e 69 52 6f 77 69  .    pCur->iRowi
55f0: 64 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  d = -1;.  }else{
5600: 0a 20 20 20 20 70 43 75 72 2d 3e 69 52 6f 77 69  .    pCur->iRowi
5610: 64 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  d++;.    while( 
5620: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  i<pTab->nCol ){.
5630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
5640: 65 65 28 70 43 75 72 2d 3e 61 7a 56 61 6c 5b 69  ee(pCur->azVal[i
5650: 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ]);.      pCur->
5660: 61 7a 56 61 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20  azVal[i] = 0;.  
5670: 20 20 20 20 70 43 75 72 2d 3e 61 4c 65 6e 5b 69      pCur->aLen[i
5680: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 2b 2b  ] = 0;.      i++
5690: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
56a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
56b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
56c0: 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c 75 6d 6e  values of column
56d0: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74  s for the row at
56e0: 20 77 68 69 63 68 20 74 68 65 20 43 73 76 43 75   which the CsvCu
56f0: 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65  rsor.** is curre
5700: 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
5710: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73 76  /.static int csv
5720: 74 61 62 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c  tabColumn(.  sql
5730: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
5740: 20 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68 65 20   *cur,   /* The 
5750: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  cursor */.  sqli
5760: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
5770: 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
5780: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c   argument to sql
5790: 69 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e 2e 28  ite3_result_...(
57a0: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20 20 20 20  ) */.  int i    
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57c0: 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75     /* Which colu
57d0: 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  mn to return */.
57e0: 29 7b 0a 20 20 43 73 76 43 75 72 73 6f 72 20 2a  ){.  CsvCursor *
57f0: 70 43 75 72 20 3d 20 28 43 73 76 43 75 72 73 6f  pCur = (CsvCurso
5800: 72 2a 29 63 75 72 3b 0a 20 20 43 73 76 54 61 62  r*)cur;.  CsvTab
5810: 6c 65 20 2a 70 54 61 62 20 3d 20 28 43 73 76 54  le *pTab = (CsvT
5820: 61 62 6c 65 2a 29 63 75 72 2d 3e 70 56 74 61 62  able*)cur->pVtab
5830: 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20  ;.  if( i>=0 && 
5840: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20  i<pTab->nCol && 
5850: 70 43 75 72 2d 3e 61 7a 56 61 6c 5b 69 5d 21 3d  pCur->azVal[i]!=
5860: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5870: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78  _result_text(ctx
5880: 2c 20 70 43 75 72 2d 3e 61 7a 56 61 6c 5b 69 5d  , pCur->azVal[i]
5890: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
58a0: 54 49 43 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  TIC);.  }.  retu
58b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
58c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
58d0: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
58e0: 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a  current row..*/.
58f0: 73 74 61 74 69 63 20 69 6e 74 20 63 73 76 74 61  static int csvta
5900: 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76  bRowid(sqlite3_v
5910: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c  tab_cursor *cur,
5920: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
5930: 52 6f 77 69 64 29 7b 0a 20 20 43 73 76 43 75 72  Rowid){.  CsvCur
5940: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 43 73 76  sor *pCur = (Csv
5950: 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 2a  Cursor*)cur;.  *
5960: 70 52 6f 77 69 64 20 3d 20 70 43 75 72 2d 3e 69  pRowid = pCur->i
5970: 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  Rowid;.  return 
5980: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5990: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
59a0: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  if the cursor ha
59b0: 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 6f 66 66  s been moved off
59c0: 20 6f 66 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   of the last.** 
59d0: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 0a 2a  row of output..*
59e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73 76  /.static int csv
59f0: 74 61 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76  tabEof(sqlite3_v
5a00: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
5a10: 7b 0a 20 20 43 73 76 43 75 72 73 6f 72 20 2a 70  {.  CsvCursor *p
5a20: 43 75 72 20 3d 20 28 43 73 76 43 75 72 73 6f 72  Cur = (CsvCursor
5a30: 2a 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20  *)cur;.  return 
5a40: 70 43 75 72 2d 3e 69 52 6f 77 69 64 3c 30 3b 0a  pCur->iRowid<0;.
5a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 61 20  }../*.** Only a 
5a60: 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
5a70: 69 73 20 73 75 70 70 6f 72 74 65 64 2e 20 20 53  is supported.  S
5a80: 6f 20 78 46 69 6c 74 65 72 20 73 69 6d 70 6c 79  o xFilter simply
5a90: 20 72 65 77 69 6e 64 73 20 74 6f 0a 2a 2a 20 74   rewinds to.** t
5aa0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f  he beginning..*/
5ab0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73 76 74  .static int csvt
5ac0: 61 62 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69  abFilter(.  sqli
5ad0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
5ae0: 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20  *pVtabCursor, . 
5af0: 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e   int idxNum, con
5b00: 73 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c  st char *idxStr,
5b10: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  .  int argc, sql
5b20: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5b30: 76 0a 29 7b 0a 20 20 43 73 76 43 75 72 73 6f 72  v.){.  CsvCursor
5b40: 20 2a 70 43 75 72 20 3d 20 28 43 73 76 43 75 72   *pCur = (CsvCur
5b50: 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72  sor*)pVtabCursor
5b60: 3b 0a 20 20 43 73 76 54 61 62 6c 65 20 2a 70 54  ;.  CsvTable *pT
5b70: 61 62 20 3d 20 28 43 73 76 54 61 62 6c 65 2a 29  ab = (CsvTable*)
5b80: 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
5b90: 61 62 3b 0a 20 20 70 43 75 72 2d 3e 69 52 6f 77  ab;.  pCur->iRow
5ba0: 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  id = 0;.  if( pC
5bb0: 75 72 2d 3e 72 64 72 2e 69 6e 3d 3d 30 20 29 7b  ur->rdr.in==0 ){
5bc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
5bd0: 72 2d 3e 72 64 72 2e 7a 49 6e 3d 3d 70 54 61 62  r->rdr.zIn==pTab
5be0: 2d 3e 7a 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->zData );.    a
5bf0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 53 74  ssert( pTab->iSt
5c00: 61 72 74 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73  art>=0 );.    as
5c10: 73 65 72 74 28 20 28 73 69 7a 65 5f 74 29 70 54  sert( (size_t)pT
5c20: 61 62 2d 3e 69 53 74 61 72 74 3c 3d 70 43 75 72  ab->iStart<=pCur
5c30: 2d 3e 72 64 72 2e 6e 49 6e 20 29 3b 0a 20 20 20  ->rdr.nIn );.   
5c40: 20 70 43 75 72 2d 3e 72 64 72 2e 69 49 6e 20 3d   pCur->rdr.iIn =
5c50: 20 70 54 61 62 2d 3e 69 53 74 61 72 74 3b 0a 20   pTab->iStart;. 
5c60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 73 65 65   }else{.    fsee
5c70: 6b 28 70 43 75 72 2d 3e 72 64 72 2e 69 6e 2c 20  k(pCur->rdr.in, 
5c80: 70 54 61 62 2d 3e 69 53 74 61 72 74 2c 20 53 45  pTab->iStart, SE
5c90: 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 70 43 75  EK_SET);.    pCu
5ca0: 72 2d 3e 72 64 72 2e 69 49 6e 20 3d 20 30 3b 0a  r->rdr.iIn = 0;.
5cb0: 20 20 20 20 70 43 75 72 2d 3e 72 64 72 2e 6e 49      pCur->rdr.nI
5cc0: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  n = 0;.  }.  ret
5cd0: 75 72 6e 20 63 73 76 74 61 62 4e 65 78 74 28 70  urn csvtabNext(p
5ce0: 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a  VtabCursor);.}..
5cf0: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 61 20 66 6f 72  /*.** Only a for
5d00: 77 61 72 64 20 66 75 6c 6c 20 74 61 62 6c 65 20  ward full table 
5d10: 73 63 61 6e 20 69 73 20 73 75 70 70 6f 72 74 65  scan is supporte
5d20: 64 2e 20 20 78 42 65 73 74 49 6e 64 65 78 20 69  d.  xBestIndex i
5d30: 73 20 6d 6f 73 74 6c 79 0a 2a 2a 20 61 20 6e 6f  s mostly.** a no
5d40: 2d 6f 70 2e 20 20 49 66 20 43 53 56 54 45 53 54  -op.  If CSVTEST
5d50: 5f 46 49 44 58 20 69 73 20 73 65 74 2c 20 74 68  _FIDX is set, th
5d60: 65 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  en the presence 
5d70: 6f 66 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63  of equality.** c
5d80: 6f 6e 73 74 72 61 69 6e 74 73 20 6c 6f 77 65 72  onstraints lower
5d90: 73 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  s the estimated 
5da0: 63 6f 73 74 2c 20 77 68 69 63 68 20 69 73 20 66  cost, which is f
5db0: 69 63 74 69 6f 6e 2c 20 62 75 74 20 69 73 20 75  iction, but is u
5dc0: 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
5dd0: 74 69 6e 67 20 63 65 72 74 61 69 6e 20 6b 69 6e  ting certain kin
5de0: 64 73 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61  ds of virtual ta
5df0: 62 6c 65 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  ble behavior..*/
5e00: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73 76 74  .static int csvt
5e10: 61 62 42 65 73 74 49 6e 64 65 78 28 0a 20 20 73  abBestIndex(.  s
5e20: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62  qlite3_vtab *tab
5e30: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ,.  sqlite3_inde
5e40: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
5e50: 0a 29 7b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  .){.  pIdxInfo->
5e60: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
5e70: 31 30 30 30 30 30 30 3b 0a 23 69 66 64 65 66 20  1000000;.#ifdef 
5e80: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
5e90: 28 20 28 28 28 43 73 76 54 61 62 6c 65 2a 29 74  ( (((CsvTable*)t
5ea0: 61 62 29 2d 3e 74 73 74 46 6c 61 67 73 20 26 20  ab)->tstFlags & 
5eb0: 43 53 56 54 45 53 54 5f 46 49 44 58 29 21 3d 30  CSVTEST_FIDX)!=0
5ec0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 75   ){.    /* The u
5ed0: 73 75 61 6c 20 28 61 6e 64 20 73 65 6e 73 69 62  sual (and sensib
5ee0: 6c 65 29 20 63 61 73 65 20 69 73 20 74 6f 20 61  le) case is to a
5ef0: 6c 77 61 79 73 20 64 6f 20 61 20 66 75 6c 6c 20  lways do a full 
5f00: 74 61 62 6c 65 20 73 63 61 6e 2e 0a 20 20 20 20  table scan..    
5f10: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 6e 20 74  ** The code in t
5f20: 68 69 73 20 62 72 61 6e 63 68 20 6f 6e 6c 79 20  his branch only 
5f30: 72 75 6e 73 20 77 68 65 6e 20 74 65 73 74 66 6c  runs when testfl
5f40: 61 67 73 3d 31 2e 20 20 54 68 69 73 20 63 6f 64  ags=1.  This cod
5f50: 65 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74  e.    ** generat
5f60: 65 73 20 61 6e 20 61 72 74 69 66 69 63 61 6c 20  es an artifical 
5f70: 61 6e 64 20 75 6e 72 65 61 6c 69 73 74 69 63 20  and unrealistic 
5f80: 70 6c 61 6e 20 77 68 69 63 68 20 69 73 20 75 73  plan which is us
5f90: 65 66 75 6c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  eful.    ** for 
5fa0: 74 65 73 74 69 6e 67 20 76 69 72 74 75 61 6c 20  testing virtual 
5fb0: 74 61 62 6c 65 20 6c 6f 67 69 63 20 62 75 74 20  table logic but 
5fc0: 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20 74  is not helpful t
5fd0: 6f 20 72 65 61 6c 20 61 70 70 6c 69 63 61 74 69  o real applicati
5fe0: 6f 6e 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ons..    **.    
5ff0: 2a 2a 20 41 6e 79 20 3d 3d 2c 20 4c 49 4b 45 2c  ** Any ==, LIKE,
6000: 20 6f 72 20 47 4c 4f 42 20 63 6f 6e 73 74 72 61   or GLOB constra
6010: 69 6e 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73  int is marked as
6020: 20 75 73 61 62 6c 65 20 62 79 20 74 68 65 20 76   usable by the v
6030: 69 72 74 75 61 6c 0a 20 20 20 20 2a 2a 20 74 61  irtual.    ** ta
6040: 62 6c 65 20 28 65 76 65 6e 20 74 68 6f 75 67 68  ble (even though
6050: 20 69 74 20 69 73 20 6e 6f 74 29 20 61 6e 64 20   it is not) and 
6060: 74 68 65 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e  the cost of runn
6070: 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20  ing the virtual 
6080: 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
6090: 72 65 64 75 63 65 64 20 66 72 6f 6d 20 31 20 6d  reduced from 1 m
60a0: 69 6c 6c 69 6f 6e 20 74 6f 20 6a 75 73 74 20 31  illion to just 1
60b0: 30 2e 20 20 54 68 65 20 63 6f 6e 73 74 72 61 69  0.  The constrai
60c0: 6e 74 73 20 61 72 65 20 2a 6e 6f 74 2a 20 6d 61  nts are *not* ma
60d0: 72 6b 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 6f  rked.    ** as o
60e0: 6d 69 74 74 61 62 6c 65 2c 20 68 6f 77 65 76 65  mittable, howeve
60f0: 72 2c 20 73 6f 20 74 68 65 20 71 75 65 72 79 20  r, so the query 
6100: 70 6c 61 6e 6e 65 72 20 73 68 6f 75 6c 64 20 73  planner should s
6110: 74 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 0a  till generate a.
6120: 20 20 20 20 2a 2a 20 70 6c 61 6e 20 74 68 61 74      ** plan that
6130: 20 67 69 76 65 73 20 61 20 63 6f 72 72 65 63 74   gives a correct
6140: 20 61 6e 73 77 65 72 2c 20 65 76 65 6e 20 69 66   answer, even if
6150: 20 74 68 65 79 20 70 6c 61 6e 20 69 73 20 6e 6f   they plan is no
6160: 74 20 6f 70 74 69 6d 61 6c 2e 0a 20 20 20 20 2a  t optimal..    *
6170: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
6180: 20 69 6e 74 20 6e 43 6f 6e 73 74 20 3d 20 30 3b   int nConst = 0;
6190: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
61a0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
61b0: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
61c0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
61d0: 20 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70   op;.      if( p
61e0: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
61f0: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 3d 3d  aint[i].usable==
6200: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
6210: 20 20 20 20 6f 70 20 3d 20 70 49 64 78 49 6e 66      op = pIdxInf
6220: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  o->aConstraint[i
6230: 5d 2e 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20  ].op;.      if( 
6240: 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op==SQLITE_INDEX
6250: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 0a  _CONSTRAINT_EQ .
6260: 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d 53 51         || op==SQ
6270: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
6280: 52 41 49 4e 54 5f 4c 49 4b 45 0a 20 20 20 20 20  RAINT_LIKE.     
6290: 20 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f    || op==SQLITE_
62a0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
62b0: 5f 47 4c 4f 42 0a 20 20 20 20 20 20 29 7b 0a 20  _GLOB.      ){. 
62c0: 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
62d0: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
62e0: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 70 49 64   10;.        pId
62f0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
6300: 6e 74 55 73 61 67 65 5b 6e 43 6f 6e 73 74 5d 2e  ntUsage[nConst].
6310: 61 72 67 76 49 6e 64 65 78 20 3d 20 6e 43 6f 6e  argvIndex = nCon
6320: 73 74 2b 31 3b 0a 20 20 20 20 20 20 20 20 6e 43  st+1;.        nC
6330: 6f 6e 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  onst++;.      }.
6340: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
6350: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6360: 5f 4f 4b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20  _OK;.}...static 
6370: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 43  sqlite3_module C
6380: 73 76 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30  svModule = {.  0
6390: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
63a0: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
63b0: 69 6f 6e 20 2a 2f 0a 20 20 63 73 76 74 61 62 43  ion */.  csvtabC
63c0: 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  reate,          
63d0: 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a    /* xCreate */.
63e0: 20 20 63 73 76 74 61 62 43 6f 6e 6e 65 63 74 2c    csvtabConnect,
63f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
6400: 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 63 73 76 74  onnect */.  csvt
6410: 61 62 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20  abBestIndex,    
6420: 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64       /* xBestInd
6430: 65 78 20 2a 2f 0a 20 20 63 73 76 74 61 62 44 69  ex */.  csvtabDi
6440: 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  sconnect,       
6450: 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20   /* xDisconnect 
6460: 2a 2f 0a 20 20 63 73 76 74 61 62 44 69 73 63 6f  */.  csvtabDisco
6470: 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a  nnect,        /*
6480: 20 78 44 65 73 74 72 6f 79 20 2a 2f 0a 20 20 63   xDestroy */.  c
6490: 73 76 74 61 62 4f 70 65 6e 2c 20 20 20 20 20 20  svtabOpen,      
64a0: 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
64b0: 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72   - open a cursor
64c0: 20 2a 2f 0a 20 20 63 73 76 74 61 62 43 6c 6f 73   */.  csvtabClos
64d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
64e0: 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65  * xClose - close
64f0: 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63   a cursor */.  c
6500: 73 76 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20  svtabFilter,    
6510: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74          /* xFilt
6520: 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73  er - configure s
6530: 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  can constraints 
6540: 2a 2f 0a 20 20 63 73 76 74 61 62 4e 65 78 74 2c  */.  csvtabNext,
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6560: 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65   xNext - advance
6570: 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63   a cursor */.  c
6580: 73 76 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20  svtabEof,       
6590: 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20          /* xEof 
65a0: 2d 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20  - check for end 
65b0: 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20 63 73 76  of scan */.  csv
65c0: 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  tabColumn,      
65d0: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e        /* xColumn
65e0: 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
65f0: 20 20 63 73 76 74 61 62 52 6f 77 69 64 2c 20 20    csvtabRowid,  
6600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
6610: 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61  owid - read data
6620: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6640: 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30  * xUpdate */.  0
6650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6660: 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69          /* xBegi
6670: 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6690: 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c  /* xSync */.  0,
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66b0: 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69         /* xCommi
66c0: 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66e0: 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  /* xRollback */.
66f0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
6700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
6710: 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  indMethod */.  0
6720: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6730: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
6740: 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66  me */.};..#ifdef
6750: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
6760: 2a 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74  ** For virtual t
6770: 61 62 6c 65 20 74 65 73 74 69 6e 67 2c 20 6d 61  able testing, ma
6780: 6b 65 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  ke a version of 
6790: 74 68 65 20 43 53 56 20 76 69 72 74 75 61 6c 20  the CSV virtual 
67a0: 74 61 62 6c 65 0a 2a 2a 20 61 76 61 69 6c 61 62  table.** availab
67b0: 6c 65 20 74 68 61 74 20 68 61 73 20 61 6e 20 78  le that has an x
67c0: 55 70 64 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  Update function.
67d0: 20 20 42 75 74 20 74 68 65 20 78 55 70 64 61 74    But the xUpdat
67e0: 65 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  e always returns
67f0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  .** SQLITE_READO
6800: 4e 4c 59 20 73 69 6e 63 65 20 74 68 65 20 43 53  NLY since the CS
6810: 56 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  V file is not re
6820: 61 6c 6c 79 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ally writable..*
6830: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73 76  /.static int csv
6840: 74 61 62 55 70 64 61 74 65 28 73 71 6c 69 74 65  tabUpdate(sqlite
6850: 33 5f 76 74 61 62 20 2a 70 2c 69 6e 74 20 6e 2c  3_vtab *p,int n,
6860: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 76  sqlite3_value**v
6870: 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 78  ,sqlite3_int64*x
6880: 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
6890: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 7d 0a 73  TE_READONLY;.}.s
68a0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f  tatic sqlite3_mo
68b0: 64 75 6c 65 20 43 73 76 4d 6f 64 75 6c 65 46 61  dule CsvModuleFa
68c0: 75 78 57 72 69 74 65 20 3d 20 7b 0a 20 20 30 2c  uxWrite = {.  0,
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68e0: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
68f0: 6f 6e 20 2a 2f 0a 20 20 63 73 76 74 61 62 43 72  on */.  csvtabCr
6900: 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  eate,           
6910: 20 2f 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a 20   /* xCreate */. 
6920: 20 63 73 76 74 61 62 43 6f 6e 6e 65 63 74 2c 20   csvtabConnect, 
6930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
6940: 6e 6e 65 63 74 20 2a 2f 0a 20 20 63 73 76 74 61  nnect */.  csvta
6950: 62 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20  bBestIndex,     
6960: 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65      /* xBestInde
6970: 78 20 2a 2f 0a 20 20 63 73 76 74 61 62 44 69 73  x */.  csvtabDis
6980: 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  connect,        
6990: 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a  /* xDisconnect *
69a0: 2f 0a 20 20 63 73 76 74 61 62 44 69 73 63 6f 6e  /.  csvtabDiscon
69b0: 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  nect,        /* 
69c0: 78 44 65 73 74 72 6f 79 20 2a 2f 0a 20 20 63 73  xDestroy */.  cs
69d0: 76 74 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20  vtabOpen,       
69e0: 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
69f0: 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  - open a cursor 
6a00: 2a 2f 0a 20 20 63 73 76 74 61 62 43 6c 6f 73 65  */.  csvtabClose
6a10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
6a20: 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20   xClose - close 
6a30: 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 73  a cursor */.  cs
6a40: 76 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20  vtabFilter,     
6a50: 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
6a60: 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63  r - configure sc
6a70: 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  an constraints *
6a80: 2f 0a 20 20 63 73 76 74 61 62 4e 65 78 74 2c 20  /.  csvtabNext, 
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6aa0: 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20  xNext - advance 
6ab0: 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 73  a cursor */.  cs
6ac0: 76 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20  vtabEof,        
6ad0: 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d         /* xEof -
6ae0: 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f   check for end o
6af0: 66 20 73 63 61 6e 20 2a 2f 0a 20 20 63 73 76 74  f scan */.  csvt
6b00: 61 62 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  abColumn,       
6b10: 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20       /* xColumn 
6b20: 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
6b30: 20 63 73 76 74 61 62 52 6f 77 69 64 2c 20 20 20   csvtabRowid,   
6b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
6b50: 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20  wid - read data 
6b60: 2a 2f 0a 20 20 63 73 76 74 61 62 55 70 64 61 74  */.  csvtabUpdat
6b70: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
6b80: 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c   xUpdate */.  0,
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ba0: 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e         /* xBegin
6bb0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6bd0: 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20  * xSync */.  0, 
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bf0: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74        /* xCommit
6c00: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6c20: 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  * xRollback */. 
6c30: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
6c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
6c50: 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c  ndMethod */.  0,
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c70: 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d         /* xRenam
6c80: 65 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f  e */.};.#endif /
6c90: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f  * SQLITE_TEST */
6ca0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ..#endif /* !def
6cb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6cc0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
6cd0: 2f 0a 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  /...#ifdef _WIN3
6ce0: 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c  2.__declspec(dll
6cf0: 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 2f  export).#endif./
6d00: 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
6d10: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
6d20: 6e 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  n the extension 
6d30: 69 73 20 6c 6f 61 64 65 64 2e 20 20 54 68 65 20  is loaded.  The 
6d40: 6e 65 77 0a 2a 2a 20 43 53 56 20 76 69 72 74 75  new.** CSV virtu
6d50: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
6d60: 69 73 20 72 65 67 69 73 74 65 72 65 64 20 77 69  is registered wi
6d70: 74 68 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 64  th the calling d
6d80: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
6d90: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
6da0: 6c 69 74 65 33 5f 63 73 76 5f 69 6e 69 74 28 0a  lite3_csv_init(.
6db0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
6dc0: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
6dd0: 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  g, .  const sqli
6de0: 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
6df0: 20 2a 70 41 70 69 0a 29 7b 0a 23 69 66 6e 64 65   *pApi.){.#ifnde
6e00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6e10: 52 54 55 41 4c 54 41 42 4c 45 09 0a 20 20 69 6e  RTUALTABLE..  in
6e20: 74 20 72 63 3b 0a 20 20 53 51 4c 49 54 45 5f 45  t rc;.  SQLITE_E
6e30: 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70  XTENSION_INIT2(p
6e40: 41 70 69 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Api);.  rc = sql
6e50: 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75  ite3_create_modu
6e60: 6c 65 28 64 62 2c 20 22 63 73 76 22 2c 20 26 43  le(db, "csv", &C
6e70: 73 76 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 23 69  svModule, 0);.#i
6e80: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
6e90: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6ea0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
6eb0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
6ec0: 6d 6f 64 75 6c 65 28 64 62 2c 20 22 63 73 76 5f  module(db, "csv_
6ed0: 77 72 22 2c 20 26 43 73 76 4d 6f 64 75 6c 65 46  wr", &CsvModuleF
6ee0: 61 75 78 57 72 69 74 65 2c 20 30 29 3b 0a 20 20  auxWrite, 0);.  
6ef0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
6f00: 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20 72 65  n rc;.#else.  re
6f10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6f20: 23 65 6e 64 69 66 0a 7d 0a                       #endif.}.