/ Hex Artifact Content
Login

Artifact 7f047aeb68f5802e7ce6639292095d622a488bb43526ed04810e0649faa71ceb:


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 28 69 6e 74 29 28 66 74 65 6c 6c  rt = (int)(ftell
49d0: 28 73 52 64 72 2e 69 6e 29 20 2d 20 73 52 64 72  (sRdr.in) - sRdr
49e0: 2e 6e 49 6e 20 2b 20 73 52 64 72 2e 69 49 6e 29  .nIn + sRdr.iIn)
49f0: 3b 0a 20 20 7d 0a 20 20 63 73 76 5f 72 65 61 64  ;.  }.  csv_read
4a00: 65 72 5f 72 65 73 65 74 28 26 73 52 64 72 29 3b  er_reset(&sRdr);
4a10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
4a20: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c  declare_vtab(db,
4a30: 20 43 53 56 5f 53 43 48 45 4d 41 29 3b 0a 20 20   CSV_SCHEMA);.  
4a40: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 73  if( rc ){.    cs
4a50: 76 5f 65 72 72 6d 73 67 28 26 73 52 64 72 2c 20  v_errmsg(&sRdr, 
4a60: 22 62 61 64 20 73 63 68 65 6d 61 3a 20 27 25 73  "bad schema: '%s
4a70: 27 20 2d 20 25 73 22 2c 20 43 53 56 5f 53 43 48  ' - %s", CSV_SCH
4a80: 45 4d 41 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  EMA, sqlite3_err
4a90: 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 67 6f  msg(db));.    go
4aa0: 74 6f 20 63 73 76 74 61 62 5f 63 6f 6e 6e 65 63  to csvtab_connec
4ab0: 74 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 66  t_error;.  }.  f
4ac0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4ad0: 28 61 7a 50 56 61 6c 75 65 29 2f 73 69 7a 65 6f  (azPValue)/sizeo
4ae0: 66 28 61 7a 50 56 61 6c 75 65 5b 30 5d 29 3b 20  f(azPValue[0]); 
4af0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
4b00: 33 5f 66 72 65 65 28 61 7a 50 56 61 6c 75 65 5b  3_free(azPValue[
4b10: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  i]);.  }.  retur
4b20: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 73  n SQLITE_OK;..cs
4b30: 76 74 61 62 5f 63 6f 6e 6e 65 63 74 5f 6f 6f 6d  vtab_connect_oom
4b40: 3a 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  :.  rc = SQLITE_
4b50: 4e 4f 4d 45 4d 3b 0a 20 20 63 73 76 5f 65 72 72  NOMEM;.  csv_err
4b60: 6d 73 67 28 26 73 52 64 72 2c 20 22 6f 75 74 20  msg(&sRdr, "out 
4b70: 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 0a 63 73  of memory");..cs
4b80: 76 74 61 62 5f 63 6f 6e 6e 65 63 74 5f 65 72 72  vtab_connect_err
4b90: 6f 72 3a 0a 20 20 69 66 28 20 70 4e 65 77 20 29  or:.  if( pNew )
4ba0: 20 63 73 76 74 61 62 44 69 73 63 6f 6e 6e 65 63   csvtabDisconnec
4bb0: 74 28 26 70 4e 65 77 2d 3e 62 61 73 65 29 3b 0a  t(&pNew->base);.
4bc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4bd0: 65 6f 66 28 61 7a 50 56 61 6c 75 65 29 2f 73 69  eof(azPValue)/si
4be0: 7a 65 6f 66 28 61 7a 50 56 61 6c 75 65 5b 30 5d  zeof(azPValue[0]
4bf0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
4c00: 69 74 65 33 5f 66 72 65 65 28 61 7a 50 56 61 6c  ite3_free(azPVal
4c10: 75 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66  ue[i]);.  }.  if
4c20: 28 20 73 52 64 72 2e 7a 45 72 72 5b 30 5d 20 29  ( sRdr.zErr[0] )
4c30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
4c40: 65 65 28 2a 70 7a 45 72 72 29 3b 0a 20 20 20 20  ee(*pzErr);.    
4c50: 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
4c60: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
4c70: 52 64 72 2e 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  Rdr.zErr);.  }. 
4c80: 20 63 73 76 5f 72 65 61 64 65 72 5f 72 65 73 65   csv_reader_rese
4c90: 74 28 26 73 52 64 72 29 3b 0a 20 20 69 66 28 20  t(&sRdr);.  if( 
4ca0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
4cb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
4cc0: 52 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  R;.  return rc;.
4cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
4ce0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63  he current row c
4cf0: 6f 6e 74 65 6e 74 20 68 65 6c 64 20 62 79 20 61  ontent held by a
4d00: 20 43 73 76 43 75 72 73 6f 72 2e 0a 2a 2f 0a 73   CsvCursor..*/.s
4d10: 74 61 74 69 63 20 76 6f 69 64 20 63 73 76 74 61  tatic void csvta
4d20: 62 43 75 72 73 6f 72 52 6f 77 52 65 73 65 74 28  bCursorRowReset(
4d30: 43 73 76 43 75 72 73 6f 72 20 2a 70 43 75 72 29  CsvCursor *pCur)
4d40: 7b 0a 20 20 43 73 76 54 61 62 6c 65 20 2a 70 54  {.  CsvTable *pT
4d50: 61 62 20 3d 20 28 43 73 76 54 61 62 6c 65 2a 29  ab = (CsvTable*)
4d60: 70 43 75 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCur->base.pVtab
4d70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
4d80: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
4d90: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ol; i++){.    sq
4da0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
4db0: 3e 61 7a 56 61 6c 5b 69 5d 29 3b 0a 20 20 20 20  >azVal[i]);.    
4dc0: 70 43 75 72 2d 3e 61 7a 56 61 6c 5b 69 5d 20 3d  pCur->azVal[i] =
4dd0: 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 4c   0;.    pCur->aL
4de0: 65 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d  en[i] = 0;.  }.}
4df0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 43 6f 6e  ../*.** The xCon
4e00: 6e 65 63 74 20 61 6e 64 20 78 43 72 65 61 74 65  nect and xCreate
4e10: 20 6d 65 74 68 6f 64 73 20 64 6f 20 74 68 65 20   methods do the 
4e20: 73 61 6d 65 20 74 68 69 6e 67 2c 20 62 75 74 20  same thing, but 
4e30: 74 68 65 79 20 6d 75 73 74 20 62 65 0a 2a 2a 20  they must be.** 
4e40: 64 69 66 66 65 72 65 6e 74 20 73 6f 20 74 68 61  different so tha
4e50: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  t the virtual ta
4e60: 62 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20 65 70  ble is not an ep
4e70: 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20  onymous virtual 
4e80: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
4e90: 20 69 6e 74 20 63 73 76 74 61 62 43 72 65 61 74   int csvtabCreat
4ea0: 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
4eb0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a  ,.  void *pAux,.
4ec0: 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73    int argc, cons
4ed0: 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72  t char *const*ar
4ee0: 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  gv,.  sqlite3_vt
4ef0: 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63  ab **ppVtab,.  c
4f00: 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
4f10: 72 65 74 75 72 6e 20 63 73 76 74 61 62 43 6f 6e  return csvtabCon
4f20: 6e 65 63 74 28 64 62 2c 20 70 41 75 78 2c 20 61  nect(db, pAux, a
4f30: 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56 74 61  rgc, argv, ppVta
4f40: 62 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a  b, pzErr);.}../*
4f50: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66  .** Destructor f
4f60: 6f 72 20 61 20 43 73 76 43 75 72 73 6f 72 2e 0a  or a CsvCursor..
4f70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73  */.static int cs
4f80: 76 74 61 62 43 6c 6f 73 65 28 73 71 6c 69 74 65  vtabClose(sqlite
4f90: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
4fa0: 75 72 29 7b 0a 20 20 43 73 76 43 75 72 73 6f 72  ur){.  CsvCursor
4fb0: 20 2a 70 43 75 72 20 3d 20 28 43 73 76 43 75 72   *pCur = (CsvCur
4fc0: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 63 73 76 74  sor*)cur;.  csvt
4fd0: 61 62 43 75 72 73 6f 72 52 6f 77 52 65 73 65 74  abCursorRowReset
4fe0: 28 70 43 75 72 29 3b 0a 20 20 63 73 76 5f 72 65  (pCur);.  csv_re
4ff0: 61 64 65 72 5f 72 65 73 65 74 28 26 70 43 75 72  ader_reset(&pCur
5000: 2d 3e 72 64 72 29 3b 0a 20 20 73 71 6c 69 74 65  ->rdr);.  sqlite
5010: 33 5f 66 72 65 65 28 63 75 72 29 3b 0a 20 20 72  3_free(cur);.  r
5020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
5040: 75 63 74 6f 72 20 66 6f 72 20 61 20 6e 65 77 20  uctor for a new 
5050: 43 73 76 54 61 62 6c 65 20 63 75 72 73 6f 72 20  CsvTable cursor 
5060: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
5070: 63 20 69 6e 74 20 63 73 76 74 61 62 4f 70 65 6e  c int csvtabOpen
5080: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
5090: 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  , sqlite3_vtab_c
50a0: 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72  ursor **ppCursor
50b0: 29 7b 0a 20 20 43 73 76 54 61 62 6c 65 20 2a 70  ){.  CsvTable *p
50c0: 54 61 62 20 3d 20 28 43 73 76 54 61 62 6c 65 2a  Tab = (CsvTable*
50d0: 29 70 3b 0a 20 20 43 73 76 43 75 72 73 6f 72 20  )p;.  CsvCursor 
50e0: 2a 70 43 75 72 3b 0a 20 20 73 69 7a 65 5f 74 20  *pCur;.  size_t 
50f0: 6e 42 79 74 65 3b 0a 20 20 6e 42 79 74 65 20 3d  nByte;.  nByte =
5100: 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 2b   sizeof(*pCur) +
5110: 20 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b   (sizeof(char*)+
5120: 73 69 7a 65 6f 66 28 69 6e 74 29 29 2a 70 54 61  sizeof(int))*pTa
5130: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 43 75 72 20  b->nCol;.  pCur 
5140: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
5150: 36 34 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  64( nByte );.  i
5160: 66 28 20 70 43 75 72 3d 3d 30 20 29 20 72 65 74  f( pCur==0 ) ret
5170: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5180: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2c  ;.  memset(pCur,
5190: 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70 43   0, nByte);.  pC
51a0: 75 72 2d 3e 61 7a 56 61 6c 20 3d 20 28 63 68 61  ur->azVal = (cha
51b0: 72 2a 2a 29 26 70 43 75 72 5b 31 5d 3b 0a 20 20  r**)&pCur[1];.  
51c0: 70 43 75 72 2d 3e 61 4c 65 6e 20 3d 20 28 69 6e  pCur->aLen = (in
51d0: 74 2a 29 26 70 43 75 72 2d 3e 61 7a 56 61 6c 5b  t*)&pCur->azVal[
51e0: 70 54 61 62 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 2a  pTab->nCol];.  *
51f0: 70 70 43 75 72 73 6f 72 20 3d 20 26 70 43 75 72  ppCursor = &pCur
5200: 2d 3e 62 61 73 65 3b 0a 20 20 69 66 28 20 63 73  ->base;.  if( cs
5210: 76 5f 72 65 61 64 65 72 5f 6f 70 65 6e 28 26 70  v_reader_open(&p
5220: 43 75 72 2d 3e 72 64 72 2c 20 70 54 61 62 2d 3e  Cur->rdr, pTab->
5230: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 54 61 62 2d  zFilename, pTab-
5240: 3e 7a 44 61 74 61 29 20 29 7b 0a 20 20 20 20 63  >zData) ){.    c
5250: 73 76 5f 78 66 65 72 5f 65 72 72 6f 72 28 70 54  sv_xfer_error(pT
5260: 61 62 2c 20 26 70 43 75 72 2d 3e 72 64 72 29 3b  ab, &pCur->rdr);
5270: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5280: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
5290: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
52a0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  ;.}.../*.** Adva
52b0: 6e 63 65 20 61 20 43 73 76 43 75 72 73 6f 72 20  nce a CsvCursor 
52c0: 74 6f 20 69 74 73 20 6e 65 78 74 20 72 6f 77 20  to its next row 
52d0: 6f 66 20 69 6e 70 75 74 2e 0a 2a 2a 20 53 65 74  of input..** Set
52e0: 20 74 68 65 20 45 4f 46 20 6d 61 72 6b 65 72 20   the EOF marker 
52f0: 69 66 20 77 65 20 72 65 61 63 68 20 74 68 65 20  if we reach the 
5300: 65 6e 64 20 6f 66 20 69 6e 70 75 74 2e 0a 2a 2f  end of input..*/
5310: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73 76 74  .static int csvt
5320: 61 62 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76  abNext(sqlite3_v
5330: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
5340: 7b 0a 20 20 43 73 76 43 75 72 73 6f 72 20 2a 70  {.  CsvCursor *p
5350: 43 75 72 20 3d 20 28 43 73 76 43 75 72 73 6f 72  Cur = (CsvCursor
5360: 2a 29 63 75 72 3b 0a 20 20 43 73 76 54 61 62 6c  *)cur;.  CsvTabl
5370: 65 20 2a 70 54 61 62 20 3d 20 28 43 73 76 54 61  e *pTab = (CsvTa
5380: 62 6c 65 2a 29 63 75 72 2d 3e 70 56 74 61 62 3b  ble*)cur->pVtab;
5390: 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
53a0: 63 68 61 72 20 2a 7a 3b 0a 20 20 64 6f 7b 0a 20  char *z;.  do{. 
53b0: 20 20 20 7a 20 3d 20 63 73 76 5f 72 65 61 64 5f     z = csv_read_
53c0: 6f 6e 65 5f 66 69 65 6c 64 28 26 70 43 75 72 2d  one_field(&pCur-
53d0: 3e 72 64 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  >rdr);.    if( z
53e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  ==0 ){.      bre
53f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
5400: 28 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  ( i<pTab->nCol )
5410: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
5420: 2d 3e 61 4c 65 6e 5b 69 5d 20 3c 20 70 43 75 72  ->aLen[i] < pCur
5430: 2d 3e 72 64 72 2e 6e 2b 31 20 29 7b 0a 20 20 20  ->rdr.n+1 ){.   
5440: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20       char *zNew 
5450: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
5460: 63 36 34 28 70 43 75 72 2d 3e 61 7a 56 61 6c 5b  c64(pCur->azVal[
5470: 69 5d 2c 20 70 43 75 72 2d 3e 72 64 72 2e 6e 2b  i], pCur->rdr.n+
5480: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
5490: 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zNew==0 ){.     
54a0: 20 20 20 20 20 63 73 76 5f 65 72 72 6d 73 67 28       csv_errmsg(
54b0: 26 70 43 75 72 2d 3e 72 64 72 2c 20 22 6f 75 74  &pCur->rdr, "out
54c0: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
54d0: 20 20 20 20 20 20 20 20 63 73 76 5f 78 66 65 72          csv_xfer
54e0: 5f 65 72 72 6f 72 28 70 54 61 62 2c 20 26 70 43  _error(pTab, &pC
54f0: 75 72 2d 3e 72 64 72 29 3b 0a 20 20 20 20 20 20  ur->rdr);.      
5500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5510: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75     }.        pCu
5520: 72 2d 3e 61 7a 56 61 6c 5b 69 5d 20 3d 20 7a 4e  r->azVal[i] = zN
5530: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  ew;.        pCur
5540: 2d 3e 61 4c 65 6e 5b 69 5d 20 3d 20 70 43 75 72  ->aLen[i] = pCur
5550: 2d 3e 72 64 72 2e 6e 2b 31 3b 0a 20 20 20 20 20  ->rdr.n+1;.     
5560: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28   }.      memcpy(
5570: 70 43 75 72 2d 3e 61 7a 56 61 6c 5b 69 5d 2c 20  pCur->azVal[i], 
5580: 7a 2c 20 70 43 75 72 2d 3e 72 64 72 2e 6e 2b 31  z, pCur->rdr.n+1
5590: 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  );.      i++;.  
55a0: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 43    }.  }while( pC
55b0: 75 72 2d 3e 72 64 72 2e 63 54 65 72 6d 3d 3d 27  ur->rdr.cTerm=='
55c0: 2c 27 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ,' );.  if( z==0
55d0: 20 7c 7c 20 28 70 43 75 72 2d 3e 72 64 72 2e 63   || (pCur->rdr.c
55e0: 54 65 72 6d 3d 3d 45 4f 46 20 26 26 20 69 3c 70  Term==EOF && i<p
55f0: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 7b 0a 20 20  Tab->nCol) ){.  
5600: 20 20 70 43 75 72 2d 3e 69 52 6f 77 69 64 20 3d    pCur->iRowid =
5610: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
5620: 20 20 70 43 75 72 2d 3e 69 52 6f 77 69 64 2b 2b    pCur->iRowid++
5630: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3c 70  ;.    while( i<p
5640: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
5650: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5660: 70 43 75 72 2d 3e 61 7a 56 61 6c 5b 69 5d 29 3b  pCur->azVal[i]);
5670: 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 7a 56  .      pCur->azV
5680: 61 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  al[i] = 0;.     
5690: 20 70 43 75 72 2d 3e 61 4c 65 6e 5b 69 5d 20 3d   pCur->aLen[i] =
56a0: 20 30 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   0;.      i++;. 
56b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
56c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
56d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c  /*.** Return val
56e0: 75 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66  ues of columns f
56f0: 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20 77 68  or the row at wh
5700: 69 63 68 20 74 68 65 20 43 73 76 43 75 72 73 6f  ich the CsvCurso
5710: 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  r.** is currentl
5720: 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 73  y pointing..*/.s
5730: 74 61 74 69 63 20 69 6e 74 20 63 73 76 74 61 62  tatic int csvtab
5740: 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65  Column(.  sqlite
5750: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
5760: 75 72 2c 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ur,   /* The cur
5770: 73 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  sor */.  sqlite3
5780: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 20  _context *ctx,  
5790: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
57a0: 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65  gument to sqlite
57b0: 33 5f 72 65 73 75 6c 74 5f 2e 2e 2e 28 29 20 2a  3_result_...() *
57c0: 2f 0a 20 20 69 6e 74 20 69 20 20 20 20 20 20 20  /.  int i       
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20  /* Which column 
57f0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a  to return */.){.
5800: 20 20 43 73 76 43 75 72 73 6f 72 20 2a 70 43 75    CsvCursor *pCu
5810: 72 20 3d 20 28 43 73 76 43 75 72 73 6f 72 2a 29  r = (CsvCursor*)
5820: 63 75 72 3b 0a 20 20 43 73 76 54 61 62 6c 65 20  cur;.  CsvTable 
5830: 2a 70 54 61 62 20 3d 20 28 43 73 76 54 61 62 6c  *pTab = (CsvTabl
5840: 65 2a 29 63 75 72 2d 3e 70 56 74 61 62 3b 0a 20  e*)cur->pVtab;. 
5850: 20 69 66 28 20 69 3e 3d 30 20 26 26 20 69 3c 70   if( i>=0 && i<p
5860: 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70 43 75  Tab->nCol && pCu
5870: 72 2d 3e 61 7a 56 61 6c 5b 69 5d 21 3d 30 20 29  r->azVal[i]!=0 )
5880: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
5890: 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70  sult_text(ctx, p
58a0: 43 75 72 2d 3e 61 7a 56 61 6c 5b 69 5d 2c 20 2d  Cur->azVal[i], -
58b0: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
58c0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
58d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
58e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
58f0: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72  owid for the cur
5900: 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  rent row..*/.sta
5910: 74 69 63 20 69 6e 74 20 63 73 76 74 61 62 52 6f  tic int csvtabRo
5920: 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  wid(sqlite3_vtab
5930: 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71  _cursor *cur, sq
5940: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
5950: 69 64 29 7b 0a 20 20 43 73 76 43 75 72 73 6f 72  id){.  CsvCursor
5960: 20 2a 70 43 75 72 20 3d 20 28 43 73 76 43 75 72   *pCur = (CsvCur
5970: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 2a 70 52 6f  sor*)cur;.  *pRo
5980: 77 69 64 20 3d 20 70 43 75 72 2d 3e 69 52 6f 77  wid = pCur->iRow
5990: 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  id;.  return SQL
59a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
59b0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
59c0: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 62  the cursor has b
59d0: 65 65 6e 20 6d 6f 76 65 64 20 6f 66 66 20 6f 66  een moved off of
59e0: 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 77   the last.** row
59f0: 20 6f 66 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73   of output..*/.s
5a00: 74 61 74 69 63 20 69 6e 74 20 63 73 76 74 61 62  tatic int csvtab
5a10: 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62  Eof(sqlite3_vtab
5a20: 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20  _cursor *cur){. 
5a30: 20 43 73 76 43 75 72 73 6f 72 20 2a 70 43 75 72   CsvCursor *pCur
5a40: 20 3d 20 28 43 73 76 43 75 72 73 6f 72 2a 29 63   = (CsvCursor*)c
5a50: 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  ur;.  return pCu
5a60: 72 2d 3e 69 52 6f 77 69 64 3c 30 3b 0a 7d 0a 0a  r->iRowid<0;.}..
5a70: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 61 20 66 75 6c  /*.** Only a ful
5a80: 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20  l table scan is 
5a90: 73 75 70 70 6f 72 74 65 64 2e 20 20 53 6f 20 78  supported.  So x
5aa0: 46 69 6c 74 65 72 20 73 69 6d 70 6c 79 20 72 65  Filter simply re
5ab0: 77 69 6e 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20  winds to.** the 
5ac0: 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  beginning..*/.st
5ad0: 61 74 69 63 20 69 6e 74 20 63 73 76 74 61 62 46  atic int csvtabF
5ae0: 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ilter(.  sqlite3
5af0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
5b00: 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e  tabCursor, .  in
5b10: 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20  t idxNum, const 
5b20: 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20  char *idxStr,.  
5b30: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
5b40: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5b50: 7b 0a 20 20 43 73 76 43 75 72 73 6f 72 20 2a 70  {.  CsvCursor *p
5b60: 43 75 72 20 3d 20 28 43 73 76 43 75 72 73 6f 72  Cur = (CsvCursor
5b70: 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
5b80: 20 43 73 76 54 61 62 6c 65 20 2a 70 54 61 62 20   CsvTable *pTab 
5b90: 3d 20 28 43 73 76 54 61 62 6c 65 2a 29 70 56 74  = (CsvTable*)pVt
5ba0: 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b  abCursor->pVtab;
5bb0: 0a 20 20 70 43 75 72 2d 3e 69 52 6f 77 69 64 20  .  pCur->iRowid 
5bc0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
5bd0: 3e 72 64 72 2e 69 6e 3d 3d 30 20 29 7b 0a 20 20  >rdr.in==0 ){.  
5be0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
5bf0: 72 64 72 2e 7a 49 6e 3d 3d 70 54 61 62 2d 3e 7a  rdr.zIn==pTab->z
5c00: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
5c10: 72 74 28 20 70 54 61 62 2d 3e 69 53 74 61 72 74  rt( pTab->iStart
5c20: 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  >=0 );.    asser
5c30: 74 28 20 28 73 69 7a 65 5f 74 29 70 54 61 62 2d  t( (size_t)pTab-
5c40: 3e 69 53 74 61 72 74 3c 3d 70 43 75 72 2d 3e 72  >iStart<=pCur->r
5c50: 64 72 2e 6e 49 6e 20 29 3b 0a 20 20 20 20 70 43  dr.nIn );.    pC
5c60: 75 72 2d 3e 72 64 72 2e 69 49 6e 20 3d 20 70 54  ur->rdr.iIn = pT
5c70: 61 62 2d 3e 69 53 74 61 72 74 3b 0a 20 20 7d 65  ab->iStart;.  }e
5c80: 6c 73 65 7b 0a 20 20 20 20 66 73 65 65 6b 28 70  lse{.    fseek(p
5c90: 43 75 72 2d 3e 72 64 72 2e 69 6e 2c 20 70 54 61  Cur->rdr.in, pTa
5ca0: 62 2d 3e 69 53 74 61 72 74 2c 20 53 45 45 4b 5f  b->iStart, SEEK_
5cb0: 53 45 54 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  SET);.    pCur->
5cc0: 72 64 72 2e 69 49 6e 20 3d 20 30 3b 0a 20 20 20  rdr.iIn = 0;.   
5cd0: 20 70 43 75 72 2d 3e 72 64 72 2e 6e 49 6e 20 3d   pCur->rdr.nIn =
5ce0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5cf0: 20 63 73 76 74 61 62 4e 65 78 74 28 70 56 74 61   csvtabNext(pVta
5d00: 62 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a  bCursor);.}../*.
5d10: 2a 2a 20 4f 6e 6c 79 20 61 20 66 6f 72 77 61 72  ** Only a forwar
5d20: 64 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  d full table sca
5d30: 6e 20 69 73 20 73 75 70 70 6f 72 74 65 64 2e 20  n is supported. 
5d40: 20 78 42 65 73 74 49 6e 64 65 78 20 69 73 20 6d   xBestIndex is m
5d50: 6f 73 74 6c 79 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  ostly.** a no-op
5d60: 2e 20 20 49 66 20 43 53 56 54 45 53 54 5f 46 49  .  If CSVTEST_FI
5d70: 44 58 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  DX is set, then 
5d80: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
5d90: 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73  equality.** cons
5da0: 74 72 61 69 6e 74 73 20 6c 6f 77 65 72 73 20 74  traints lowers t
5db0: 68 65 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73  he estimated cos
5dc0: 74 2c 20 77 68 69 63 68 20 69 73 20 66 69 63 74  t, which is fict
5dd0: 69 6f 6e 2c 20 62 75 74 20 69 73 20 75 73 65 66  ion, but is usef
5de0: 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
5df0: 67 20 63 65 72 74 61 69 6e 20 6b 69 6e 64 73 20  g certain kinds 
5e00: 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  of virtual table
5e10: 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 73 74   behavior..*/.st
5e20: 61 74 69 63 20 69 6e 74 20 63 73 76 74 61 62 42  atic int csvtabB
5e30: 65 73 74 49 6e 64 65 78 28 0a 20 20 73 71 6c 69  estIndex(.  sqli
5e40: 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 0a 20  te3_vtab *tab,. 
5e50: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
5e60: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 0a 29 7b  nfo *pIdxInfo.){
5e70: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
5e80: 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 30 30  imatedCost = 100
5e90: 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c  0000;.#ifdef SQL
5ea0: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 28  ITE_TEST.  if( (
5eb0: 28 28 43 73 76 54 61 62 6c 65 2a 29 74 61 62 29  ((CsvTable*)tab)
5ec0: 2d 3e 74 73 74 46 6c 61 67 73 20 26 20 43 53 56  ->tstFlags & CSV
5ed0: 54 45 53 54 5f 46 49 44 58 29 21 3d 30 20 29 7b  TEST_FIDX)!=0 ){
5ee0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 75 73 75 61  .    /* The usua
5ef0: 6c 20 28 61 6e 64 20 73 65 6e 73 69 62 6c 65 29  l (and sensible)
5f00: 20 63 61 73 65 20 69 73 20 74 6f 20 61 6c 77 61   case is to alwa
5f10: 79 73 20 64 6f 20 61 20 66 75 6c 6c 20 74 61 62  ys do a full tab
5f20: 6c 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2a 20  le scan..    ** 
5f30: 54 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  The code in this
5f40: 20 62 72 61 6e 63 68 20 6f 6e 6c 79 20 72 75 6e   branch only run
5f50: 73 20 77 68 65 6e 20 74 65 73 74 66 6c 61 67 73  s when testflags
5f60: 3d 31 2e 20 20 54 68 69 73 20 63 6f 64 65 0a 20  =1.  This code. 
5f70: 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 73 20     ** generates 
5f80: 61 6e 20 61 72 74 69 66 69 63 61 6c 20 61 6e 64  an artifical and
5f90: 20 75 6e 72 65 61 6c 69 73 74 69 63 20 70 6c 61   unrealistic pla
5fa0: 6e 20 77 68 69 63 68 20 69 73 20 75 73 65 66 75  n which is usefu
5fb0: 6c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 65 73  l.    ** for tes
5fc0: 74 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62  ting virtual tab
5fd0: 6c 65 20 6c 6f 67 69 63 20 62 75 74 20 69 73 20  le logic but is 
5fe0: 6e 6f 74 20 68 65 6c 70 66 75 6c 20 74 6f 20 72  not helpful to r
5ff0: 65 61 6c 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  eal applications
6000: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
6010: 41 6e 79 20 3d 3d 2c 20 4c 49 4b 45 2c 20 6f 72  Any ==, LIKE, or
6020: 20 47 4c 4f 42 20 63 6f 6e 73 74 72 61 69 6e 74   GLOB constraint
6030: 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 75 73   is marked as us
6040: 61 62 6c 65 20 62 79 20 74 68 65 20 76 69 72 74  able by the virt
6050: 75 61 6c 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ual.    ** table
6060: 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74   (even though it
6070: 20 69 73 20 6e 6f 74 29 20 61 6e 64 20 74 68 65   is not) and the
6080: 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67   cost of running
6090: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
60a0: 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 64  le.    ** is red
60b0: 75 63 65 64 20 66 72 6f 6d 20 31 20 6d 69 6c 6c  uced from 1 mill
60c0: 69 6f 6e 20 74 6f 20 6a 75 73 74 20 31 30 2e 20  ion to just 10. 
60d0: 20 54 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   The constraints
60e0: 20 61 72 65 20 2a 6e 6f 74 2a 20 6d 61 72 6b 65   are *not* marke
60f0: 64 0a 20 20 20 20 2a 2a 20 61 73 20 6f 6d 69 74  d.    ** as omit
6100: 74 61 62 6c 65 2c 20 68 6f 77 65 76 65 72 2c 20  table, however, 
6110: 73 6f 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  so the query pla
6120: 6e 6e 65 72 20 73 68 6f 75 6c 64 20 73 74 69 6c  nner should stil
6130: 6c 20 67 65 6e 65 72 61 74 65 20 61 0a 20 20 20  l generate a.   
6140: 20 2a 2a 20 70 6c 61 6e 20 74 68 61 74 20 67 69   ** plan that gi
6150: 76 65 73 20 61 20 63 6f 72 72 65 63 74 20 61 6e  ves a correct an
6160: 73 77 65 72 2c 20 65 76 65 6e 20 69 66 20 74 68  swer, even if th
6170: 65 79 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 6f  ey plan is not o
6180: 70 74 69 6d 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ptimal..    */. 
6190: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
61a0: 74 20 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a 20 20  t nConst = 0;.  
61b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
61c0: 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
61d0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
61e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 70  unsigned char op
61f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
6200: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
6210: 74 5b 69 5d 2e 75 73 61 62 6c 65 3d 3d 30 20 29  t[i].usable==0 )
6220: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6230: 20 6f 70 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e   op = pIdxInfo->
6240: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
6250: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  p;.      if( op=
6260: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
6270: 4e 53 54 52 41 49 4e 54 5f 45 51 20 0a 20 20 20  NSTRAINT_EQ .   
6280: 20 20 20 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54      || op==SQLIT
6290: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
62a0: 4e 54 5f 4c 49 4b 45 0a 20 20 20 20 20 20 20 7c  NT_LIKE.       |
62b0: 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  | op==SQLITE_IND
62c0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 4c  EX_CONSTRAINT_GL
62d0: 4f 42 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  OB.      ){.    
62e0: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
62f0: 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 30  timatedCost = 10
6300: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e  ;.        pIdxIn
6310: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
6320: 73 61 67 65 5b 6e 43 6f 6e 73 74 5d 2e 61 72 67  sage[nConst].arg
6330: 76 49 6e 64 65 78 20 3d 20 6e 43 6f 6e 73 74 2b  vIndex = nConst+
6340: 31 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6e 73  1;.        nCons
6350: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
6360: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
6370: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6380: 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 73 71 6c  ;.}...static sql
6390: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 43 73 76 4d  ite3_module CsvM
63a0: 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20  odule = {.  0,  
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63c0: 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
63d0: 20 2a 2f 0a 20 20 63 73 76 74 61 62 43 72 65 61   */.  csvtabCrea
63e0: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  te,            /
63f0: 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 63  * xCreate */.  c
6400: 73 76 74 61 62 43 6f 6e 6e 65 63 74 2c 20 20 20  svtabConnect,   
6410: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e          /* xConn
6420: 65 63 74 20 2a 2f 0a 20 20 63 73 76 74 61 62 42  ect */.  csvtabB
6430: 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20  estIndex,       
6440: 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20    /* xBestIndex 
6450: 2a 2f 0a 20 20 63 73 76 74 61 62 44 69 73 63 6f  */.  csvtabDisco
6460: 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a  nnect,        /*
6470: 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a   xDisconnect */.
6480: 20 20 63 73 76 74 61 62 44 69 73 63 6f 6e 6e 65    csvtabDisconne
6490: 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ct,        /* xD
64a0: 65 73 74 72 6f 79 20 2a 2f 0a 20 20 63 73 76 74  estroy */.  csvt
64b0: 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  abOpen,         
64c0: 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
64d0: 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
64e0: 0a 20 20 63 73 76 74 61 62 43 6c 6f 73 65 2c 20  .  csvtabClose, 
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
6500: 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20  Close - close a 
6510: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 73 76 74  cursor */.  csvt
6520: 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20  abFilter,       
6530: 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20       /* xFilter 
6540: 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e  - configure scan
6550: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
6560: 20 20 63 73 76 74 61 62 4e 65 78 74 2c 20 20 20    csvtabNext,   
6570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e             /* xN
6580: 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20  ext - advance a 
6590: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 73 76 74  cursor */.  csvt
65a0: 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20  abEof,          
65b0: 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63       /* xEof - c
65c0: 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20  heck for end of 
65d0: 73 63 61 6e 20 2a 2f 0a 20 20 63 73 76 74 61 62  scan */.  csvtab
65e0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
65f0: 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20     /* xColumn - 
6600: 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 63  read data */.  c
6610: 73 76 74 61 62 52 6f 77 69 64 2c 20 20 20 20 20  svtabRowid,     
6620: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69          /* xRowi
6630: 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  d - read data */
6640: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
6650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
6660: 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20 20  Update */.  0,  
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6680: 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a       /* xBegin *
6690: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
66b0: 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20  xSync */.  0,   
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a      /* xCommit *
66e0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6700: 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30  xRollback */.  0
6710: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6720: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64          /* xFind
6730: 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20  Method */.  0,  
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6750: 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20       /* xRename 
6760: 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51  */.};..#ifdef SQ
6770: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
6780: 46 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  For virtual tabl
6790: 65 20 74 65 73 74 69 6e 67 2c 20 6d 61 6b 65 20  e testing, make 
67a0: 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  a version of the
67b0: 20 43 53 56 20 76 69 72 74 75 61 6c 20 74 61 62   CSV virtual tab
67c0: 6c 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  le.** available 
67d0: 74 68 61 74 20 68 61 73 20 61 6e 20 78 55 70 64  that has an xUpd
67e0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 42  ate function.  B
67f0: 75 74 20 74 68 65 20 78 55 70 64 61 74 65 20 61  ut the xUpdate a
6800: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 0a 2a 2a  lways returns.**
6810: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
6820: 20 73 69 6e 63 65 20 74 68 65 20 43 53 56 20 66   since the CSV f
6830: 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
6840: 79 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 73  y writable..*/.s
6850: 74 61 74 69 63 20 69 6e 74 20 63 73 76 74 61 62  tatic int csvtab
6860: 55 70 64 61 74 65 28 73 71 6c 69 74 65 33 5f 76  Update(sqlite3_v
6870: 74 61 62 20 2a 70 2c 69 6e 74 20 6e 2c 73 71 6c  tab *p,int n,sql
6880: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 76 2c 73 71  ite3_value**v,sq
6890: 6c 69 74 65 33 5f 69 6e 74 36 34 2a 78 29 7b 0a  lite3_int64*x){.
68a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
68b0: 52 45 41 44 4f 4e 4c 59 3b 0a 7d 0a 73 74 61 74  READONLY;.}.stat
68c0: 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  ic sqlite3_modul
68d0: 65 20 43 73 76 4d 6f 64 75 6c 65 46 61 75 78 57  e CsvModuleFauxW
68e0: 72 69 74 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20  rite = {.  0,   
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6900: 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
6910: 2a 2f 0a 20 20 63 73 76 74 61 62 43 72 65 61 74  */.  csvtabCreat
6920: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
6930: 20 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 63 73   xCreate */.  cs
6940: 76 74 61 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20  vtabConnect,    
6950: 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65         /* xConne
6960: 63 74 20 2a 2f 0a 20 20 63 73 76 74 61 62 42 65  ct */.  csvtabBe
6970: 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20  stIndex,        
6980: 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2a   /* xBestIndex *
6990: 2f 0a 20 20 63 73 76 74 61 62 44 69 73 63 6f 6e  /.  csvtabDiscon
69a0: 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  nect,        /* 
69b0: 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20  xDisconnect */. 
69c0: 20 63 73 76 74 61 62 44 69 73 63 6f 6e 6e 65 63   csvtabDisconnec
69d0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65  t,        /* xDe
69e0: 73 74 72 6f 79 20 2a 2f 0a 20 20 63 73 76 74 61  stroy */.  csvta
69f0: 62 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  bOpen,          
6a00: 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f      /* xOpen - o
6a10: 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  pen a cursor */.
6a20: 20 20 63 73 76 74 61 62 43 6c 6f 73 65 2c 20 20    csvtabClose,  
6a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
6a40: 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63  lose - close a c
6a50: 75 72 73 6f 72 20 2a 2f 0a 20 20 63 73 76 74 61  ursor */.  csvta
6a60: 62 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20  bFilter,        
6a70: 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d      /* xFilter -
6a80: 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20   configure scan 
6a90: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
6aa0: 20 63 73 76 74 61 62 4e 65 78 74 2c 20 20 20 20   csvtabNext,    
6ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65            /* xNe
6ac0: 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63  xt - advance a c
6ad0: 75 72 73 6f 72 20 2a 2f 0a 20 20 63 73 76 74 61  ursor */.  csvta
6ae0: 62 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  bEof,           
6af0: 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63 68      /* xEof - ch
6b00: 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20 73  eck for end of s
6b10: 63 61 6e 20 2a 2f 0a 20 20 63 73 76 74 61 62 43  can */.  csvtabC
6b20: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
6b30: 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72    /* xColumn - r
6b40: 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 63 73  ead data */.  cs
6b50: 76 74 61 62 52 6f 77 69 64 2c 20 20 20 20 20 20  vtabRowid,      
6b60: 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64         /* xRowid
6b70: 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
6b80: 20 20 63 73 76 74 61 62 55 70 64 61 74 65 2c 20    csvtabUpdate, 
6b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
6ba0: 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20 20 20  pdate */.  0,   
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f      /* xBegin */
6bd0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
6bf0: 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Sync */.  0,    
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c10: 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f     /* xCommit */
6c20: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
6c40: 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c  Rollback */.  0,
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c60: 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d         /* xFindM
6c70: 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20  ethod */.  0,   
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c90: 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a      /* xRename *
6ca0: 2f 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  /.};.#endif /* S
6cb0: 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 23  QLITE_TEST */..#
6cc0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
6cd0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
6ce0: 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
6cf0: 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f  .#ifdef _WIN32._
6d00: 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
6d10: 6f 72 74 29 0a 23 65 6e 64 69 66 0a 2f 2a 20 0a  ort).#endif./* .
6d20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6d30: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
6d40: 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20  he extension is 
6d50: 6c 6f 61 64 65 64 2e 20 20 54 68 65 20 6e 65 77  loaded.  The new
6d60: 0a 2a 2a 20 43 53 56 20 76 69 72 74 75 61 6c 20  .** CSV virtual 
6d70: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 69 73 20  table module is 
6d80: 72 65 67 69 73 74 65 72 65 64 20 77 69 74 68 20  registered with 
6d90: 74 68 65 20 63 61 6c 6c 69 6e 67 20 64 61 74 61  the calling data
6da0: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
6db0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
6dc0: 65 33 5f 63 73 76 5f 69 6e 69 74 28 0a 20 20 73  e3_csv_init(.  s
6dd0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
6de0: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20  har **pzErrMsg, 
6df0: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
6e00: 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70  _api_routines *p
6e10: 41 70 69 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  Api.){.#ifndef S
6e20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6e30: 41 4c 54 41 42 4c 45 09 0a 20 20 69 6e 74 20 72  ALTABLE..  int r
6e40: 63 3b 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45  c;.  SQLITE_EXTE
6e50: 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69  NSION_INIT2(pApi
6e60: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6e70: 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28  3_create_module(
6e80: 64 62 2c 20 22 63 73 76 22 2c 20 26 43 73 76 4d  db, "csv", &CsvM
6e90: 6f 64 75 6c 65 2c 20 30 29 3b 0a 23 69 66 64 65  odule, 0);.#ifde
6ea0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
6eb0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6ec0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
6ed0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64  lite3_create_mod
6ee0: 75 6c 65 28 64 62 2c 20 22 63 73 76 5f 77 72 22  ule(db, "csv_wr"
6ef0: 2c 20 26 43 73 76 4d 6f 64 75 6c 65 46 61 75 78  , &CsvModuleFaux
6f00: 57 72 69 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 23  Write, 0);.  }.#
6f10: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
6f20: 63 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  c;.#else.  retur
6f30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
6f40: 64 69 66 0a 7d 0a                                dif.}.