SQLite
Hex Artifact Content
Not logged in

Artifact 1a009b93650732e22334edc92459c4630b9fa703397cbb3c8ca279921a36ca11:


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 42 75 74 20 74 68 65 0a 2a 2a 20 61 70 70    But the.** app
02a0: 6c 69 63 61 74 69 6f 6e 20 63 61 6e 20 64 65 66  lication can def
02b0: 69 6e 65 20 69 74 73 20 6f 77 6e 20 43 52 45 41  ine its own CREA
02c0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
02d0: 6e 74 20 61 73 20 61 6e 20 61 64 64 69 74 69 6f  nt as an additio
02e0: 6e 61 6c 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  nal.** parameter
02f0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
0300: 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  **.**    CREATE 
0310: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65  VIRTUAL TABLE te
0320: 6d 70 2e 63 73 76 32 20 55 53 49 4e 47 20 63 73  mp.csv2 USING cs
0330: 76 28 0a 2a 2a 20 20 20 20 20 20 20 66 69 6c 65  v(.**       file
0340: 6e 61 6d 65 20 3d 20 22 2e 2e 2f 68 74 74 70 2e  name = "../http.
0350: 6c 6f 67 22 2c 0a 2a 2a 20 20 20 20 20 20 20 73  log",.**       s
0360: 63 68 65 6d 61 20 3d 20 22 43 52 45 41 54 45 20  chema = "CREATE 
0370: 54 41 42 4c 45 20 78 28 64 61 74 65 2c 69 70 61  TABLE x(date,ipa
0380: 64 64 72 2c 75 72 6c 2c 72 65 66 65 72 72 65 72  ddr,url,referrer
0390: 2c 75 73 65 72 41 67 65 6e 74 29 22 0a 2a 2a 20  ,userAgent)".** 
03a0: 20 20 20 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 73 74     );.**.** Inst
03b0: 65 61 64 20 6f 66 20 73 70 65 63 69 66 79 69 6e  ead of specifyin
03c0: 67 20 61 20 66 69 6c 65 2c 20 74 68 65 20 74 65  g a file, the te
03d0: 78 74 20 6f 66 20 74 68 65 20 43 53 56 20 63 61  xt of the CSV ca
03e0: 6e 20 62 65 20 6c 6f 61 64 65 64 20 75 73 69 6e  n be loaded usin
03f0: 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 3d 20 70  g.** the data= p
0400: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
0410: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 3d 4e  If the columns=N
0420: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 75   parameter is su
0430: 70 70 6c 69 65 64 2c 20 74 68 65 6e 20 74 68 65  pplied, then the
0440: 20 43 53 56 20 66 69 6c 65 20 69 73 20 61 73 73   CSV file is ass
0450: 75 6d 65 64 20 74 6f 20 68 61 76 65 0a 2a 2a 20  umed to have.** 
0460: 4e 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74  N columns.  If t
0470: 68 65 20 63 6f 6c 75 6d 6e 73 20 70 61 72 61 6d  he columns param
0480: 65 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 2c  eter is omitted,
0490: 20 74 68 65 20 43 53 56 20 66 69 6c 65 20 69 73   the CSV file is
04a0: 20 6f 70 65 6e 65 64 0a 2a 2a 20 61 73 20 73 6f   opened.** as so
04b0: 6f 6e 20 61 73 20 74 68 65 20 76 69 72 74 75 61  on as the virtua
04c0: 6c 20 74 61 62 6c 65 20 69 73 20 63 6f 6e 73 74  l table is const
04d0: 72 75 63 74 65 64 20 61 6e 64 20 74 68 65 20 66  ructed and the f
04e0: 69 72 73 74 20 72 6f 77 20 6f 66 20 74 68 65 20  irst row of the 
04f0: 43 53 56 0a 2a 2a 20 69 73 20 72 65 61 64 20 69  CSV.** is read i
0500: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 75 6e 74  n order to count
0510: 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a   the tables..**.
0520: 2a 2a 20 53 6f 6d 65 20 65 78 74 72 61 20 64 65  ** Some extra de
0530: 62 75 67 67 69 6e 67 20 66 65 61 74 75 72 65 73  bugging features
0540: 20 28 75 73 65 64 20 66 6f 72 20 74 65 73 74 69   (used for testi
0550: 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ng virtual table
0560: 73 29 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  s) are available
0570: 0a 2a 2a 20 69 66 20 74 68 69 73 20 6d 6f 64 75  .** if this modu
0580: 6c 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  le is compiled w
0590: 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ith -DSQLITE_TES
05a0: 54 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  T..*/.#include <
05b0: 73 71 6c 69 74 65 33 65 78 74 2e 68 3e 0a 53 51  sqlite3ext.h>.SQ
05c0: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
05d0: 4e 49 54 31 0a 23 69 6e 63 6c 75 64 65 20 3c 73  NIT1.#include <s
05e0: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
05f0: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e  e <stdlib.h>.#in
0600: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
0610: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72  .#include <stdar
0620: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0630: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0640: 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69 66 6e   <stdio.h>..#ifn
0650: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0660: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a  VIRTUALTABLE../*
0670: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 74 6f 20 68  .** A macro to h
0680: 69 6e 74 20 74 6f 20 74 68 65 20 63 6f 6d 70 69  int to the compi
0690: 6c 65 72 20 74 68 61 74 20 61 20 66 75 6e 63 74  ler that a funct
06a0: 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ion should not b
06b0: 65 0a 2a 2a 20 69 6e 6c 69 6e 65 64 2e 0a 2a 2f  e.** inlined..*/
06c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47  .#if defined(__G
06d0: 4e 55 43 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65  NUC__).#  define
06e0: 20 43 53 56 5f 4e 4f 49 4e 4c 49 4e 45 20 20 5f   CSV_NOINLINE  _
06f0: 5f 61 74 74 72 69 62 75 74 65 5f 5f 28 28 6e 6f  _attribute__((no
0700: 69 6e 6c 69 6e 65 29 29 0a 23 65 6c 69 66 20 64  inline)).#elif d
0710: 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
0720: 20 26 26 20 5f 4d 53 43 5f 56 45 52 3e 3d 31 33   && _MSC_VER>=13
0730: 31 30 0a 23 20 20 64 65 66 69 6e 65 20 43 53 56  10.#  define CSV
0740: 5f 4e 4f 49 4e 4c 49 4e 45 20 20 5f 5f 64 65 63  _NOINLINE  __dec
0750: 6c 73 70 65 63 28 6e 6f 69 6e 6c 69 6e 65 29 0a  lspec(noinline).
0760: 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
0770: 43 53 56 5f 4e 4f 49 4e 4c 49 4e 45 0a 23 65 6e  CSV_NOINLINE.#en
0780: 64 69 66 0a 0a 0a 2f 2a 20 4d 61 78 20 73 69 7a  dif.../* Max siz
0790: 65 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d  e of the error m
07a0: 65 73 73 61 67 65 20 69 6e 20 61 20 43 73 76 52  essage in a CsvR
07b0: 65 61 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65  eader */.#define
07c0: 20 43 53 56 5f 4d 58 45 52 52 20 32 30 30 0a 0a   CSV_MXERR 200..
07d0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 43  /* Size of the C
07e0: 73 76 52 65 61 64 65 72 20 69 6e 70 75 74 20 62  svReader input b
07f0: 75 66 66 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65  uffer */.#define
0800: 20 43 53 56 5f 49 4e 42 55 46 53 5a 20 31 30 32   CSV_INBUFSZ 102
0810: 34 0a 0a 2f 2a 20 41 20 63 6f 6e 74 65 78 74 20  4../* A context 
0820: 6f 62 6a 65 63 74 20 75 73 65 64 20 77 68 65 6e  object used when
0830: 20 72 65 61 64 20 61 20 43 53 56 20 66 69 6c 65   read a CSV file
0840: 2e 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  . */.typedef str
0850: 75 63 74 20 43 73 76 52 65 61 64 65 72 20 43 73  uct CsvReader Cs
0860: 76 52 65 61 64 65 72 3b 0a 73 74 72 75 63 74 20  vReader;.struct 
0870: 43 73 76 52 65 61 64 65 72 20 7b 0a 20 20 46 49  CsvReader {.  FI
0880: 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20  LE *in;         
0890: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65       /* Read the
08a0: 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20 74   CSV text from t
08b0: 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61 6d  his input stream
08c0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
08e0: 41 63 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74  Accumulated text
08f0: 20 66 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a   for a field */.
0900: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
0910: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
0920: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
0930: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
0940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0950: 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  Space allocated 
0960: 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74  for z[] */.  int
0970: 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20   nLine;         
0980: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
0990: 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
09a0: 69 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20 20  int bNotFirst;  
09b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
09c0: 66 20 70 72 69 6f 72 20 74 65 78 74 20 68 61 73  f prior text has
09d0: 20 62 65 65 6e 20 73 65 65 6e 20 2a 2f 0a 20 20   been seen */.  
09e0: 69 6e 74 20 63 54 65 72 6d 3b 20 20 20 20 20 20  int cTerm;      
09f0: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61 63         /* Charac
0a00: 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ter that termina
0a10: 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65 63  ted the most rec
0a20: 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73  ent field */.  s
0a30: 69 7a 65 5f 74 20 69 49 6e 3b 20 20 20 20 20 20  ize_t iIn;      
0a40: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
0a50: 72 65 61 64 20 63 68 61 72 61 63 74 65 72 20 69  read character i
0a60: 6e 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  n the input buff
0a70: 65 72 20 2a 2f 0a 20 20 73 69 7a 65 5f 74 20 6e  er */.  size_t n
0a80: 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  In;            /
0a90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
0aa0: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 69 6e  acters in the in
0ab0: 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  put buffer */.  
0ac0: 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20  char *zIn;      
0ad0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
0ae0: 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  put buffer */.  
0af0: 63 68 61 72 20 7a 45 72 72 5b 43 53 56 5f 4d 58  char zErr[CSV_MX
0b00: 45 52 52 5d 3b 20 20 2f 2a 20 45 72 72 6f 72 20  ERR];  /* Error 
0b10: 6d 65 73 73 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f  message */.};../
0b20: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 43  * Initialize a C
0b30: 73 76 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20  svReader object 
0b40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
0b50: 73 76 5f 72 65 61 64 65 72 5f 69 6e 69 74 28 43  sv_reader_init(C
0b60: 73 76 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20  svReader *p){.  
0b70: 70 2d 3e 69 6e 20 3d 20 30 3b 0a 20 20 70 2d 3e  p->in = 0;.  p->
0b80: 7a 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 20 3d 20  z = 0;.  p->n = 
0b90: 30 3b 0a 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d  0;.  p->nAlloc =
0ba0: 20 30 3b 0a 20 20 70 2d 3e 6e 4c 69 6e 65 20 3d   0;.  p->nLine =
0bb0: 20 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46 69 72   0;.  p->bNotFir
0bc0: 73 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e  st = 0;.  p->nIn
0bd0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 7a 49 6e 20 3d   = 0;.  p->zIn =
0be0: 20 30 3b 0a 20 20 70 2d 3e 7a 45 72 72 5b 30 5d   0;.  p->zErr[0]
0bf0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73   = 0;.}../* Clos
0c00: 65 20 61 6e 64 20 72 65 73 65 74 20 61 20 43 73  e and reset a Cs
0c10: 76 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 2a  vReader object *
0c20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 73  /.static void cs
0c30: 76 5f 72 65 61 64 65 72 5f 72 65 73 65 74 28 43  v_reader_reset(C
0c40: 73 76 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20  svReader *p){.  
0c50: 69 66 28 20 70 2d 3e 69 6e 20 29 7b 0a 20 20 20  if( p->in ){.   
0c60: 20 66 63 6c 6f 73 65 28 70 2d 3e 69 6e 29 3b 0a   fclose(p->in);.
0c70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
0c80: 28 70 2d 3e 7a 49 6e 29 3b 0a 20 20 7d 0a 20 20  (p->zIn);.  }.  
0c90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
0ca0: 7a 29 3b 0a 20 20 63 73 76 5f 72 65 61 64 65 72  z);.  csv_reader
0cb0: 5f 69 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20  _init(p);.}../* 
0cc0: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
0cd0: 6f 6e 20 61 20 43 73 76 52 65 61 64 65 72 20 2a  on a CsvReader *
0ce0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 73  /.static void cs
0cf0: 76 5f 65 72 72 6d 73 67 28 43 73 76 52 65 61 64  v_errmsg(CsvRead
0d00: 65 72 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  er *p, const cha
0d10: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
0d20: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
0d30: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
0d40: 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74  Format);.  sqlit
0d50: 65 33 5f 76 73 6e 70 72 69 6e 74 66 28 43 53 56  e3_vsnprintf(CSV
0d60: 5f 4d 58 45 52 52 2c 20 70 2d 3e 7a 45 72 72 2c  _MXERR, p->zErr,
0d70: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
0d80: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a   va_end(ap);.}..
0d90: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65  /* Open the file
0da0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
0db0: 20 61 20 43 73 76 52 65 61 64 65 72 0a 2a 2a 20   a CsvReader.** 
0dc0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
0dd0: 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  r of errors..*/.
0de0: 73 74 61 74 69 63 20 69 6e 74 20 63 73 76 5f 72  static int csv_r
0df0: 65 61 64 65 72 5f 6f 70 65 6e 28 0a 20 20 43 73  eader_open(.  Cs
0e00: 76 52 65 61 64 65 72 20 2a 70 2c 20 20 20 20 20  vReader *p,     
0e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0e20: 20 72 65 61 64 65 72 20 74 6f 20 6f 70 65 6e 20   reader to open 
0e30: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0e40: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  *zFilename,     
0e50: 20 2f 2a 20 52 65 61 64 20 66 72 6f 6d 20 74 68   /* Read from th
0e60: 69 73 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  is filename */. 
0e70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
0e80: 74 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta           /* 
0e90: 20 2e 2e 2e 20 6f 72 20 75 73 65 20 74 68 69 73   ... or use this
0ea0: 20 64 61 74 61 20 2a 2f 0a 29 7b 0a 20 20 69 66   data */.){.  if
0eb0: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20  ( zFilename ){. 
0ec0: 20 20 20 70 2d 3e 7a 49 6e 20 3d 20 73 71 6c 69     p->zIn = sqli
0ed0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 43 53 56 5f  te3_malloc( CSV_
0ee0: 49 4e 42 55 46 53 5a 20 29 3b 0a 20 20 20 20 69  INBUFSZ );.    i
0ef0: 66 28 20 70 2d 3e 7a 49 6e 3d 3d 30 20 29 7b 0a  f( p->zIn==0 ){.
0f00: 20 20 20 20 20 20 63 73 76 5f 65 72 72 6d 73 67        csv_errmsg
0f10: 28 70 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  (p, "out of memo
0f20: 72 79 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ry");.      retu
0f30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
0f40: 70 2d 3e 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46  p->in = fopen(zF
0f50: 69 6c 65 6e 61 6d 65 2c 20 22 72 62 22 29 3b 0a  ilename, "rb");.
0f60: 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 3d 3d 30      if( p->in==0
0f70: 20 29 7b 0a 20 20 20 20 20 20 63 73 76 5f 72 65   ){.      csv_re
0f80: 61 64 65 72 5f 72 65 73 65 74 28 70 29 3b 0a 20  ader_reset(p);. 
0f90: 20 20 20 20 20 63 73 76 5f 65 72 72 6d 73 67 28       csv_errmsg(
0fa0: 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  p, "cannot open 
0fb0: 27 25 73 27 20 66 6f 72 20 72 65 61 64 69 6e 67  '%s' for reading
0fc0: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
0fd0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
0fe0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
0ff0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 3d    assert( p->in=
1000: 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 7a 49 6e  =0 );.    p->zIn
1010: 20 3d 20 28 63 68 61 72 2a 29 7a 44 61 74 61 3b   = (char*)zData;
1020: 0a 20 20 20 20 70 2d 3e 6e 49 6e 20 3d 20 73 74  .    p->nIn = st
1030: 72 6c 65 6e 28 7a 44 61 74 61 29 3b 0a 20 20 7d  rlen(zData);.  }
1040: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1050: 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 62 75 66  /* The input buf
1060: 66 65 72 20 68 61 73 20 6f 76 65 72 66 6c 6f 77  fer has overflow
1070: 65 64 2e 20 20 52 65 66 69 6c 6c 20 74 68 65 20  ed.  Refill the 
1080: 69 6e 70 75 74 20 62 75 66 66 65 72 2c 20 74 68  input buffer, th
1090: 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  en.** return the
10a0: 20 6e 65 78 74 20 63 68 61 72 61 63 74 65 72 0a   next character.
10b0: 2a 2f 0a 73 74 61 74 69 63 20 43 53 56 5f 4e 4f  */.static CSV_NO
10c0: 49 4e 4c 49 4e 45 20 69 6e 74 20 63 73 76 5f 67  INLINE int csv_g
10d0: 65 74 63 5f 72 65 66 69 6c 6c 28 43 73 76 52 65  etc_refill(CsvRe
10e0: 61 64 65 72 20 2a 70 29 7b 0a 20 20 73 69 7a 65  ader *p){.  size
10f0: 5f 74 20 67 6f 74 3b 0a 0a 20 20 61 73 73 65 72  _t got;..  asser
1100: 74 28 20 70 2d 3e 69 49 6e 3e 3d 70 2d 3e 6e 49  t( p->iIn>=p->nI
1110: 6e 20 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 61  n );  /* Only ca
1120: 6c 6c 65 64 20 6f 6e 20 61 6e 20 65 6d 70 74 79  lled on an empty
1130: 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 2a 2f   input buffer */
1140: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1150: 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 2f 2a  !=0 );        /*
1160: 20 4f 6e 6c 79 20 63 61 6c 6c 65 64 20 69 66 20   Only called if 
1170: 72 65 61 64 69 6e 67 20 66 72 6f 6d 61 20 66 69  reading froma fi
1180: 6c 65 20 2a 2f 0a 0a 20 20 67 6f 74 20 3d 20 66  le */..  got = f
1190: 72 65 61 64 28 70 2d 3e 7a 49 6e 2c 20 31 2c 20  read(p->zIn, 1, 
11a0: 43 53 56 5f 49 4e 42 55 46 53 5a 2c 20 70 2d 3e  CSV_INBUFSZ, p->
11b0: 69 6e 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d  in);.  if( got==
11c0: 30 20 29 20 72 65 74 75 72 6e 20 45 4f 46 3b 0a  0 ) return EOF;.
11d0: 20 20 70 2d 3e 6e 49 6e 20 3d 20 67 6f 74 3b 0a    p->nIn = got;.
11e0: 20 20 70 2d 3e 69 49 6e 20 3d 20 31 3b 0a 20 20    p->iIn = 1;.  
11f0: 72 65 74 75 72 6e 20 70 2d 3e 7a 49 6e 5b 30 5d  return p->zIn[0]
1200: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
1210: 68 65 20 6e 65 78 74 20 63 68 61 72 61 63 74 65  he next characte
1220: 72 20 6f 66 20 69 6e 70 75 74 2e 20 20 52 65 74  r of input.  Ret
1230: 75 72 6e 20 45 4f 46 20 61 74 20 65 6e 64 20 6f  urn EOF at end o
1240: 66 20 69 6e 70 75 74 2e 20 2a 2f 0a 73 74 61 74  f input. */.stat
1250: 69 63 20 69 6e 74 20 63 73 76 5f 67 65 74 63 28  ic int csv_getc(
1260: 43 73 76 52 65 61 64 65 72 20 2a 70 29 7b 0a 20  CsvReader *p){. 
1270: 20 69 66 28 20 70 2d 3e 69 49 6e 20 3e 3d 20 70   if( p->iIn >= p
1280: 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28  ->nIn ){.    if(
1290: 20 70 2d 3e 69 6e 21 3d 30 20 29 20 72 65 74 75   p->in!=0 ) retu
12a0: 72 6e 20 63 73 76 5f 67 65 74 63 5f 72 65 66 69  rn csv_getc_refi
12b0: 6c 6c 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ll(p);.    retur
12c0: 6e 20 45 4f 46 3b 0a 20 20 7d 0a 20 20 72 65 74  n EOF;.  }.  ret
12d0: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 63  urn ((unsigned c
12e0: 68 61 72 2a 29 70 2d 3e 7a 49 6e 29 5b 70 2d 3e  har*)p->zIn)[p->
12f0: 69 49 6e 2b 2b 5d 3b 0a 7d 0a 0a 2f 2a 20 49 6e  iIn++];.}../* In
1300: 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20  crease the size 
1310: 6f 66 20 70 2d 3e 7a 20 61 6e 64 20 61 70 70 65  of p->z and appe
1320: 6e 64 20 63 68 61 72 61 63 74 65 72 20 63 20 74  nd character c t
1330: 6f 20 74 68 65 20 65 6e 64 2e 20 0a 2a 2a 20 52  o the end. .** R
1340: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
1350: 73 73 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  ss and non-zero 
1360: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
1370: 4f 4d 20 65 72 72 6f 72 20 2a 2f 0a 73 74 61 74  OM error */.stat
1380: 69 63 20 43 53 56 5f 4e 4f 49 4e 4c 49 4e 45 20  ic CSV_NOINLINE 
1390: 69 6e 74 20 63 73 76 5f 72 65 73 69 7a 65 5f 61  int csv_resize_a
13a0: 6e 64 5f 61 70 70 65 6e 64 28 43 73 76 52 65 61  nd_append(CsvRea
13b0: 64 65 72 20 2a 70 2c 20 63 68 61 72 20 63 29 7b  der *p, char c){
13c0: 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20  .  char *zNew;. 
13d0: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 2d 3e 6e   int nNew = p->n
13e0: 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 30 3b 0a 20  Alloc*2 + 100;. 
13f0: 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   zNew = sqlite3_
1400: 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20  realloc64(p->z, 
1410: 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 7a 4e 65  nNew);.  if( zNe
1420: 77 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 20 3d 20  w ){.    p->z = 
1430: 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c  zNew;.    p->nAl
1440: 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  loc = nNew;.    
1450: 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 63  p->z[p->n++] = c
1460: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1470: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 73 76    }else{.    csv
1480: 5f 65 72 72 6d 73 67 28 70 2c 20 22 6f 75 74 20  _errmsg(p, "out 
1490: 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
14a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
14b0: 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 73 69  ../* Append a si
14c0: 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 20 74  ngle character t
14d0: 6f 20 74 68 65 20 43 73 76 52 65 61 64 65 72 2e  o the CsvReader.
14e0: 7a 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 52 65  z[] array..** Re
14f0: 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73  turn 0 on succes
1500: 73 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  s and non-zero i
1510: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f  f there is an OO
1520: 4d 20 65 72 72 6f 72 20 2a 2f 0a 73 74 61 74 69  M error */.stati
1530: 63 20 69 6e 74 20 63 73 76 5f 61 70 70 65 6e 64  c int csv_append
1540: 28 43 73 76 52 65 61 64 65 72 20 2a 70 2c 20 63  (CsvReader *p, c
1550: 68 61 72 20 63 29 7b 0a 20 20 69 66 28 20 70 2d  har c){.  if( p-
1560: 3e 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 2d 31 20  >n>=p->nAlloc-1 
1570: 29 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65 73  ) return csv_res
1580: 69 7a 65 5f 61 6e 64 5f 61 70 70 65 6e 64 28 70  ize_and_append(p
1590: 2c 20 63 29 3b 0a 20 20 70 2d 3e 7a 5b 70 2d 3e  , c);.  p->z[p->
15a0: 6e 2b 2b 5d 20 3d 20 63 3b 0a 20 20 72 65 74 75  n++] = c;.  retu
15b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64  rn 0;.}../* Read
15c0: 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20   a single field 
15d0: 6f 66 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f  of CSV text.  Co
15e0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 72 66  mpatible with rf
15f0: 63 34 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64  c4180 and extend
1600: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f  ed.** with the o
1610: 70 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20  ption of having 
1620: 61 20 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65  a separator othe
1630: 72 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a  r than ","..**.*
1640: 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d  *   +  Input com
1650: 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a  es from p->in..*
1660: 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73  *   +  Store res
1670: 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20  ults in p->z of 
1680: 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70  length p->n.  Sp
1690: 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a  ace to hold p->z
16a0: 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66   comes.**      f
16b0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
16c0: 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20  oc64()..**   +  
16d0: 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
16e0: 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e  e line number in
16f0: 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
1700: 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
1710: 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
1720: 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
1730: 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
1740: 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
1750: 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
1760: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 22 22  .**.** Return ""
1770: 20 61 74 20 45 4f 46 2e 20 20 52 65 74 75 72 6e   at EOF.  Return
1780: 20 30 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72   0 on an OOM err
1790: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  or..*/.static ch
17a0: 61 72 20 2a 63 73 76 5f 72 65 61 64 5f 6f 6e 65  ar *csv_read_one
17b0: 5f 66 69 65 6c 64 28 43 73 76 52 65 61 64 65 72  _field(CsvReader
17c0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20   *p){.  int c;. 
17d0: 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d   p->n = 0;.  c =
17e0: 20 63 73 76 5f 67 65 74 63 28 70 29 3b 0a 20 20   csv_getc(p);.  
17f0: 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20  if( c==EOF ){.  
1800: 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46    p->cTerm = EOF
1810: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 3b  ;.    return "";
1820: 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22  .  }.  if( c=='"
1830: 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c  ' ){.    int pc,
1840: 20 70 70 63 3b 0a 20 20 20 20 69 6e 74 20 73 74   ppc;.    int st
1850: 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69  artLine = p->nLi
1860: 6e 65 3b 0a 20 20 20 20 70 63 20 3d 20 70 70 63  ne;.    pc = ppc
1870: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
1880: 20 31 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20   1 ){.      c = 
1890: 63 73 76 5f 67 65 74 63 28 70 29 3b 0a 20 20 20  csv_getc(p);.   
18a0: 20 20 20 69 66 28 20 63 3c 3d 27 22 27 20 7c 7c     if( c<='"' ||
18b0: 20 70 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20   pc=='"' ){.    
18c0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
18d0: 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20  ) p->nLine++;.  
18e0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27        if( c=='"'
18f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1900: 28 20 70 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20  ( pc=='"' ){.   
1910: 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 30 3b           pc = 0;
1920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
1930: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1940: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1950: 20 20 20 20 20 69 66 28 20 28 63 3d 3d 27 2c 27       if( (c==','
1960: 20 26 26 20 70 63 3d 3d 27 22 27 29 0a 20 20 20   && pc=='"').   
1970: 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 27 5c 6e        || (c=='\n
1980: 27 20 26 26 20 70 63 3d 3d 27 22 27 29 0a 20 20  ' && pc=='"').  
1990: 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 27 5c         || (c=='\
19a0: 6e 27 20 26 26 20 70 63 3d 3d 27 5c 72 27 20 26  n' && pc=='\r' &
19b0: 26 20 70 70 63 3d 3d 27 22 27 29 0a 20 20 20 20  & ppc=='"').    
19c0: 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20       || (c==EOF 
19d0: 26 26 20 70 63 3d 3d 27 22 27 29 0a 20 20 20 20  && pc=='"').    
19e0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
19f0: 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68   do{ p->n--; }wh
1a00: 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21  ile( p->z[p->n]!
1a10: 3d 27 22 27 20 29 3b 0a 20 20 20 20 20 20 20 20  ='"' );.        
1a20: 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 28 63 68    p->cTerm = (ch
1a30: 61 72 29 63 3b 0a 20 20 20 20 20 20 20 20 20 20  ar)c;.          
1a40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1a50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d  .        if( pc=
1a60: 3d 27 22 27 20 26 26 20 63 21 3d 27 5c 72 27 20  ='"' && c!='\r' 
1a70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 73 76  ){.          csv
1a80: 5f 65 72 72 6d 73 67 28 70 2c 20 22 6c 69 6e 65  _errmsg(p, "line
1a90: 20 25 64 3a 20 75 6e 65 73 63 61 70 65 64 20 25   %d: unescaped %
1aa0: 63 20 63 68 61 72 61 63 74 65 72 22 2c 20 70 2d  c character", p-
1ab0: 3e 6e 4c 69 6e 65 2c 20 27 22 27 29 3b 0a 20 20  >nLine, '"');.  
1ac0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ad0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ae0: 20 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20   if( c==EOF ){. 
1af0: 20 20 20 20 20 20 20 20 20 63 73 76 5f 65 72 72           csv_err
1b00: 6d 73 67 28 70 2c 20 22 6c 69 6e 65 20 25 64 3a  msg(p, "line %d:
1b10: 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 63   unterminated %c
1b20: 2d 71 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22  -quoted field\n"
1b30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b40: 20 20 20 20 20 20 20 73 74 61 72 74 4c 69 6e 65         startLine
1b50: 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20  , '"');.        
1b60: 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 28 63 68    p->cTerm = (ch
1b70: 61 72 29 63 3b 0a 20 20 20 20 20 20 20 20 20 20  ar)c;.          
1b80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1b90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ba0: 66 28 20 63 73 76 5f 61 70 70 65 6e 64 28 70 2c  f( csv_append(p,
1bb0: 20 28 63 68 61 72 29 63 29 20 29 20 72 65 74 75   (char)c) ) retu
1bc0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 70 70 63 20  rn 0;.      ppc 
1bd0: 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20 3d  = pc;.      pc =
1be0: 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   c;.    }.  }els
1bf0: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  e{.    /* If thi
1c00: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  s is the first f
1c10: 69 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73 65  ield being parse
1c20: 64 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73 20  d and it begins 
1c30: 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20  with the.    ** 
1c40: 55 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45 46  UTF-8 BOM  (0xEF
1c50: 20 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b 69   BB BF) then ski
1c60: 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20  p the BOM */.   
1c70: 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
1c80: 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69  xef && p->bNotFi
1c90: 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
1ca0: 63 73 76 5f 61 70 70 65 6e 64 28 70 2c 20 28 63  csv_append(p, (c
1cb0: 68 61 72 29 63 29 3b 0a 20 20 20 20 20 20 63 20  har)c);.      c 
1cc0: 3d 20 63 73 76 5f 67 65 74 63 28 70 29 3b 0a 20  = csv_getc(p);. 
1cd0: 20 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66       if( (c&0xff
1ce0: 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20 20 20 20  )==0xbb ){.     
1cf0: 20 20 20 63 73 76 5f 61 70 70 65 6e 64 28 70 2c     csv_append(p,
1d00: 20 28 63 68 61 72 29 63 29 3b 0a 20 20 20 20 20   (char)c);.     
1d10: 20 20 20 63 20 3d 20 63 73 76 5f 67 65 74 63 28     c = csv_getc(
1d20: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
1d30: 28 63 26 30 78 66 66 29 3d 3d 30 78 62 66 20 29  (c&0xff)==0xbf )
1d40: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62  {.          p->b
1d50: 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  NotFirst = 1;.  
1d60: 20 20 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30          p->n = 0
1d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1d80: 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f  rn csv_read_one_
1d90: 66 69 65 6c 64 28 70 29 3b 0a 20 20 20 20 20 20  field(p);.      
1da0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1db0: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 63 3e 27  }.    while( c>'
1dc0: 2c 27 20 7c 7c 20 28 63 21 3d 45 4f 46 20 26 26  ,' || (c!=EOF &&
1dd0: 20 63 21 3d 27 2c 27 20 26 26 20 63 21 3d 27 5c   c!=',' && c!='\
1de0: 6e 27 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  n') ){.      if(
1df0: 20 63 73 76 5f 61 70 70 65 6e 64 28 70 2c 20 28   csv_append(p, (
1e00: 63 68 61 72 29 63 29 20 29 20 72 65 74 75 72 6e  char)c) ) return
1e10: 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 63 73   0;.      c = cs
1e20: 76 5f 67 65 74 63 28 70 29 3b 0a 20 20 20 20 7d  v_getc(p);.    }
1e30: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27  .    if( c=='\n'
1e40: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
1e50: 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
1e60: 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70  p->n>0 && p->z[p
1e70: 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70  ->n-1]=='\r' ) p
1e80: 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ->n--;.    }.   
1e90: 20 70 2d 3e 63 54 65 72 6d 20 3d 20 28 63 68 61   p->cTerm = (cha
1ea0: 72 29 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  r)c;.  }.  if( p
1eb0: 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d  ->z ) p->z[p->n]
1ec0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46   = 0;.  p->bNotF
1ed0: 69 72 73 74 20 3d 20 31 3b 0a 20 20 72 65 74 75  irst = 1;.  retu
1ee0: 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 0a 2f 2a 20  rn p->z;.}.../* 
1ef0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1f00: 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  es to the variou
1f10: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
1f20: 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e  methods implemen
1f30: 74 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  ted.** in this f
1f40: 69 6c 65 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  ile. */.static i
1f50: 6e 74 20 63 73 76 74 61 62 43 72 65 61 74 65 28  nt csvtabCreate(
1f60: 73 71 6c 69 74 65 33 2a 2c 20 76 6f 69 64 2a 2c  sqlite3*, void*,
1f70: 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72   int, const char
1f80: 2a 63 6f 6e 73 74 2a 2c 20 0a 20 20 20 20 20 20  *const*, .      
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
1fb0: 62 2a 2a 2c 63 68 61 72 2a 2a 29 3b 0a 73 74 61  b**,char**);.sta
1fc0: 74 69 63 20 69 6e 74 20 63 73 76 74 61 62 43 6f  tic int csvtabCo
1fd0: 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20  nnect(sqlite3*, 
1fe0: 76 6f 69 64 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73  void*, int, cons
1ff0: 74 20 63 68 61 72 2a 63 6f 6e 73 74 2a 2c 20 0a  t char*const*, .
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2020: 65 33 5f 76 74 61 62 2a 2a 2c 63 68 61 72 2a 2a  e3_vtab**,char**
2030: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73  );.static int cs
2040: 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 73 71  vtabBestIndex(sq
2050: 6c 69 74 65 33 5f 76 74 61 62 2a 2c 73 71 6c 69  lite3_vtab*,sqli
2060: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2a 29  te3_index_info*)
2070: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73 76  ;.static int csv
2080: 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 73 71  tabDisconnect(sq
2090: 6c 69 74 65 33 5f 76 74 61 62 2a 29 3b 0a 73 74  lite3_vtab*);.st
20a0: 61 74 69 63 20 69 6e 74 20 63 73 76 74 61 62 4f  atic int csvtabO
20b0: 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62  pen(sqlite3_vtab
20c0: 2a 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  *, sqlite3_vtab_
20d0: 63 75 72 73 6f 72 2a 2a 29 3b 0a 73 74 61 74 69  cursor**);.stati
20e0: 63 20 69 6e 74 20 63 73 76 74 61 62 43 6c 6f 73  c int csvtabClos
20f0: 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  e(sqlite3_vtab_c
2100: 75 72 73 6f 72 2a 29 3b 0a 73 74 61 74 69 63 20  ursor*);.static 
2110: 69 6e 74 20 63 73 76 74 61 62 46 69 6c 74 65 72  int csvtabFilter
2120: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
2130: 72 73 6f 72 2a 2c 20 69 6e 74 20 69 64 78 4e 75  rsor*, int idxNu
2140: 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  m, const char *i
2150: 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
2180: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
2190: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73 76  ;.static int csv
21a0: 74 61 62 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  tabNext(sqlite3_
21b0: 76 74 61 62 5f 63 75 72 73 6f 72 2a 29 3b 0a 73  vtab_cursor*);.s
21c0: 74 61 74 69 63 20 69 6e 74 20 63 73 76 74 61 62  tatic int csvtab
21d0: 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62  Eof(sqlite3_vtab
21e0: 5f 63 75 72 73 6f 72 2a 29 3b 0a 73 74 61 74 69  _cursor*);.stati
21f0: 63 20 69 6e 74 20 63 73 76 74 61 62 43 6f 6c 75  c int csvtabColu
2200: 6d 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  mn(sqlite3_vtab_
2210: 63 75 72 73 6f 72 2a 2c 73 71 6c 69 74 65 33 5f  cursor*,sqlite3_
2220: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 29 3b 0a 73  context*,int);.s
2230: 74 61 74 69 63 20 69 6e 74 20 63 73 76 74 61 62  tatic int csvtab
2240: 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74  Rowid(sqlite3_vt
2250: 61 62 5f 63 75 72 73 6f 72 2a 2c 73 71 6c 69 74  ab_cursor*,sqlit
2260: 65 33 5f 69 6e 74 36 34 2a 29 3b 0a 0a 2f 2a 20  e3_int64*);../* 
2270: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
2280: 68 65 20 43 53 56 20 76 69 72 74 75 61 6c 20 74  he CSV virtual t
2290: 61 62 6c 65 20 2a 2f 0a 74 79 70 65 64 65 66 20  able */.typedef 
22a0: 73 74 72 75 63 74 20 43 73 76 54 61 62 6c 65 20  struct CsvTable 
22b0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
22c0: 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20   base;          
22d0: 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73      /* Base clas
22e0: 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72 73  s.  Must be firs
22f0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
2300: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
2310: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2320: 66 20 74 68 65 20 43 53 56 20 66 69 6c 65 20 2a  f the CSV file *
2330: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 3b  /.  char *zData;
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 20 20 20 20 2f 2a 20 52 61 77 20 43 53 56 20 64      /* Raw CSV d
2360: 61 74 61 20 69 6e 20 6c 69 65 75 20 6f 66 20 7a  ata in lieu of z
2370: 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 6c 6f  Filename */.  lo
2380: 6e 67 20 69 53 74 61 72 74 3b 20 20 20 20 20 20  ng iStart;      
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23a0: 20 4f 66 66 73 65 74 20 74 6f 20 73 74 61 72 74   Offset to start
23b0: 20 6f 66 20 64 61 74 61 20 69 6e 20 7a 46 69 6c   of data in zFil
23c0: 65 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ename */.  int n
23d0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
23e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23f0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2400: 69 6e 20 74 68 65 20 43 53 56 20 66 69 6c 65 20  in the CSV file 
2410: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
2420: 74 20 74 73 74 46 6c 61 67 73 3b 20 20 20 20 20  t tstFlags;     
2430: 20 20 20 20 20 2f 2a 20 42 69 74 20 76 61 6c 75       /* Bit valu
2440: 65 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  es used for test
2450: 69 6e 67 20 2a 2f 0a 7d 20 43 73 76 54 61 62 6c  ing */.} CsvTabl
2460: 65 3b 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76  e;../* Allowed v
2470: 61 6c 75 65 73 20 66 6f 72 20 74 73 74 46 6c 61  alues for tstFla
2480: 67 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 53  gs */.#define CS
2490: 56 54 45 53 54 5f 46 49 44 58 20 20 30 78 30 30  VTEST_FIDX  0x00
24a0: 30 31 20 20 20 20 20 20 2f 2a 20 50 72 65 74 65  01      /* Prete
24b0: 6e 64 20 74 68 61 74 20 63 6f 6e 73 74 72 61 69  nd that constrai
24c0: 6e 65 64 20 73 65 61 72 63 68 73 20 63 6f 73 74  ned searchs cost
24d0: 20 6c 65 73 73 2a 2f 0a 0a 2f 2a 20 41 20 63 75   less*/../* A cu
24e0: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 43 53 56  rsor for the CSV
24f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
2500: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
2510: 20 43 73 76 43 75 72 73 6f 72 20 7b 0a 20 20 73   CsvCursor {.  s
2520: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
2530: 6f 72 20 62 61 73 65 3b 20 20 20 20 20 20 20 2f  or base;       /
2540: 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20 20 4d  * Base class.  M
2550: 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a  ust be first */.
2560: 20 20 43 73 76 52 65 61 64 65 72 20 72 64 72 3b    CsvReader rdr;
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 2f 2a 20 54 68 65 20 43 73 76 52 65 61 64    /* The CsvRead
2590: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  er object */.  c
25a0: 68 61 72 20 2a 2a 61 7a 56 61 6c 3b 20 20 20 20  har **azVal;    
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25c0: 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 63  * Value of the c
25d0: 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20  urrent row */.  
25e0: 69 6e 74 20 2a 61 4c 65 6e 3b 20 20 20 20 20 20  int *aLen;      
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 65 61 63  /* Length of eac
2610: 68 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c  h entry */.  sql
2620: 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69  ite3_int64 iRowi
2630: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
2640: 54 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69  The current rowi
2650: 64 2e 20 20 4e 65 67 61 74 69 76 65 20 66 6f 72  d.  Negative for
2660: 20 45 4f 46 20 2a 2f 0a 7d 20 43 73 76 43 75 72   EOF */.} CsvCur
2670: 73 6f 72 3b 0a 0a 2f 2a 20 54 72 61 6e 73 66 65  sor;../* Transfe
2680: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  r error message 
2690: 74 65 78 74 20 66 72 6f 6d 20 61 20 72 65 61 64  text from a read
26a0: 65 72 20 69 6e 74 6f 20 61 20 43 73 76 54 61 62  er into a CsvTab
26b0: 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  le */.static voi
26c0: 64 20 63 73 76 5f 78 66 65 72 5f 65 72 72 6f 72  d csv_xfer_error
26d0: 28 43 73 76 54 61 62 6c 65 20 2a 70 54 61 62 2c  (CsvTable *pTab,
26e0: 20 43 73 76 52 65 61 64 65 72 20 2a 70 52 64 72   CsvReader *pRdr
26f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
2700: 65 28 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72  e(pTab->base.zEr
2710: 72 4d 73 67 29 3b 0a 20 20 70 54 61 62 2d 3e 62  rMsg);.  pTab->b
2720: 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71  ase.zErrMsg = sq
2730: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2740: 73 22 2c 20 70 52 64 72 2d 3e 7a 45 72 72 29 3b  s", pRdr->zErr);
2750: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  .}../*.** This m
2760: 65 74 68 6f 64 20 69 73 20 74 68 65 20 64 65 73  ethod is the des
2770: 74 72 75 63 74 6f 72 20 66 6f 20 61 20 43 73 76  tructor fo a Csv
2780: 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Table object..*/
2790: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73 76 74  .static int csvt
27a0: 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c  abDisconnect(sql
27b0: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
27c0: 29 7b 0a 20 20 43 73 76 54 61 62 6c 65 20 2a 70  ){.  CsvTable *p
27d0: 20 3d 20 28 43 73 76 54 61 62 6c 65 2a 29 70 56   = (CsvTable*)pV
27e0: 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  tab;.  sqlite3_f
27f0: 72 65 65 28 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  ree(p->zFilename
2800: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2810: 65 28 70 2d 3e 7a 44 61 74 61 29 3b 0a 20 20 73  e(p->zData);.  s
2820: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
2830: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2840: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 53 6b 69 70 20 6c  OK;.}../* Skip l
2850: 65 61 64 69 6e 67 20 77 68 69 74 65 73 70 61 63  eading whitespac
2860: 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  e.  Return a poi
2870: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  nter to the firs
2880: 74 20 6e 6f 6e 2d 77 68 69 74 65 73 70 61 63 65  t non-whitespace
2890: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 6f  .** character, o
28a0: 72 20 74 6f 20 74 68 65 20 7a 65 72 6f 20 74 65  r to the zero te
28b0: 72 6d 69 6e 61 74 6f 72 20 69 66 20 74 68 65 20  rminator if the 
28c0: 73 74 72 69 6e 67 20 68 61 73 20 6f 6e 6c 79 20  string has only 
28d0: 77 68 69 74 65 73 70 61 63 65 20 2a 2f 0a 73 74  whitespace */.st
28e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
28f0: 2a 63 73 76 5f 73 6b 69 70 5f 77 68 69 74 65 73  *csv_skip_whites
2900: 70 61 63 65 28 63 6f 6e 73 74 20 63 68 61 72 20  pace(const char 
2910: 2a 7a 29 7b 0a 20 20 77 68 69 6c 65 28 20 69 73  *z){.  while( is
2920: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
2930: 63 68 61 72 29 7a 5b 30 5d 29 20 29 20 7a 2b 2b  char)z[0]) ) z++
2940: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
2950: 0a 2f 2a 20 52 65 6d 6f 76 65 20 74 72 61 69 6c  ./* Remove trail
2960: 69 6e 67 20 77 68 69 74 65 73 70 61 63 65 20 66  ing whitespace f
2970: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 73  rom the end of s
2980: 74 72 69 6e 67 20 7a 5b 5d 20 2a 2f 0a 73 74 61  tring z[] */.sta
2990: 74 69 63 20 76 6f 69 64 20 63 73 76 5f 74 72 69  tic void csv_tri
29a0: 6d 5f 77 68 69 74 65 73 70 61 63 65 28 63 68 61  m_whitespace(cha
29b0: 72 20 2a 7a 29 7b 0a 20 20 73 69 7a 65 5f 74 20  r *z){.  size_t 
29c0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  n = strlen(z);. 
29d0: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 69   while( n>0 && i
29e0: 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64  sspace((unsigned
29f0: 20 63 68 61 72 29 7a 5b 6e 5d 29 20 29 20 6e 2d   char)z[n]) ) n-
2a00: 2d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d  -;.  z[n] = 0;.}
2a10: 0a 0a 2f 2a 20 44 65 71 75 6f 74 65 20 74 68 65  ../* Dequote the
2a20: 20 73 74 72 69 6e 67 20 2a 2f 0a 73 74 61 74 69   string */.stati
2a30: 63 20 76 6f 69 64 20 63 73 76 5f 64 65 71 75 6f  c void csv_dequo
2a40: 74 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  te(char *z){.  i
2a50: 6e 74 20 6a 3b 0a 20 20 63 68 61 72 20 63 51 75  nt j;.  char cQu
2a60: 6f 74 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20 73 69  ote = z[0];.  si
2a70: 7a 65 5f 74 20 69 2c 20 6e 3b 0a 0a 20 20 69 66  ze_t i, n;..  if
2a80: 28 20 63 51 75 6f 74 65 21 3d 27 5c 27 27 20 26  ( cQuote!='\'' &
2a90: 26 20 63 51 75 6f 74 65 21 3d 27 22 27 20 29 20  & cQuote!='"' ) 
2aa0: 72 65 74 75 72 6e 3b 0a 20 20 6e 20 3d 20 73 74  return;.  n = st
2ab0: 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66 28 20 6e  rlen(z);.  if( n
2ac0: 3c 32 20 7c 7c 20 7a 5b 6e 2d 31 5d 21 3d 7a 5b  <2 || z[n-1]!=z[
2ad0: 30 5d 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  0] ) return;.  f
2ae0: 6f 72 28 69 3d 31 2c 20 6a 3d 30 3b 20 69 3c 6e  or(i=1, j=0; i<n
2af0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  -1; i++){.    if
2b00: 28 20 7a 5b 69 5d 3d 3d 63 51 75 6f 74 65 20 26  ( z[i]==cQuote &
2b10: 26 20 7a 5b 69 2b 31 5d 3d 3d 63 51 75 6f 74 65  & z[i+1]==cQuote
2b20: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7a 5b 6a 2b   ) i++;.    z[j+
2b30: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
2b40: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a   z[j] = 0;.}../*
2b50: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2b60: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6f   the string is o
2b70: 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 22 54 41  f the form:  "TA
2b80: 47 20 3d 20 56 41 4c 55 45 22 20 77 69 74 68 20  G = VALUE" with 
2b90: 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 77 68 69 74  optional.** whit
2ba0: 65 73 70 61 63 65 20 62 65 66 6f 72 65 20 61 6e  espace before an
2bb0: 64 20 61 72 6f 75 6e 64 20 74 6f 6b 65 6e 73 2e  d around tokens.
2bc0: 20 20 49 66 20 69 74 20 69 73 2c 20 72 65 74 75    If it is, retu
2bd0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2be0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 68 61  the.** first cha
2bf0: 72 61 63 74 65 72 20 6f 66 20 56 41 4c 55 45 2e  racter of VALUE.
2c00: 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
2c10: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
2c20: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2c30: 72 20 2a 63 73 76 5f 70 61 72 61 6d 65 74 65 72  r *csv_parameter
2c40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61  (const char *zTa
2c50: 67 2c 20 69 6e 74 20 6e 54 61 67 2c 20 63 6f 6e  g, int nTag, con
2c60: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 7a  st char *z){.  z
2c70: 20 3d 20 63 73 76 5f 73 6b 69 70 5f 77 68 69 74   = csv_skip_whit
2c80: 65 73 70 61 63 65 28 7a 29 3b 0a 20 20 69 66 28  espace(z);.  if(
2c90: 20 73 74 72 6e 63 6d 70 28 7a 54 61 67 2c 20 7a   strncmp(zTag, z
2ca0: 2c 20 6e 54 61 67 29 21 3d 30 20 29 20 72 65 74  , nTag)!=0 ) ret
2cb0: 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 63 73 76  urn 0;.  z = csv
2cc0: 5f 73 6b 69 70 5f 77 68 69 74 65 73 70 61 63 65  _skip_whitespace
2cd0: 28 7a 2b 6e 54 61 67 29 3b 0a 20 20 69 66 28 20  (z+nTag);.  if( 
2ce0: 7a 5b 30 5d 21 3d 27 3d 27 20 29 20 72 65 74 75  z[0]!='=' ) retu
2cf0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 63  rn 0;.  return c
2d00: 73 76 5f 73 6b 69 70 5f 77 68 69 74 65 73 70 61  sv_skip_whitespa
2d10: 63 65 28 7a 2b 31 29 3b 0a 7d 0a 0a 2f 2a 20 44  ce(z+1);.}../* D
2d20: 65 63 6f 64 65 20 61 20 70 61 72 61 6d 65 74 65  ecode a paramete
2d30: 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  r that requires 
2d40: 61 20 64 65 71 75 6f 74 65 64 20 73 74 72 69 6e  a dequoted strin
2d50: 67 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  g..**.** Return 
2d60: 31 20 69 66 20 74 68 65 20 70 61 72 61 6d 65 74  1 if the paramet
2d70: 65 72 20 69 73 20 73 65 65 6e 2c 20 6f 72 20 30  er is seen, or 0
2d80: 20 69 66 20 6e 6f 74 2e 20 20 31 20 69 73 20 72   if not.  1 is r
2d90: 65 74 75 72 6e 65 64 0a 2a 2a 20 65 76 65 6e 20  eturned.** even 
2da0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  if there is an e
2db0: 72 72 6f 72 2e 20 20 49 66 20 61 6e 20 65 72 72  rror.  If an err
2dc0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
2dd0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2de0: 0a 2a 2a 20 69 73 20 6c 65 66 74 20 69 6e 20 70  .** is left in p
2df0: 2d 3e 7a 45 72 72 2e 20 20 49 66 20 74 68 65 72  ->zErr.  If ther
2e00: 65 20 61 72 65 20 6e 6f 20 65 72 72 6f 72 73 2c  e are no errors,
2e10: 20 70 2d 3e 7a 45 72 72 5b 30 5d 3d 3d 30 2e 0a   p->zErr[0]==0..
2e20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73  */.static int cs
2e30: 76 5f 73 74 72 69 6e 67 5f 70 61 72 61 6d 65 74  v_string_paramet
2e40: 65 72 28 0a 20 20 43 73 76 52 65 61 64 65 72 20  er(.  CsvReader 
2e50: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
2e60: 2a 20 4c 65 61 76 65 20 74 68 65 20 65 72 72 6f  * Leave the erro
2e70: 72 20 6d 65 73 73 61 67 65 20 68 65 72 65 2c 20  r message here, 
2e80: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  if there is one 
2e90: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2ea0: 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 2f 2a  *zParam,      /*
2eb0: 20 50 61 72 61 6d 65 74 65 72 20 77 65 20 61 72   Parameter we ar
2ec0: 65 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 2a  e checking for *
2ed0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2ee0: 7a 41 72 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  zArg,        /* 
2ef0: 52 61 77 20 74 65 78 74 20 6f 66 20 74 68 65 20  Raw text of the 
2f00: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 72  virtual table ar
2f10: 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20  gment */.  char 
2f20: 2a 2a 70 7a 56 61 6c 20 20 20 20 20 20 20 20 20  **pzVal         
2f30: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2f40: 20 64 65 71 75 6f 74 65 64 20 73 74 72 69 6e 67   dequoted string
2f50: 20 76 61 6c 75 65 20 68 65 72 65 20 2a 2f 0a 29   value here */.)
2f60: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2f70: 7a 56 61 6c 75 65 3b 0a 20 20 7a 56 61 6c 75 65  zValue;.  zValue
2f80: 20 3d 20 63 73 76 5f 70 61 72 61 6d 65 74 65 72   = csv_parameter
2f90: 28 7a 50 61 72 61 6d 2c 28 69 6e 74 29 73 74 72  (zParam,(int)str
2fa0: 6c 65 6e 28 7a 50 61 72 61 6d 29 2c 7a 41 72 67  len(zParam),zArg
2fb0: 29 3b 0a 20 20 69 66 28 20 7a 56 61 6c 75 65 3d  );.  if( zValue=
2fc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2fd0: 20 70 2d 3e 7a 45 72 72 5b 30 5d 20 3d 20 30 3b   p->zErr[0] = 0;
2fe0: 0a 20 20 69 66 28 20 2a 70 7a 56 61 6c 20 29 7b  .  if( *pzVal ){
2ff0: 0a 20 20 20 20 63 73 76 5f 65 72 72 6d 73 67 28  .    csv_errmsg(
3000: 70 2c 20 22 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  p, "more than on
3010: 65 20 27 25 73 27 20 70 61 72 61 6d 65 74 65 72  e '%s' parameter
3020: 22 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20  ", zParam);.    
3030: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
3040: 2a 70 7a 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  *pzVal = sqlite3
3050: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
3060: 56 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 2a 70  Value);.  if( *p
3070: 7a 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 63  zVal==0 ){.    c
3080: 73 76 5f 65 72 72 6d 73 67 28 70 2c 20 22 6f 75  sv_errmsg(p, "ou
3090: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
30a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
30b0: 0a 20 20 63 73 76 5f 74 72 69 6d 5f 77 68 69 74  .  csv_trim_whit
30c0: 65 73 70 61 63 65 28 2a 70 7a 56 61 6c 29 3b 0a  espace(*pzVal);.
30d0: 20 20 63 73 76 5f 64 65 71 75 6f 74 65 28 2a 70    csv_dequote(*p
30e0: 7a 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  zVal);.  return 
30f0: 31 3b 0a 7d 0a 0a 0a 2f 2a 20 52 65 74 75 72 6e  1;.}.../* Return
3100: 20 30 20 69 66 20 74 68 65 20 61 72 67 75 6d 65   0 if the argume
3110: 6e 74 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20  nt is false and 
3120: 31 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e  1 if it is true.
3130: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a    Return -1 if.*
3140: 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 61 6c  * we cannot real
3150: 6c 79 20 74 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  ly tell..*/.stat
3160: 69 63 20 69 6e 74 20 63 73 76 5f 62 6f 6f 6c 65  ic int csv_boole
3170: 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  an(const char *z
3180: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
3190: 5f 73 74 72 69 63 6d 70 28 22 79 65 73 22 2c 7a  _stricmp("yes",z
31a0: 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69 74  )==0.   || sqlit
31b0: 65 33 5f 73 74 72 69 63 6d 70 28 22 6f 6e 22 2c  e3_stricmp("on",
31c0: 7a 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69  z)==0.   || sqli
31d0: 74 65 33 5f 73 74 72 69 63 6d 70 28 22 74 72 75  te3_stricmp("tru
31e0: 65 22 2c 7a 29 3d 3d 30 0a 20 20 20 7c 7c 20 28  e",z)==0.   || (
31f0: 7a 5b 30 5d 3d 3d 27 31 27 20 26 26 20 7a 5b 31  z[0]=='1' && z[1
3200: 5d 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72  ]==0).  ){.    r
3210: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
3220: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
3230: 6d 70 28 22 6e 6f 22 2c 7a 29 3d 3d 30 0a 20 20  mp("no",z)==0.  
3240: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69   || sqlite3_stri
3250: 63 6d 70 28 22 6f 66 66 22 2c 7a 29 3d 3d 30 0a  cmp("off",z)==0.
3260: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74     || sqlite3_st
3270: 72 69 63 6d 70 28 22 66 61 6c 73 65 22 2c 7a 29  ricmp("false",z)
3280: 3d 3d 30 0a 20 20 20 7c 7c 20 28 7a 5b 30 5d 3d  ==0.   || (z[0]=
3290: 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d 30 29  ='0' && z[1]==0)
32a0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
32b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
32c0: 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50   -1;.}.../*.** P
32d0: 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 20 20 20  arameters:.**   
32e0: 20 66 69 6c 65 6e 61 6d 65 3d 46 49 4c 45 4e 41   filename=FILENA
32f0: 4d 45 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  ME          Name
3300: 20 6f 66 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e   of file contain
3310: 69 6e 67 20 43 53 56 20 63 6f 6e 74 65 6e 74 0a  ing CSV content.
3320: 2a 2a 20 20 20 20 64 61 74 61 3d 54 45 58 54 20  **    data=TEXT 
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 20 44 69 72 65 63 74 20 43 53 56 20 63 6f 6e 74   Direct CSV cont
3350: 65 6e 74 2e 0a 2a 2a 20 20 20 20 73 63 68 65 6d  ent..**    schem
3360: 61 3d 53 43 48 45 4d 41 20 20 20 20 20 20 20 20  a=SCHEMA        
3370: 20 20 20 20 20 20 41 6c 74 65 72 6e 61 74 69 76        Alternativ
3380: 65 20 43 53 56 20 73 63 68 65 6d 61 2e 0a 2a 2a  e CSV schema..**
3390: 20 20 20 20 68 65 61 64 65 72 3d 59 45 53 7c 4e      header=YES|N
33a0: 4f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46  O              F
33b0: 69 72 73 74 20 72 6f 77 20 6f 66 20 43 53 56 20  irst row of CSV 
33c0: 64 65 66 69 6e 65 73 20 74 68 65 20 6e 61 6d 65  defines the name
33d0: 73 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  s of.**         
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 69 66        columns if
3400: 20 22 79 65 73 22 2e 20 20 44 65 66 61 75 6c 74   "yes".  Default
3410: 20 22 6e 6f 22 2e 0a 2a 2a 20 20 20 20 63 6f 6c   "no"..**    col
3420: 75 6d 6e 73 3d 4e 20 20 20 20 20 20 20 20 20 20  umns=N          
3430: 20 20 20 20 20 20 20 20 41 73 73 75 6d 65 20 74          Assume t
3440: 68 65 20 43 53 56 20 66 69 6c 65 20 63 6f 6e 74  he CSV file cont
3450: 61 69 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 2e 0a  ains N columns..
3460: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 61 76 61 69 6c  **.** Only avail
3470: 61 62 6c 65 20 69 66 20 63 6f 6d 70 69 6c 65 64  able if compiled
3480: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
3490: 54 3a 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20  T:.**    .**    
34a0: 74 65 73 74 66 6c 61 67 73 3d 4e 20 20 20 20 20  testflags=N     
34b0: 20 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61             Bitma
34c0: 73 6b 20 6f 66 20 74 65 73 74 20 66 6c 61 67 73  sk of test flags
34d0: 2e 20 20 4f 70 74 69 6f 6e 61 6c 0a 2a 2a 0a 2a  .  Optional.**.*
34e0: 2a 20 49 66 20 73 63 68 65 6d 61 3d 20 69 73 20  * If schema= is 
34f0: 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  omitted, then th
3500: 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 61  e columns are na
3510: 6d 65 64 20 22 63 30 22 2c 20 22 63 31 22 2c 20  med "c0", "c1", 
3520: 22 63 32 22 2c 0a 2a 2a 20 61 6e 64 20 73 6f 20  "c2",.** and so 
3530: 66 6f 72 74 68 2e 20 20 49 66 20 63 6f 6c 75 6d  forth.  If colum
3540: 6e 73 3d 4e 20 69 73 20 6f 6d 69 74 74 65 64 2c  ns=N is omitted,
3550: 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 69   then the file i
3560: 73 20 6f 70 65 6e 65 64 20 61 6e 64 0a 2a 2a 20  s opened and.** 
3570: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
3580: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 66 69 72  lumns in the fir
3590: 73 74 20 72 6f 77 20 69 73 20 63 6f 75 6e 74 65  st row is counte
35a0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
35b0: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 6f 75  he.** column cou
35c0: 6e 74 2e 20 20 49 66 20 68 65 61 64 65 72 3d 59  nt.  If header=Y
35d0: 45 53 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ES, then the fir
35e0: 73 74 20 72 6f 77 20 69 73 20 73 6b 69 70 70 65  st row is skippe
35f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
3600: 20 63 73 76 74 61 62 43 6f 6e 6e 65 63 74 28 0a   csvtabConnect(.
3610: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
3620: 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69   void *pAux,.  i
3630: 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
3640: 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c  har *const*argv,
3650: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
3660: 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72  **ppVtab,.  char
3670: 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 43 73   **pzErr.){.  Cs
3680: 76 54 61 62 6c 65 20 2a 70 4e 65 77 20 3d 20 30  vTable *pNew = 0
3690: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
36a0: 43 73 76 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  CsvTable object 
36b0: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 2a 2f 0a  to construct */.
36c0: 20 20 69 6e 74 20 62 48 65 61 64 65 72 20 3d 20    int bHeader = 
36d0: 2d 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  -1;          /* 
36e0: 68 65 61 64 65 72 3d 20 66 6c 61 67 73 2e 20 20  header= flags.  
36f0: 2d 31 20 6d 65 61 6e 73 20 6e 6f 74 20 73 65 65  -1 means not see
3700: 6e 20 79 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72  n yet */.  int r
3710: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
3720: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
3730: 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 72  code from this r
3740: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
3750: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
3760: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
3770: 6f 75 6e 74 65 72 73 20 2a 2f 0a 23 69 66 64 65  ounters */.#ifde
3780: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
3790: 69 6e 74 20 74 73 74 46 6c 61 67 73 20 3d 20 30  int tstFlags = 0
37a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ;          /* Va
37b0: 6c 75 65 20 66 6f 72 20 74 65 73 74 66 6c 61 67  lue for testflag
37c0: 73 3d 4e 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  s=N parameter */
37d0: 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 43  .#endif.  int nC
37e0: 6f 6c 20 3d 20 2d 39 39 3b 20 20 20 20 20 20 20  ol = -99;       
37f0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
3800: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 3d 20 70 61   the columns= pa
3810: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 43 73 76  rameter */.  Csv
3820: 52 65 61 64 65 72 20 73 52 64 72 3b 20 20 20 20  Reader sRdr;    
3830: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 43 53 56          /* A CSV
3840: 20 66 69 6c 65 20 72 65 61 64 65 72 20 75 73 65   file reader use
3850: 64 20 74 6f 20 73 74 6f 72 65 20 61 6e 20 65 72  d to store an er
3860: 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ror.            
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 2a 2a 20 6d 65 73 73 61 67 65 20 61 6e 64 2f   ** message and/
3890: 6f 72 20 74 6f 20 63 6f 75 6e 74 20 74 68 65 20  or to count the 
38a0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
38b0: 73 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  s */.  static co
38c0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 50 61 72 61  nst char *azPara
38d0: 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 22 66 69  m[] = {.     "fi
38e0: 6c 65 6e 61 6d 65 22 2c 20 22 64 61 74 61 22 2c  lename", "data",
38f0: 20 22 73 63 68 65 6d 61 22 2c 20 0a 20 20 7d 3b   "schema", .  };
3900: 0a 20 20 63 68 61 72 20 2a 61 7a 50 56 61 6c 75  .  char *azPValu
3910: 65 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  e[3];         /*
3920: 20 50 61 72 61 6d 65 74 65 72 20 76 61 6c 75 65   Parameter value
3930: 73 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 53  s */.# define CS
3940: 56 5f 46 49 4c 45 4e 41 4d 45 20 28 61 7a 50 56  V_FILENAME (azPV
3950: 61 6c 75 65 5b 30 5d 29 0a 23 20 64 65 66 69 6e  alue[0]).# defin
3960: 65 20 43 53 56 5f 44 41 54 41 20 20 20 20 20 28  e CSV_DATA     (
3970: 61 7a 50 56 61 6c 75 65 5b 31 5d 29 0a 23 20 64  azPValue[1]).# d
3980: 65 66 69 6e 65 20 43 53 56 5f 53 43 48 45 4d 41  efine CSV_SCHEMA
3990: 20 20 20 28 61 7a 50 56 61 6c 75 65 5b 32 5d 29     (azPValue[2])
39a0: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  ...  assert( siz
39b0: 65 6f 66 28 61 7a 50 56 61 6c 75 65 29 3d 3d 73  eof(azPValue)==s
39c0: 69 7a 65 6f 66 28 61 7a 50 61 72 61 6d 29 20 29  izeof(azParam) )
39d0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 52 64 72  ;.  memset(&sRdr
39e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 52 64 72  , 0, sizeof(sRdr
39f0: 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 61 7a 50  ));.  memset(azP
3a00: 56 61 6c 75 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Value, 0, sizeof
3a10: 28 61 7a 50 56 61 6c 75 65 29 29 3b 0a 20 20 66  (azPValue));.  f
3a20: 6f 72 28 69 3d 33 3b 20 69 3c 61 72 67 63 3b 20  or(i=3; i<argc; 
3a30: 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
3a40: 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69  char *z = argv[i
3a50: 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ];.    const cha
3a60: 72 20 2a 7a 56 61 6c 75 65 3b 0a 20 20 20 20 66  r *zValue;.    f
3a70: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66  or(j=0; j<sizeof
3a80: 28 61 7a 50 61 72 61 6d 29 2f 73 69 7a 65 6f 66  (azParam)/sizeof
3a90: 28 61 7a 50 61 72 61 6d 5b 30 5d 29 3b 20 6a 2b  (azParam[0]); j+
3aa0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 73  +){.      if( cs
3ab0: 76 5f 73 74 72 69 6e 67 5f 70 61 72 61 6d 65 74  v_string_paramet
3ac0: 65 72 28 26 73 52 64 72 2c 20 61 7a 50 61 72 61  er(&sRdr, azPara
3ad0: 6d 5b 6a 5d 2c 20 7a 2c 20 26 61 7a 50 56 61 6c  m[j], z, &azPVal
3ae0: 75 65 5b 6a 5d 29 20 29 20 62 72 65 61 6b 3b 0a  ue[j]) ) break;.
3af0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
3b00: 73 69 7a 65 6f 66 28 61 7a 50 61 72 61 6d 29 2f  sizeof(azParam)/
3b10: 73 69 7a 65 6f 66 28 61 7a 50 61 72 61 6d 5b 30  sizeof(azParam[0
3b20: 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ]) ){.      if( 
3b30: 73 52 64 72 2e 7a 45 72 72 5b 30 5d 20 29 20 67  sRdr.zErr[0] ) g
3b40: 6f 74 6f 20 63 73 76 74 61 62 5f 63 6f 6e 6e 65  oto csvtab_conne
3b50: 63 74 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65  ct_error;.    }e
3b60: 6c 73 65 0a 20 20 20 20 69 66 28 20 28 7a 56 61  lse.    if( (zVa
3b70: 6c 75 65 20 3d 20 63 73 76 5f 70 61 72 61 6d 65  lue = csv_parame
3b80: 74 65 72 28 22 68 65 61 64 65 72 22 2c 36 2c 7a  ter("header",6,z
3b90: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ))!=0 ){.      i
3ba0: 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20  nt x;.      if( 
3bb0: 62 48 65 61 64 65 72 3e 3d 30 20 29 7b 0a 20 20  bHeader>=0 ){.  
3bc0: 20 20 20 20 20 20 63 73 76 5f 65 72 72 6d 73 67        csv_errmsg
3bd0: 28 26 73 52 64 72 2c 20 22 6d 6f 72 65 20 74 68  (&sRdr, "more th
3be0: 61 6e 20 6f 6e 65 20 27 68 65 61 64 65 72 27 20  an one 'header' 
3bf0: 70 61 72 61 6d 65 74 65 72 22 29 3b 0a 20 20 20  parameter");.   
3c00: 20 20 20 20 20 67 6f 74 6f 20 63 73 76 74 61 62       goto csvtab
3c10: 5f 63 6f 6e 6e 65 63 74 5f 65 72 72 6f 72 3b 0a  _connect_error;.
3c20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78 20        }.      x 
3c30: 3d 20 63 73 76 5f 62 6f 6f 6c 65 61 6e 28 7a 56  = csv_boolean(zV
3c40: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28  alue);.      if(
3c50: 20 78 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   x==1 ){.       
3c60: 20 62 48 65 61 64 65 72 20 3d 20 31 3b 0a 20 20   bHeader = 1;.  
3c70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3d      }else if( x=
3c80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 48  =0 ){.        bH
3c90: 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  eader = 0;.     
3ca0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3cb0: 63 73 76 5f 65 72 72 6d 73 67 28 26 73 52 64 72  csv_errmsg(&sRdr
3cc0: 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  , "unrecognized 
3cd0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 27 68 65 61  argument to 'hea
3ce0: 64 65 72 27 3a 20 25 73 22 2c 20 7a 56 61 6c 75  der': %s", zValu
3cf0: 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
3d00: 20 63 73 76 74 61 62 5f 63 6f 6e 6e 65 63 74 5f   csvtab_connect_
3d10: 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  error;.      }. 
3d20: 20 20 20 7d 65 6c 73 65 0a 23 69 66 64 65 66 20     }else.#ifdef 
3d30: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
3d40: 69 66 28 20 28 7a 56 61 6c 75 65 20 3d 20 63 73  if( (zValue = cs
3d50: 76 5f 70 61 72 61 6d 65 74 65 72 28 22 74 65 73  v_parameter("tes
3d60: 74 66 6c 61 67 73 22 2c 39 2c 7a 29 29 21 3d 30  tflags",9,z))!=0
3d70: 20 29 7b 0a 20 20 20 20 20 20 74 73 74 46 6c 61   ){.      tstFla
3d80: 67 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69  gs = (unsigned i
3d90: 6e 74 29 61 74 6f 69 28 7a 56 61 6c 75 65 29 3b  nt)atoi(zValue);
3da0: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
3db0: 66 0a 20 20 20 20 69 66 28 20 28 7a 56 61 6c 75  f.    if( (zValu
3dc0: 65 20 3d 20 63 73 76 5f 70 61 72 61 6d 65 74 65  e = csv_paramete
3dd0: 72 28 22 63 6f 6c 75 6d 6e 73 22 2c 37 2c 7a 29  r("columns",7,z)
3de0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
3df0: 28 20 6e 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ( nCol>0 ){.    
3e00: 20 20 20 20 63 73 76 5f 65 72 72 6d 73 67 28 26      csv_errmsg(&
3e10: 73 52 64 72 2c 20 22 6d 6f 72 65 20 74 68 61 6e  sRdr, "more than
3e20: 20 6f 6e 65 20 27 63 6f 6c 75 6d 6e 73 27 20 70   one 'columns' p
3e30: 61 72 61 6d 65 74 65 72 22 29 3b 0a 20 20 20 20  arameter");.    
3e40: 20 20 20 20 67 6f 74 6f 20 63 73 76 74 61 62 5f      goto csvtab_
3e50: 63 6f 6e 6e 65 63 74 5f 65 72 72 6f 72 3b 0a 20  connect_error;. 
3e60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 6f       }.      nCo
3e70: 6c 20 3d 20 61 74 6f 69 28 7a 56 61 6c 75 65 29  l = atoi(zValue)
3e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6f 6c  ;.      if( nCol
3e90: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  <=0 ){.        c
3ea0: 73 76 5f 65 72 72 6d 73 67 28 26 73 52 64 72 2c  sv_errmsg(&sRdr,
3eb0: 20 22 6d 75 73 74 20 68 61 76 65 20 61 74 20 6c   "must have at l
3ec0: 65 61 73 74 20 6f 6e 65 20 63 6f 6c 75 6d 6e 22  east one column"
3ed0: 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
3ee0: 63 73 76 74 61 62 5f 63 6f 6e 6e 65 63 74 5f 65  csvtab_connect_e
3ef0: 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rror;.      }.  
3f00: 20 20 7d 65 6c 73 65 0a 20 20 20 20 7b 0a 20 20    }else.    {.  
3f10: 20 20 20 20 63 73 76 5f 65 72 72 6d 73 67 28 26      csv_errmsg(&
3f20: 73 52 64 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69  sRdr, "unrecogni
3f30: 7a 65 64 20 70 61 72 61 6d 65 74 65 72 20 27 25  zed parameter '%
3f40: 73 27 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 67  s'", z);.      g
3f50: 6f 74 6f 20 63 73 76 74 61 62 5f 63 6f 6e 6e 65  oto csvtab_conne
3f60: 63 74 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ct_error;.    }.
3f70: 20 20 7d 0a 20 20 69 66 28 20 28 43 53 56 5f 46    }.  if( (CSV_F
3f80: 49 4c 45 4e 41 4d 45 3d 3d 30 29 3d 3d 28 43 53  ILENAME==0)==(CS
3f90: 56 5f 44 41 54 41 3d 3d 30 29 20 29 7b 0a 20 20  V_DATA==0) ){.  
3fa0: 20 20 63 73 76 5f 65 72 72 6d 73 67 28 26 73 52    csv_errmsg(&sR
3fb0: 64 72 2c 20 22 6d 75 73 74 20 65 69 74 68 65 72  dr, "must either
3fc0: 20 66 69 6c 65 6e 61 6d 65 3d 20 6f 72 20 64 61   filename= or da
3fd0: 74 61 3d 20 62 75 74 20 6e 6f 74 20 62 6f 74 68  ta= but not both
3fe0: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63 73 76  ");.    goto csv
3ff0: 74 61 62 5f 63 6f 6e 6e 65 63 74 5f 65 72 72 6f  tab_connect_erro
4000: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 6f  r;.  }.  if( nCo
4010: 6c 3c 3d 30 20 26 26 20 63 73 76 5f 72 65 61 64  l<=0 && csv_read
4020: 65 72 5f 6f 70 65 6e 28 26 73 52 64 72 2c 20 43  er_open(&sRdr, C
4030: 53 56 5f 46 49 4c 45 4e 41 4d 45 2c 20 43 53 56  SV_FILENAME, CSV
4040: 5f 44 41 54 41 29 20 29 7b 0a 20 20 20 20 67 6f  _DATA) ){.    go
4050: 74 6f 20 63 73 76 74 61 62 5f 63 6f 6e 6e 65 63  to csvtab_connec
4060: 74 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  t_error;.  }.  p
4070: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  New = sqlite3_ma
4080: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
4090: 65 77 29 20 29 3b 0a 20 20 2a 70 70 56 74 61 62  ew) );.  *ppVtab
40a0: 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62   = (sqlite3_vtab
40b0: 2a 29 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 4e  *)pNew;.  if( pN
40c0: 65 77 3d 3d 30 20 29 20 67 6f 74 6f 20 63 73 76  ew==0 ) goto csv
40d0: 74 61 62 5f 63 6f 6e 6e 65 63 74 5f 6f 6f 6d 3b  tab_connect_oom;
40e0: 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
40f0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  0, sizeof(*pNew)
4100: 29 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20  );.  if( nCol>0 
4110: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 6f  ){.    pNew->nCo
4120: 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 7d 65 6c 73  l = nCol;.  }els
4130: 65 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  e{.    do{.     
4140: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
4150: 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69   csv_read_one_fi
4160: 65 6c 64 28 26 73 52 64 72 29 3b 0a 20 20 20 20  eld(&sRdr);.    
4170: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 67 6f 74    if( z==0 ) got
4180: 6f 20 63 73 76 74 61 62 5f 63 6f 6e 6e 65 63 74  o csvtab_connect
4190: 5f 6f 6f 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  _oom;.      pNew
41a0: 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d 77  ->nCol++;.    }w
41b0: 68 69 6c 65 28 20 73 52 64 72 2e 63 54 65 72 6d  hile( sRdr.cTerm
41c0: 3d 3d 27 2c 27 20 29 3b 0a 20 20 7d 0a 20 20 70  ==',' );.  }.  p
41d0: 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  New->zFilename =
41e0: 20 43 53 56 5f 46 49 4c 45 4e 41 4d 45 3b 20 20   CSV_FILENAME;  
41f0: 43 53 56 5f 46 49 4c 45 4e 41 4d 45 20 3d 20 30  CSV_FILENAME = 0
4200: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 44 61 74 61 20  ;.  pNew->zData 
4210: 3d 20 43 53 56 5f 44 41 54 41 3b 20 20 20 20 20  = CSV_DATA;     
4220: 20 20 20 20 20 43 53 56 5f 44 41 54 41 20 3d 20       CSV_DATA = 
4230: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
4240: 5f 54 45 53 54 0a 20 20 70 4e 65 77 2d 3e 74 73  _TEST.  pNew->ts
4250: 74 46 6c 61 67 73 20 3d 20 74 73 74 46 6c 61 67  tFlags = tstFlag
4260: 73 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e 65 77  s;.#endif.  pNew
4270: 2d 3e 69 53 74 61 72 74 20 3d 20 62 48 65 61 64  ->iStart = bHead
4280: 65 72 3d 3d 31 20 3f 20 66 74 65 6c 6c 28 73 52  er==1 ? ftell(sR
4290: 64 72 2e 69 6e 29 20 3a 20 30 3b 0a 20 20 63 73  dr.in) : 0;.  cs
42a0: 76 5f 72 65 61 64 65 72 5f 72 65 73 65 74 28 26  v_reader_reset(&
42b0: 73 52 64 72 29 3b 0a 20 20 69 66 28 20 43 53 56  sRdr);.  if( CSV
42c0: 5f 53 43 48 45 4d 41 3d 3d 30 20 29 7b 0a 20 20  _SCHEMA==0 ){.  
42d0: 20 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22    char *zSep = "
42e0: 22 3b 0a 20 20 20 20 43 53 56 5f 53 43 48 45 4d  ";.    CSV_SCHEM
42f0: 41 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  A = sqlite3_mpri
4300: 6e 74 66 28 22 43 52 45 41 54 45 20 54 41 42 4c  ntf("CREATE TABL
4310: 45 20 78 28 22 29 3b 0a 20 20 20 20 69 66 28 20  E x(");.    if( 
4320: 43 53 56 5f 53 43 48 45 4d 41 3d 3d 30 20 29 20  CSV_SCHEMA==0 ) 
4330: 67 6f 74 6f 20 63 73 76 74 61 62 5f 63 6f 6e 6e  goto csvtab_conn
4340: 65 63 74 5f 6f 6f 6d 3b 0a 20 20 20 20 66 6f 72  ect_oom;.    for
4350: 28 69 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e 43  (i=0; i<pNew->nC
4360: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
4370: 43 53 56 5f 53 43 48 45 4d 41 20 3d 20 73 71 6c  CSV_SCHEMA = sql
4380: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
4390: 25 73 63 25 64 20 54 45 58 54 22 2c 43 53 56 5f  %sc%d TEXT",CSV_
43a0: 53 43 48 45 4d 41 2c 20 7a 53 65 70 2c 20 69 29  SCHEMA, zSep, i)
43b0: 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22  ;.      zSep = "
43c0: 2c 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 53  ,";.    }.    CS
43d0: 56 5f 53 43 48 45 4d 41 20 3d 20 73 71 6c 69 74  V_SCHEMA = sqlit
43e0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 29 3b  e3_mprintf("%z);
43f0: 22 2c 20 43 53 56 5f 53 43 48 45 4d 41 29 3b 0a  ", CSV_SCHEMA);.
4400: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
4410: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
4420: 64 62 2c 20 43 53 56 5f 53 43 48 45 4d 41 29 3b  db, CSV_SCHEMA);
4430: 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
4440: 20 63 73 76 74 61 62 5f 63 6f 6e 6e 65 63 74 5f   csvtab_connect_
4450: 65 72 72 6f 72 3b 0a 20 20 66 6f 72 28 69 3d 30  error;.  for(i=0
4460: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 50 56 61  ; i<sizeof(azPVa
4470: 6c 75 65 29 2f 73 69 7a 65 6f 66 28 61 7a 50 56  lue)/sizeof(azPV
4480: 61 6c 75 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  alue[0]); i++){.
4490: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
44a0: 28 61 7a 50 56 61 6c 75 65 5b 69 5d 29 3b 0a 20  (azPValue[i]);. 
44b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
44c0: 54 45 5f 4f 4b 3b 0a 0a 63 73 76 74 61 62 5f 63  TE_OK;..csvtab_c
44d0: 6f 6e 6e 65 63 74 5f 6f 6f 6d 3a 0a 20 20 72 63  onnect_oom:.  rc
44e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
44f0: 0a 20 20 63 73 76 5f 65 72 72 6d 73 67 28 26 73  .  csv_errmsg(&s
4500: 52 64 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  Rdr, "out of mem
4510: 6f 72 79 22 29 3b 0a 0a 63 73 76 74 61 62 5f 63  ory");..csvtab_c
4520: 6f 6e 6e 65 63 74 5f 65 72 72 6f 72 3a 0a 20 20  onnect_error:.  
4530: 69 66 28 20 70 4e 65 77 20 29 20 63 73 76 74 61  if( pNew ) csvta
4540: 62 44 69 73 63 6f 6e 6e 65 63 74 28 26 70 4e 65  bDisconnect(&pNe
4550: 77 2d 3e 62 61 73 65 29 3b 0a 20 20 66 6f 72 28  w->base);.  for(
4560: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
4570: 50 56 61 6c 75 65 29 2f 73 69 7a 65 6f 66 28 61  PValue)/sizeof(a
4580: 7a 50 56 61 6c 75 65 5b 30 5d 29 3b 20 69 2b 2b  zPValue[0]); i++
4590: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
45a0: 72 65 65 28 61 7a 50 56 61 6c 75 65 5b 69 5d 29  ree(azPValue[i])
45b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 52 64 72  ;.  }.  if( sRdr
45c0: 2e 7a 45 72 72 5b 30 5d 20 29 7b 0a 20 20 20 20  .zErr[0] ){.    
45d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 7a  sqlite3_free(*pz
45e0: 45 72 72 29 3b 0a 20 20 20 20 2a 70 7a 45 72 72  Err);.    *pzErr
45f0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
4600: 74 66 28 22 25 73 22 2c 20 73 52 64 72 2e 7a 45  tf("%s", sRdr.zE
4610: 72 72 29 3b 0a 20 20 7d 0a 20 20 63 73 76 5f 72  rr);.  }.  csv_r
4620: 65 61 64 65 72 5f 72 65 73 65 74 28 26 73 52 64  eader_reset(&sRd
4630: 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
4640: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53  LITE_OK ) rc = S
4650: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72  QLITE_ERROR;.  r
4660: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4670: 2a 2a 20 52 65 73 65 74 20 74 68 65 20 63 75 72  ** Reset the cur
4680: 72 65 6e 74 20 72 6f 77 20 63 6f 6e 74 65 6e 74  rent row content
4690: 20 68 65 6c 64 20 62 79 20 61 20 43 73 76 43 75   held by a CsvCu
46a0: 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsor..*/.static 
46b0: 76 6f 69 64 20 63 73 76 74 61 62 43 75 72 73 6f  void csvtabCurso
46c0: 72 52 6f 77 52 65 73 65 74 28 43 73 76 43 75 72  rRowReset(CsvCur
46d0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 43 73  sor *pCur){.  Cs
46e0: 76 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28  vTable *pTab = (
46f0: 43 73 76 54 61 62 6c 65 2a 29 70 43 75 72 2d 3e  CsvTable*)pCur->
4700: 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69 6e  base.pVtab;.  in
4710: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
4720: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
4730: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
4740: 66 72 65 65 28 70 43 75 72 2d 3e 61 7a 56 61 6c  free(pCur->azVal
4750: 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  [i]);.    pCur->
4760: 61 7a 56 61 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20  azVal[i] = 0;.  
4770: 20 20 70 43 75 72 2d 3e 61 4c 65 6e 5b 69 5d 20    pCur->aLen[i] 
4780: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
4790: 2a 20 54 68 65 20 78 43 6f 6e 6e 65 63 74 20 61  * The xConnect a
47a0: 6e 64 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f  nd xCreate metho
47b0: 64 73 20 64 6f 20 74 68 65 20 73 61 6d 65 20 74  ds do the same t
47c0: 68 69 6e 67 2c 20 62 75 74 20 74 68 65 79 20 6d  hing, but they m
47d0: 75 73 74 20 62 65 0a 2a 2a 20 64 69 66 66 65 72  ust be.** differ
47e0: 65 6e 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ent so that the 
47f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73  virtual table is
4800: 20 6e 6f 74 20 61 6e 20 65 70 6f 6e 79 6d 6f 75   not an eponymou
4810: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  s virtual table.
4820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
4830: 73 76 74 61 62 43 72 65 61 74 65 28 0a 20 20 73  svtabCreate(.  s
4840: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
4850: 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20  id *pAux,.  int 
4860: 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
4870: 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20   *const*argv,.  
4880: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
4890: 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a  pVtab,.  char **
48a0: 70 7a 45 72 72 0a 29 7b 0a 20 72 65 74 75 72 6e  pzErr.){. return
48b0: 20 63 73 76 74 61 62 43 6f 6e 6e 65 63 74 28 64   csvtabConnect(d
48c0: 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20 61  b, pAux, argc, a
48d0: 72 67 76 2c 20 70 70 56 74 61 62 2c 20 70 7a 45  rgv, ppVtab, pzE
48e0: 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  rr);.}../*.** De
48f0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20 43  structor for a C
4900: 73 76 43 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61  svCursor..*/.sta
4910: 74 69 63 20 69 6e 74 20 63 73 76 74 61 62 43 6c  tic int csvtabCl
4920: 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ose(sqlite3_vtab
4930: 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20  _cursor *cur){. 
4940: 20 43 73 76 43 75 72 73 6f 72 20 2a 70 43 75 72   CsvCursor *pCur
4950: 20 3d 20 28 43 73 76 43 75 72 73 6f 72 2a 29 63   = (CsvCursor*)c
4960: 75 72 3b 0a 20 20 63 73 76 74 61 62 43 75 72 73  ur;.  csvtabCurs
4970: 6f 72 52 6f 77 52 65 73 65 74 28 70 43 75 72 29  orRowReset(pCur)
4980: 3b 0a 20 20 63 73 76 5f 72 65 61 64 65 72 5f 72  ;.  csv_reader_r
4990: 65 73 65 74 28 26 70 43 75 72 2d 3e 72 64 72 29  eset(&pCur->rdr)
49a0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
49b0: 28 63 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  (cur);.  return 
49c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
49d0: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 6f 72 20  .** Constructor 
49e0: 66 6f 72 20 61 20 6e 65 77 20 43 73 76 54 61 62  for a new CsvTab
49f0: 6c 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74  le cursor object
4a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4a10: 63 73 76 74 61 62 4f 70 65 6e 28 73 71 6c 69 74  csvtabOpen(sqlit
4a20: 65 33 5f 76 74 61 62 20 2a 70 2c 20 73 71 6c 69  e3_vtab *p, sqli
4a30: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
4a40: 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 43  **ppCursor){.  C
4a50: 73 76 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20  svTable *pTab = 
4a60: 28 43 73 76 54 61 62 6c 65 2a 29 70 3b 0a 20 20  (CsvTable*)p;.  
4a70: 43 73 76 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  CsvCursor *pCur;
4a80: 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79 74 65 3b  .  size_t nByte;
4a90: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
4aa0: 66 28 2a 70 43 75 72 29 20 2b 20 28 73 69 7a 65  f(*pCur) + (size
4ab0: 6f 66 28 63 68 61 72 2a 29 2b 73 69 7a 65 6f 66  of(char*)+sizeof
4ac0: 28 69 6e 74 29 29 2a 70 54 61 62 2d 3e 6e 43 6f  (int))*pTab->nCo
4ad0: 6c 3b 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69  l;.  pCur = sqli
4ae0: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42  te3_malloc64( nB
4af0: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 43 75  yte );.  if( pCu
4b00: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
4b10: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
4b20: 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20 6e 42  mset(pCur, 0, nB
4b30: 79 74 65 29 3b 0a 20 20 70 43 75 72 2d 3e 61 7a  yte);.  pCur->az
4b40: 56 61 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70  Val = (char**)&p
4b50: 43 75 72 5b 31 5d 3b 0a 20 20 70 43 75 72 2d 3e  Cur[1];.  pCur->
4b60: 61 4c 65 6e 20 3d 20 28 69 6e 74 2a 29 26 70 43  aLen = (int*)&pC
4b70: 75 72 2d 3e 61 7a 56 61 6c 5b 70 54 61 62 2d 3e  ur->azVal[pTab->
4b80: 6e 43 6f 6c 5d 3b 0a 20 20 2a 70 70 43 75 72 73  nCol];.  *ppCurs
4b90: 6f 72 20 3d 20 26 70 43 75 72 2d 3e 62 61 73 65  or = &pCur->base
4ba0: 3b 0a 20 20 69 66 28 20 63 73 76 5f 72 65 61 64  ;.  if( csv_read
4bb0: 65 72 5f 6f 70 65 6e 28 26 70 43 75 72 2d 3e 72  er_open(&pCur->r
4bc0: 64 72 2c 20 70 54 61 62 2d 3e 7a 46 69 6c 65 6e  dr, pTab->zFilen
4bd0: 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 44 61 74 61  ame, pTab->zData
4be0: 29 20 29 7b 0a 20 20 20 20 63 73 76 5f 78 66 65  ) ){.    csv_xfe
4bf0: 72 5f 65 72 72 6f 72 28 70 54 61 62 2c 20 26 70  r_error(pTab, &p
4c00: 43 75 72 2d 3e 72 64 72 29 3b 0a 20 20 20 20 72  Cur->rdr);.    r
4c10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
4c20: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
4c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
4c40: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 61 20  /*.** Advance a 
4c50: 43 73 76 43 75 72 73 6f 72 20 74 6f 20 69 74 73  CsvCursor to its
4c60: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 69 6e 70   next row of inp
4c70: 75 74 2e 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ut..** Set the E
4c80: 4f 46 20 6d 61 72 6b 65 72 20 69 66 20 77 65 20  OF marker if we 
4c90: 72 65 61 63 68 20 74 68 65 20 65 6e 64 20 6f 66  reach the end of
4ca0: 20 69 6e 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69   input..*/.stati
4cb0: 63 20 69 6e 74 20 63 73 76 74 61 62 4e 65 78 74  c int csvtabNext
4cc0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
4cd0: 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 43 73  rsor *cur){.  Cs
4ce0: 76 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  vCursor *pCur = 
4cf0: 28 43 73 76 43 75 72 73 6f 72 2a 29 63 75 72 3b  (CsvCursor*)cur;
4d00: 0a 20 20 43 73 76 54 61 62 6c 65 20 2a 70 54 61  .  CsvTable *pTa
4d10: 62 20 3d 20 28 43 73 76 54 61 62 6c 65 2a 29 63  b = (CsvTable*)c
4d20: 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  ur->pVtab;.  int
4d30: 20 69 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a   i = 0;.  char *
4d40: 7a 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 7a 20 3d  z;.  do{.    z =
4d50: 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69   csv_read_one_fi
4d60: 65 6c 64 28 26 70 43 75 72 2d 3e 72 64 72 29 3b  eld(&pCur->rdr);
4d70: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
4d80: 0a 20 20 20 20 20 20 63 73 76 5f 78 66 65 72 5f  .      csv_xfer_
4d90: 65 72 72 6f 72 28 70 54 61 62 2c 20 26 70 43 75  error(pTab, &pCu
4da0: 72 2d 3e 72 64 72 29 3b 0a 20 20 20 20 20 20 62  r->rdr);.      b
4db0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4dc0: 69 66 28 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  if( i<pTab->nCol
4dd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
4de0: 75 72 2d 3e 61 4c 65 6e 5b 69 5d 20 3c 20 70 43  ur->aLen[i] < pC
4df0: 75 72 2d 3e 72 64 72 2e 6e 2b 31 20 29 7b 0a 20  ur->rdr.n+1 ){. 
4e00: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65         char *zNe
4e10: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
4e20: 6c 6f 63 36 34 28 70 43 75 72 2d 3e 61 7a 56 61  loc64(pCur->azVa
4e30: 6c 5b 69 5d 2c 20 70 43 75 72 2d 3e 72 64 72 2e  l[i], pCur->rdr.
4e40: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  n+1);.        if
4e50: 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( zNew==0 ){.   
4e60: 20 20 20 20 20 20 20 63 73 76 5f 65 72 72 6d 73         csv_errms
4e70: 67 28 26 70 43 75 72 2d 3e 72 64 72 2c 20 22 6f  g(&pCur->rdr, "o
4e80: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
4e90: 20 20 20 20 20 20 20 20 20 20 63 73 76 5f 78 66            csv_xf
4ea0: 65 72 5f 65 72 72 6f 72 28 70 54 61 62 2c 20 26  er_error(pTab, &
4eb0: 70 43 75 72 2d 3e 72 64 72 29 3b 0a 20 20 20 20  pCur->rdr);.    
4ec0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4ed0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
4ee0: 43 75 72 2d 3e 61 7a 56 61 6c 5b 69 5d 20 3d 20  Cur->azVal[i] = 
4ef0: 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 43  zNew;.        pC
4f00: 75 72 2d 3e 61 4c 65 6e 5b 69 5d 20 3d 20 70 43  ur->aLen[i] = pC
4f10: 75 72 2d 3e 72 64 72 2e 6e 2b 31 3b 0a 20 20 20  ur->rdr.n+1;.   
4f20: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
4f30: 79 28 70 43 75 72 2d 3e 61 7a 56 61 6c 5b 69 5d  y(pCur->azVal[i]
4f40: 2c 20 7a 2c 20 70 43 75 72 2d 3e 72 64 72 2e 6e  , z, pCur->rdr.n
4f50: 2b 31 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  +1);.      i++;.
4f60: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
4f70: 70 43 75 72 2d 3e 72 64 72 2e 63 54 65 72 6d 3d  pCur->rdr.cTerm=
4f80: 3d 27 2c 27 20 29 3b 0a 20 20 69 66 28 20 7a 3d  =',' );.  if( z=
4f90: 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 72 64 72  =0 || (pCur->rdr
4fa0: 2e 63 54 65 72 6d 3d 3d 45 4f 46 20 26 26 20 69  .cTerm==EOF && i
4fb0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 7b 0a  <pTab->nCol) ){.
4fc0: 20 20 20 20 70 43 75 72 2d 3e 69 52 6f 77 69 64      pCur->iRowid
4fd0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
4fe0: 20 20 20 20 70 43 75 72 2d 3e 69 52 6f 77 69 64      pCur->iRowid
4ff0: 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  ++;.    while( i
5000: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
5010: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5020: 65 28 70 43 75 72 2d 3e 61 7a 56 61 6c 5b 69 5d  e(pCur->azVal[i]
5030: 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
5040: 7a 56 61 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  zVal[i] = 0;.   
5050: 20 20 20 70 43 75 72 2d 3e 61 4c 65 6e 5b 69 5d     pCur->aLen[i]
5060: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 2b 2b 3b   = 0;.      i++;
5070: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5080: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5090: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 76  ../*.** Return v
50a0: 61 6c 75 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  alues of columns
50b0: 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20   for the row at 
50c0: 77 68 69 63 68 20 74 68 65 20 43 73 76 43 75 72  which the CsvCur
50d0: 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  sor.** is curren
50e0: 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f  tly pointing..*/
50f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73 76 74  .static int csvt
5100: 61 62 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69  abColumn(.  sqli
5110: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
5120: 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68 65 20 63  *cur,   /* The c
5130: 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  ursor */.  sqlit
5140: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
5150: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
5160: 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
5170: 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e 2e 28 29  te3_result_...()
5180: 20 2a 2f 0a 20 20 69 6e 74 20 69 20 20 20 20 20   */.  int i     
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d    /* Which colum
51b0: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29  n to return */.)
51c0: 7b 0a 20 20 43 73 76 43 75 72 73 6f 72 20 2a 70  {.  CsvCursor *p
51d0: 43 75 72 20 3d 20 28 43 73 76 43 75 72 73 6f 72  Cur = (CsvCursor
51e0: 2a 29 63 75 72 3b 0a 20 20 43 73 76 54 61 62 6c  *)cur;.  CsvTabl
51f0: 65 20 2a 70 54 61 62 20 3d 20 28 43 73 76 54 61  e *pTab = (CsvTa
5200: 62 6c 65 2a 29 63 75 72 2d 3e 70 56 74 61 62 3b  ble*)cur->pVtab;
5210: 0a 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20 69  .  if( i>=0 && i
5220: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70  <pTab->nCol && p
5230: 43 75 72 2d 3e 61 7a 56 61 6c 5b 69 5d 21 3d 30  Cur->azVal[i]!=0
5240: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5250: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
5260: 20 70 43 75 72 2d 3e 61 7a 56 61 6c 5b 69 5d 2c   pCur->azVal[i],
5270: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
5280: 49 43 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IC);.  }.  retur
5290: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
52a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
52b0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
52c0: 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73  urrent row..*/.s
52d0: 74 61 74 69 63 20 69 6e 74 20 63 73 76 74 61 62  tatic int csvtab
52e0: 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74  Rowid(sqlite3_vt
52f0: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20  ab_cursor *cur, 
5300: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52  sqlite_int64 *pR
5310: 6f 77 69 64 29 7b 0a 20 20 43 73 76 43 75 72 73  owid){.  CsvCurs
5320: 6f 72 20 2a 70 43 75 72 20 3d 20 28 43 73 76 43  or *pCur = (CsvC
5330: 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 2a 70  ursor*)cur;.  *p
5340: 52 6f 77 69 64 20 3d 20 70 43 75 72 2d 3e 69 52  Rowid = pCur->iR
5350: 6f 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  owid;.  return S
5360: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5370: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
5380: 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  f the cursor has
5390: 20 62 65 65 6e 20 6d 6f 76 65 64 20 6f 66 66 20   been moved off 
53a0: 6f 66 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72  of the last.** r
53b0: 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 0a 2a 2f  ow of output..*/
53c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73 76 74  .static int csvt
53d0: 61 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74  abEof(sqlite3_vt
53e0: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
53f0: 0a 20 20 43 73 76 43 75 72 73 6f 72 20 2a 70 43  .  CsvCursor *pC
5400: 75 72 20 3d 20 28 43 73 76 43 75 72 73 6f 72 2a  ur = (CsvCursor*
5410: 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  )cur;.  return p
5420: 43 75 72 2d 3e 69 52 6f 77 69 64 3c 30 3b 0a 7d  Cur->iRowid<0;.}
5430: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 61 20 66  ../*.** Only a f
5440: 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69  ull table scan i
5450: 73 20 73 75 70 70 6f 72 74 65 64 2e 20 20 53 6f  s supported.  So
5460: 20 78 46 69 6c 74 65 72 20 73 69 6d 70 6c 79 20   xFilter simply 
5470: 72 65 77 69 6e 64 73 20 74 6f 0a 2a 2a 20 74 68  rewinds to.** th
5480: 65 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a  e beginning..*/.
5490: 73 74 61 74 69 63 20 69 6e 74 20 63 73 76 74 61  static int csvta
54a0: 62 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74  bFilter(.  sqlit
54b0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
54c0: 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20  pVtabCursor, .  
54d0: 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73  int idxNum, cons
54e0: 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a  t char *idxStr,.
54f0: 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69    int argc, sqli
5500: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5510: 0a 29 7b 0a 20 20 43 73 76 43 75 72 73 6f 72 20  .){.  CsvCursor 
5520: 2a 70 43 75 72 20 3d 20 28 43 73 76 43 75 72 73  *pCur = (CsvCurs
5530: 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  or*)pVtabCursor;
5540: 0a 20 20 43 73 76 54 61 62 6c 65 20 2a 70 54 61  .  CsvTable *pTa
5550: 62 20 3d 20 28 43 73 76 54 61 62 6c 65 2a 29 70  b = (CsvTable*)p
5560: 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
5570: 62 3b 0a 20 20 70 43 75 72 2d 3e 69 52 6f 77 69  b;.  pCur->iRowi
5580: 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  d = 0;.  if( pCu
5590: 72 2d 3e 72 64 72 2e 69 6e 3d 3d 30 20 29 7b 0a  r->rdr.in==0 ){.
55a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
55b0: 2d 3e 72 64 72 2e 7a 49 6e 3d 3d 70 54 61 62 2d  ->rdr.zIn==pTab-
55c0: 3e 7a 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >zData );.    as
55d0: 73 65 72 74 28 20 70 54 61 62 2d 3e 69 53 74 61  sert( pTab->iSta
55e0: 72 74 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rt>=0 );.    ass
55f0: 65 72 74 28 20 28 73 69 7a 65 5f 74 29 70 54 61  ert( (size_t)pTa
5600: 62 2d 3e 69 53 74 61 72 74 3c 3d 70 43 75 72 2d  b->iStart<=pCur-
5610: 3e 72 64 72 2e 6e 49 6e 20 29 3b 0a 20 20 20 20  >rdr.nIn );.    
5620: 70 43 75 72 2d 3e 72 64 72 2e 69 49 6e 20 3d 20  pCur->rdr.iIn = 
5630: 70 54 61 62 2d 3e 69 53 74 61 72 74 3b 0a 20 20  pTab->iStart;.  
5640: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 73 65 65 6b  }else{.    fseek
5650: 28 70 43 75 72 2d 3e 72 64 72 2e 69 6e 2c 20 70  (pCur->rdr.in, p
5660: 54 61 62 2d 3e 69 53 74 61 72 74 2c 20 53 45 45  Tab->iStart, SEE
5670: 4b 5f 53 45 54 29 3b 0a 20 20 20 20 70 43 75 72  K_SET);.    pCur
5680: 2d 3e 72 64 72 2e 69 49 6e 20 3d 20 30 3b 0a 20  ->rdr.iIn = 0;. 
5690: 20 20 20 70 43 75 72 2d 3e 72 64 72 2e 6e 49 6e     pCur->rdr.nIn
56a0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
56b0: 72 6e 20 63 73 76 74 61 62 4e 65 78 74 28 70 56  rn csvtabNext(pV
56c0: 74 61 62 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f  tabCursor);.}../
56d0: 2a 0a 2a 2a 20 4f 6e 6c 79 20 61 20 66 6f 72 77  *.** Only a forw
56e0: 61 72 64 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  ard full table s
56f0: 63 61 6e 20 69 73 20 73 75 70 70 6f 72 74 65 64  can is supported
5700: 2e 20 20 78 42 65 73 74 49 6e 64 65 78 20 69 73  .  xBestIndex is
5710: 20 6d 6f 73 74 6c 79 0a 2a 2a 20 61 20 6e 6f 2d   mostly.** a no-
5720: 6f 70 2e 20 20 49 66 20 43 53 56 54 45 53 54 5f  op.  If CSVTEST_
5730: 46 49 44 58 20 69 73 20 73 65 74 2c 20 74 68 65  FIDX is set, the
5740: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
5750: 66 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f  f equality.** co
5760: 6e 73 74 72 61 69 6e 74 73 20 6c 6f 77 65 72 73  nstraints lowers
5770: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 63   the estimated c
5780: 6f 73 74 2c 20 77 68 69 63 68 20 69 73 20 66 69  ost, which is fi
5790: 63 74 69 6f 6e 2c 20 62 75 74 20 69 73 20 75 73  ction, but is us
57a0: 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74  eful.** for test
57b0: 69 6e 67 20 63 65 72 74 61 69 6e 20 6b 69 6e 64  ing certain kind
57c0: 73 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62  s of virtual tab
57d0: 6c 65 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  le behavior..*/.
57e0: 73 74 61 74 69 63 20 69 6e 74 20 63 73 76 74 61  static int csvta
57f0: 62 42 65 73 74 49 6e 64 65 78 28 0a 20 20 73 71  bBestIndex(.  sq
5800: 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c  lite3_vtab *tab,
5810: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
5820: 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 0a  _info *pIdxInfo.
5830: 29 7b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  ){.  pIdxInfo->e
5840: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31  stimatedCost = 1
5850: 30 30 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53  000000;.#ifdef S
5860: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
5870: 20 28 28 28 43 73 76 54 61 62 6c 65 2a 29 74 61   (((CsvTable*)ta
5880: 62 29 2d 3e 74 73 74 46 6c 61 67 73 20 26 20 43  b)->tstFlags & C
5890: 53 56 54 45 53 54 5f 46 49 44 58 29 21 3d 30 20  SVTEST_FIDX)!=0 
58a0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 75 73  ){.    /* The us
58b0: 75 61 6c 20 28 61 6e 64 20 73 65 6e 73 69 62 6c  ual (and sensibl
58c0: 65 29 20 63 61 73 65 20 69 73 20 74 6f 20 61 6c  e) case is to al
58d0: 77 61 79 73 20 64 6f 20 61 20 66 75 6c 6c 20 74  ways do a full t
58e0: 61 62 6c 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a  able scan..    *
58f0: 2a 20 54 68 65 20 63 6f 64 65 20 69 6e 20 74 68  * The code in th
5900: 69 73 20 62 72 61 6e 63 68 20 6f 6e 6c 79 20 72  is branch only r
5910: 75 6e 73 20 77 68 65 6e 20 74 65 73 74 66 6c 61  uns when testfla
5920: 67 73 3d 31 2e 20 20 54 68 69 73 20 63 6f 64 65  gs=1.  This code
5930: 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  .    ** generate
5940: 73 20 61 6e 20 61 72 74 69 66 69 63 61 6c 20 61  s an artifical a
5950: 6e 64 20 75 6e 72 65 61 6c 69 73 74 69 63 20 70  nd unrealistic p
5960: 6c 61 6e 20 77 68 69 63 68 20 69 73 20 75 73 65  lan which is use
5970: 66 75 6c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  ful.    ** for t
5980: 65 73 74 69 6e 67 20 76 69 72 74 75 61 6c 20 74  esting virtual t
5990: 61 62 6c 65 20 6c 6f 67 69 63 20 62 75 74 20 69  able logic but i
59a0: 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20 74 6f  s not helpful to
59b0: 20 72 65 61 6c 20 61 70 70 6c 69 63 61 74 69 6f   real applicatio
59c0: 6e 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns..    **.    *
59d0: 2a 20 41 6e 79 20 3d 3d 2c 20 4c 49 4b 45 2c 20  * Any ==, LIKE, 
59e0: 6f 72 20 47 4c 4f 42 20 63 6f 6e 73 74 72 61 69  or GLOB constrai
59f0: 6e 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  nt is marked as 
5a00: 75 73 61 62 6c 65 20 62 79 20 74 68 65 20 76 69  usable by the vi
5a10: 72 74 75 61 6c 0a 20 20 20 20 2a 2a 20 74 61 62  rtual.    ** tab
5a20: 6c 65 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20  le (even though 
5a30: 69 74 20 69 73 20 6e 6f 74 29 20 61 6e 64 20 74  it is not) and t
5a40: 68 65 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e 69  he cost of runni
5a50: 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  ng the virtual t
5a60: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 72  able.    ** is r
5a70: 65 64 75 63 65 64 20 66 72 6f 6d 20 31 20 6d 69  educed from 1 mi
5a80: 6c 6c 69 6f 6e 20 74 6f 20 6a 75 73 74 20 31 30  llion to just 10
5a90: 2e 20 20 54 68 65 20 63 6f 6e 73 74 72 61 69 6e  .  The constrain
5aa0: 74 73 20 61 72 65 20 2a 6e 6f 74 2a 20 6d 61 72  ts are *not* mar
5ab0: 6b 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 6f 6d  ked.    ** as om
5ac0: 69 74 74 61 62 6c 65 2c 20 68 6f 77 65 76 65 72  ittable, however
5ad0: 2c 20 73 6f 20 74 68 65 20 71 75 65 72 79 20 70  , so the query p
5ae0: 6c 61 6e 6e 65 72 20 73 68 6f 75 6c 64 20 73 74  lanner should st
5af0: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 0a 20  ill generate a. 
5b00: 20 20 20 2a 2a 20 70 6c 61 6e 20 74 68 61 74 20     ** plan that 
5b10: 67 69 76 65 73 20 61 20 63 6f 72 72 65 63 74 20  gives a correct 
5b20: 61 6e 73 77 65 72 2c 20 65 76 65 6e 20 69 66 20  answer, even if 
5b30: 74 68 65 79 20 70 6c 61 6e 20 69 73 20 6e 6f 74  they plan is not
5b40: 20 6f 70 74 69 6d 61 6c 2e 0a 20 20 20 20 2a 2f   optimal..    */
5b50: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
5b60: 69 6e 74 20 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a  int nConst = 0;.
5b70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5b80: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
5b90: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
5ba0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5bb0: 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  op;.      if( pI
5bc0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
5bd0: 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 3d 3d 30  int[i].usable==0
5be0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5bf0: 20 20 20 6f 70 20 3d 20 70 49 64 78 49 6e 66 6f     op = pIdxInfo
5c00: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
5c10: 2e 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  .op;.      if( o
5c20: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p==SQLITE_INDEX_
5c30: 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 0a 20  CONSTRAINT_EQ . 
5c40: 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d 53 51 4c        || op==SQL
5c50: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
5c60: 41 49 4e 54 5f 4c 49 4b 45 0a 20 20 20 20 20 20  AINT_LIKE.      
5c70: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49   || op==SQLITE_I
5c80: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
5c90: 47 4c 4f 42 0a 20 20 20 20 20 20 29 7b 0a 20 20  GLOB.      ){.  
5ca0: 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
5cb0: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
5cc0: 31 30 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  10;.        pIdx
5cd0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
5ce0: 74 55 73 61 67 65 5b 6e 43 6f 6e 73 74 5d 2e 61  tUsage[nConst].a
5cf0: 72 67 76 49 6e 64 65 78 20 3d 20 6e 43 6f 6e 73  rgvIndex = nCons
5d00: 74 2b 31 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  t+1;.        nCo
5d10: 6e 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  nst++;.      }. 
5d20: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
5d30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5d40: 4f 4b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 73  OK;.}...static s
5d50: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 43 73  qlite3_module Cs
5d60: 76 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c  vModule = {.  0,
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
5d90: 6f 6e 20 2a 2f 0a 20 20 63 73 76 74 61 62 43 72  on */.  csvtabCr
5da0: 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  eate,           
5db0: 20 2f 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a 20   /* xCreate */. 
5dc0: 20 63 73 76 74 61 62 43 6f 6e 6e 65 63 74 2c 20   csvtabConnect, 
5dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
5de0: 6e 6e 65 63 74 20 2a 2f 0a 20 20 63 73 76 74 61  nnect */.  csvta
5df0: 62 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20  bBestIndex,     
5e00: 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65      /* xBestInde
5e10: 78 20 2a 2f 0a 20 20 63 73 76 74 61 62 44 69 73  x */.  csvtabDis
5e20: 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  connect,        
5e30: 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a  /* xDisconnect *
5e40: 2f 0a 20 20 63 73 76 74 61 62 44 69 73 63 6f 6e  /.  csvtabDiscon
5e50: 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  nect,        /* 
5e60: 78 44 65 73 74 72 6f 79 20 2a 2f 0a 20 20 63 73  xDestroy */.  cs
5e70: 76 74 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20  vtabOpen,       
5e80: 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
5e90: 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  - open a cursor 
5ea0: 2a 2f 0a 20 20 63 73 76 74 61 62 43 6c 6f 73 65  */.  csvtabClose
5eb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5ec0: 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20   xClose - close 
5ed0: 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 73  a cursor */.  cs
5ee0: 76 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20  vtabFilter,     
5ef0: 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
5f00: 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63  r - configure sc
5f10: 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  an constraints *
5f20: 2f 0a 20 20 63 73 76 74 61 62 4e 65 78 74 2c 20  /.  csvtabNext, 
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f40: 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20  xNext - advance 
5f50: 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 73  a cursor */.  cs
5f60: 76 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20  vtabEof,        
5f70: 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d         /* xEof -
5f80: 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f   check for end o
5f90: 66 20 73 63 61 6e 20 2a 2f 0a 20 20 63 73 76 74  f scan */.  csvt
5fa0: 61 62 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  abColumn,       
5fb0: 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20       /* xColumn 
5fc0: 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
5fd0: 20 63 73 76 74 61 62 52 6f 77 69 64 2c 20 20 20   csvtabRowid,   
5fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
5ff0: 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20  wid - read data 
6000: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6020: 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c   xUpdate */.  0,
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6040: 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e         /* xBegin
6050: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6070: 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20  * xSync */.  0, 
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6090: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74        /* xCommit
60a0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
60c0: 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  * xRollback */. 
60d0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
60e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
60f0: 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c  ndMethod */.  0,
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6110: 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d         /* xRenam
6120: 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20  e */.};..#ifdef 
6130: 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
6140: 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * For virtual ta
6150: 62 6c 65 20 74 65 73 74 69 6e 67 2c 20 6d 61 6b  ble testing, mak
6160: 65 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  e a version of t
6170: 68 65 20 43 53 56 20 76 69 72 74 75 61 6c 20 74  he CSV virtual t
6180: 61 62 6c 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  able.** availabl
6190: 65 20 74 68 61 74 20 68 61 73 20 61 6e 20 78 55  e that has an xU
61a0: 70 64 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 20  pdate function. 
61b0: 20 42 75 74 20 74 68 65 20 78 55 70 64 61 74 65   But the xUpdate
61c0: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 0a   always returns.
61d0: 2a 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  ** SQLITE_READON
61e0: 4c 59 20 73 69 6e 63 65 20 74 68 65 20 43 53 56  LY since the CSV
61f0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
6200: 6c 6c 79 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  lly writable..*/
6210: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 73 76 74  .static int csvt
6220: 61 62 55 70 64 61 74 65 28 73 71 6c 69 74 65 33  abUpdate(sqlite3
6230: 5f 76 74 61 62 20 2a 70 2c 69 6e 74 20 6e 2c 73  _vtab *p,int n,s
6240: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 76 2c  qlite3_value**v,
6250: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 78 29  sqlite3_int64*x)
6260: 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
6270: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 7d 0a 73 74  E_READONLY;.}.st
6280: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64  atic sqlite3_mod
6290: 75 6c 65 20 43 73 76 4d 6f 64 75 6c 65 46 61 75  ule CsvModuleFau
62a0: 78 57 72 69 74 65 20 3d 20 7b 0a 20 20 30 2c 20  xWrite = {.  0, 
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62c0: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
62d0: 6e 20 2a 2f 0a 20 20 63 73 76 74 61 62 43 72 65  n */.  csvtabCre
62e0: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
62f0: 2f 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a 20 20  /* xCreate */.  
6300: 63 73 76 74 61 62 43 6f 6e 6e 65 63 74 2c 20 20  csvtabConnect,  
6310: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e           /* xCon
6320: 6e 65 63 74 20 2a 2f 0a 20 20 63 73 76 74 61 62  nect */.  csvtab
6330: 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20  BestIndex,      
6340: 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78     /* xBestIndex
6350: 20 2a 2f 0a 20 20 63 73 76 74 61 62 44 69 73 63   */.  csvtabDisc
6360: 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f  onnect,        /
6370: 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f  * xDisconnect */
6380: 0a 20 20 63 73 76 74 61 62 44 69 73 63 6f 6e 6e  .  csvtabDisconn
6390: 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  ect,        /* x
63a0: 44 65 73 74 72 6f 79 20 2a 2f 0a 20 20 63 73 76  Destroy */.  csv
63b0: 74 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  tabOpen,        
63c0: 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d        /* xOpen -
63d0: 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a   open a cursor *
63e0: 2f 0a 20 20 63 73 76 74 61 62 43 6c 6f 73 65 2c  /.  csvtabClose,
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6400: 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61  xClose - close a
6410: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 73 76   cursor */.  csv
6420: 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20 20  tabFilter,      
6430: 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72        /* xFilter
6440: 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61   - configure sca
6450: 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  n constraints */
6460: 0a 20 20 63 73 76 74 61 62 4e 65 78 74 2c 20 20  .  csvtabNext,  
6470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
6480: 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61  Next - advance a
6490: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 73 76   cursor */.  csv
64a0: 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20 20  tabEof,         
64b0: 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20        /* xEof - 
64c0: 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66  check for end of
64d0: 20 73 63 61 6e 20 2a 2f 0a 20 20 63 73 76 74 61   scan */.  csvta
64e0: 62 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  bColumn,        
64f0: 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d      /* xColumn -
6500: 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
6510: 63 73 76 74 61 62 52 6f 77 69 64 2c 20 20 20 20  csvtabRowid,    
6520: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77           /* xRow
6530: 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  id - read data *
6540: 2f 0a 20 20 63 73 76 74 61 62 55 70 64 61 74 65  /.  csvtabUpdate
6550: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
6560: 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20  xUpdate */.  0, 
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20        /* xBegin 
6590: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
65b0: 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20 20   xSync */.  0,  
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20       /* xCommit 
65e0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6600: 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20   xRollback */.  
6610: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6620: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e           /* xFin
6630: 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20  dMethod */.  0, 
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65        /* xRename
6660: 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a   */.};.#endif /*
6670: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.
6680: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
6690: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
66a0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
66b0: 0a 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  ...#ifdef _WIN32
66c0: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
66d0: 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 2f 2a  xport).#endif./*
66e0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
66f0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
6700: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69   the extension i
6710: 73 20 6c 6f 61 64 65 64 2e 20 20 54 68 65 20 6e  s loaded.  The n
6720: 65 77 0a 2a 2a 20 43 53 56 20 76 69 72 74 75 61  ew.** CSV virtua
6730: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 69  l table module i
6740: 73 20 72 65 67 69 73 74 65 72 65 64 20 77 69 74  s registered wit
6750: 68 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 64 61  h the calling da
6760: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
6770: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
6780: 69 74 65 33 5f 63 73 76 5f 69 6e 69 74 28 0a 20  ite3_csv_init(. 
6790: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
67a0: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
67b0: 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  , .  const sqlit
67c0: 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20  e3_api_routines 
67d0: 2a 70 41 70 69 0a 29 7b 0a 23 69 66 6e 64 65 66  *pApi.){.#ifndef
67e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
67f0: 54 55 41 4c 54 41 42 4c 45 09 0a 20 20 69 6e 74  TUALTABLE..  int
6800: 20 72 63 3b 0a 20 20 53 51 4c 49 54 45 5f 45 58   rc;.  SQLITE_EX
6810: 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41  TENSION_INIT2(pA
6820: 70 69 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  pi);.  rc = sqli
6830: 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
6840: 65 28 64 62 2c 20 22 63 73 76 22 2c 20 26 43 73  e(db, "csv", &Cs
6850: 76 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 23 69 66  vModule, 0);.#if
6860: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
6870: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6880: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
6890: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d  sqlite3_create_m
68a0: 6f 64 75 6c 65 28 64 62 2c 20 22 63 73 76 5f 77  odule(db, "csv_w
68b0: 72 22 2c 20 26 43 73 76 4d 6f 64 75 6c 65 46 61  r", &CsvModuleFa
68c0: 75 78 57 72 69 74 65 2c 20 30 29 3b 0a 20 20 7d  uxWrite, 0);.  }
68d0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
68e0: 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74   rc;.#else.  ret
68f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
6900: 65 6e 64 69 66 0a 7d 0a                          endif.}.