Documentation Source Text

Hex Artifact Content
Login

Artifact 01b1a5ca1382dd372d40f7237d8885634b40282080e80d14cfe667f4cc672479:


0000: 3c 74 69 74 6c 65 3e 54 68 65 20 43 53 56 20 56  <title>The CSV V
0010: 69 72 74 75 61 6c 20 54 61 62 6c 65 3c 2f 74 69  irtual Table</ti
0020: 74 6c 65 3e 0a 3c 74 63 6c 3e 68 64 5f 6b 65 79  tle>.<tcl>hd_key
0030: 77 6f 72 64 73 20 63 73 76 20 7b 43 53 56 20 76  words csv {CSV v
0040: 69 72 74 75 61 6c 20 74 61 62 6c 65 7d 3c 2f 74  irtual table}</t
0050: 63 6c 3e 0a 3c 66 61 6e 63 79 5f 66 6f 72 6d 61  cl>.<fancy_forma
0060: 74 3e 0a 0a 3c 68 31 3e 4f 76 65 72 76 69 65 77  t>..<h1>Overview
0070: 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 54 68 65 20 43  </h1>..<p>.The C
0080: 53 56 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  SV virtual table
0090: 20 72 65 61 64 73 0a 5b 68 74 74 70 73 3a 2f 2f   reads.[https://
00a0: 77 77 77 2e 69 65 74 66 2e 6f 72 67 2f 72 66 63  www.ietf.org/rfc
00b0: 2f 72 66 63 34 31 38 30 2e 74 78 74 7c 52 46 43  /rfc4180.txt|RFC
00c0: 20 34 31 38 30 5d 20 66 6f 72 6d 61 74 74 65 64   4180] formatted
00d0: 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64   comma-separated
00e0: 0a 76 61 6c 75 65 73 2c 20 61 6e 64 20 72 65 74  .values, and ret
00f0: 75 72 6e 73 20 74 68 61 74 20 63 6f 6e 74 65 6e  urns that conten
0100: 74 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  t as if it were 
0110: 72 6f 77 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  rows and columns
0120: 20 6f 66 20 61 6e 20 53 51 4c 0a 74 61 62 6c 65   of an SQL.table
0130: 2e 0a 3c 2f 70 3e 0a 0a 3c 70 3e 0a 54 68 65 20  ..</p>..<p>.The 
0140: 43 53 56 20 76 69 72 74 75 61 6c 20 74 61 62 6c  CSV virtual tabl
0150: 65 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20 61  e is useful to a
0160: 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 68 61 74  pplications that
0170: 20 6e 65 65 64 20 74 6f 20 62 75 6c 6b 2d 6c 6f   need to bulk-lo
0180: 61 64 0a 6c 61 72 67 65 20 61 6d 6f 75 6e 74 73  ad.large amounts
0190: 20 6f 66 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61   of comma-separa
01a0: 74 65 64 20 76 61 6c 75 65 20 63 6f 6e 74 65 6e  ted value conten
01b0: 74 2e 0a 54 68 65 20 43 53 56 20 76 69 72 74 75  t..The CSV virtu
01c0: 61 6c 20 74 61 62 6c 65 20 69 73 20 61 6c 73 6f  al table is also
01d0: 20 75 73 65 66 75 6c 20 61 73 20 61 20 74 65 6d   useful as a tem
01e0: 70 6c 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c  plate source fil
01f0: 65 20 66 6f 72 0a 69 6d 70 6c 65 6d 65 6e 74 69  e for.implementi
0200: 6e 67 20 6f 74 68 65 72 20 76 69 72 74 75 61 6c  ng other virtual
0210: 20 74 61 62 6c 65 73 2e 0a 3c 2f 70 3e 0a 0a 0a   tables..</p>...
0220: 3c 70 3e 0a 54 68 65 20 43 53 56 20 76 69 72 74  <p>.The CSV virt
0230: 75 61 6c 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  ual table is not
0240: 20 62 75 69 6c 74 20 69 6e 74 6f 20 74 68 65 20   built into the 
0250: 53 51 4c 69 74 65 20 61 6d 61 6c 67 61 6d 61 74  SQLite amalgamat
0260: 69 6f 6e 2e 0a 49 74 20 69 73 20 61 76 61 69 6c  ion..It is avail
0270: 61 62 6c 65 20 61 73 20 61 0a 5b 68 74 74 70 73  able as a.[https
0280: 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
0290: 67 2f 73 72 63 2f 61 72 74 69 66 61 63 74 3f 63  g/src/artifact?c
02a0: 69 3d 74 72 75 6e 6b 26 66 69 6c 65 6e 61 6d 65  i=trunk&filename
02b0: 3d 65 78 74 2f 6d 69 73 63 2f 63 73 76 2e 63 7c  =ext/misc/csv.c|
02c0: 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65 20  separate source 
02d0: 66 69 6c 65 5d 0a 74 68 61 74 20 63 61 6e 20 62  file].that can b
02e0: 65 20 63 6f 6d 70 69 6c 65 64 20 69 6e 74 6f 20  e compiled into 
02f0: 61 20 5b 6c 6f 61 64 61 62 6c 65 20 65 78 74 65  a [loadable exte
0300: 6e 73 69 6f 6e 5d 2e 0a 54 79 70 69 63 61 6c 20  nsion]..Typical 
0310: 75 73 61 67 65 20 6f 66 20 74 68 65 20 43 53 56  usage of the CSV
0320: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66   virtual table f
0330: 72 6f 6d 20 74 68 65 0a 5b 63 6f 6d 6d 61 6e 64  rom the.[command
0340: 2d 6c 69 6e 65 20 73 68 65 6c 6c 5d 20 77 6f 75  -line shell] wou
0350: 6c 64 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20  ld be something 
0360: 6c 69 6b 65 20 74 68 69 73 3a 0a 0a 3c 63 6f 64  like this:..<cod
0370: 65 62 6c 6f 63 6b 3e 0a 2e 6c 6f 61 64 20 2e 2f  eblock>..load ./
0380: 63 73 76 0a 43 52 45 41 54 45 20 56 49 52 54 55  csv.CREATE VIRTU
0390: 41 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e 74 31  AL TABLE temp.t1
03a0: 20 55 53 49 4e 47 20 63 73 76 28 66 69 6c 65 6e   USING csv(filen
03b0: 61 6d 65 3d 27 74 68 65 66 69 6c 65 2e 63 73 76  ame='thefile.csv
03c0: 27 29 3b 0a 53 45 4c 45 43 54 20 2a 20 46 52 4f  ');.SELECT * FRO
03d0: 4d 20 74 31 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  M t1;.</codebloc
03e0: 6b 3e 0a 0a 3c 70 3e 0a 54 68 65 20 66 69 72 73  k>..<p>.The firs
03f0: 74 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 73 63  t line of the sc
0400: 72 69 70 74 20 61 62 6f 76 65 20 63 61 75 73 65  ript above cause
0410: 73 20 74 68 65 20 5b 63 6f 6d 6d 61 6e 64 2d 6c  s the [command-l
0420: 69 6e 65 20 73 68 65 6c 6c 5d 20 74 6f 0a 72 65  ine shell] to.re
0430: 61 64 20 61 6e 64 20 61 63 74 69 76 61 74 65 20  ad and activate 
0440: 74 68 65 20 72 75 6e 2d 74 69 6d 65 20 6c 6f 61  the run-time loa
0450: 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f 6e 20  dable extension 
0460: 66 6f 72 20 43 53 56 2e 20 20 46 6f 72 20 61 6e  for CSV.  For an
0470: 0a 61 70 70 6c 69 63 61 74 69 6f 6e 2c 20 74 68  .application, th
0480: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 43 2d 6c  e equivalent C-l
0490: 61 6e 67 75 61 67 65 20 41 50 49 20 69 73 0a 5b  anguage API is.[
04a0: 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
04b0: 65 6e 73 69 6f 6e 28 29 5d 2e 0a 4f 62 73 65 72  ension()]..Obser
04c0: 76 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  ve that the file
04d0: 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 28  name extension (
04e0: 65 78 3a 20 22 2e 64 6c 6c 22 20 6f 72 20 22 2e  ex: ".dll" or ".
04f0: 73 6f 22 20 6f 72 20 22 2e 64 79 6c 69 62 22 29  so" or ".dylib")
0500: 20 69 73 0a 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is.omitted from
0510: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 66   the extension f
0520: 69 6c 65 6e 61 6d 65 2e 20 20 4f 6d 69 74 74 69  ilename.  Omitti
0530: 6e 67 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  ng the filename 
0540: 65 78 74 65 6e 73 69 6f 6e 20 69 73 0a 6e 6f 74  extension is.not
0550: 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 69   required, but i
0560: 74 20 68 65 6c 70 73 20 69 6e 20 6d 61 6b 69 6e  t helps in makin
0570: 67 20 74 68 65 20 73 63 72 69 70 74 20 63 72 6f  g the script cro
0580: 73 73 2d 70 6c 61 74 66 6f 72 6d 2e 20 20 53 51  ss-platform.  SQ
0590: 4c 69 74 65 0a 77 69 6c 6c 20 61 75 74 6f 6d 61  Lite.will automa
05a0: 74 69 63 61 6c 6c 79 20 61 70 70 65 6e 64 20 74  tically append t
05b0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
05c0: 78 74 65 6e 73 69 6f 6e 2e 0a 0a 3c 70 3e 0a 54  xtension...<p>.T
05d0: 68 65 20 73 65 63 6f 6e 64 20 6c 69 6e 65 20 61  he second line a
05e0: 62 6f 76 65 20 63 72 65 61 74 65 73 20 61 20 76  bove creates a v
05f0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6e 61 6d  irtual table nam
0600: 65 64 20 22 74 31 22 20 74 68 61 74 20 72 65 61  ed "t1" that rea
0610: 64 73 0a 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ds.the content o
0620: 66 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  f the file named
0630: 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
0640: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 61 6e  .  The number an
0650: 64 20 6e 61 6d 65 73 20 6f 66 0a 74 68 65 20 63  d names of.the c
0660: 6f 6c 75 6d 6e 73 20 69 73 20 64 65 74 65 72 6d  olumns is determ
0670: 69 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ined automatical
0680: 6c 79 20 62 79 20 72 65 61 64 69 6e 67 20 74 68  ly by reading th
0690: 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 0a  e first line of.
06a0: 63 6f 6e 74 65 6e 74 2e 20 20 4f 74 68 65 72 20  content.  Other 
06b0: 6f 70 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 43  options to the C
06c0: 53 56 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  SV virtual table
06d0: 20 70 72 6f 76 69 64 65 20 74 68 65 20 61 62 69   provide the abi
06e0: 6c 69 74 79 20 74 6f 0a 74 61 6b 65 20 74 68 65  lity to.take the
06f0: 20 43 53 56 20 63 6f 6e 74 65 6e 74 20 66 72 6f   CSV content fro
0700: 6d 20 61 20 73 74 72 69 6e 67 20 72 61 74 68 65  m a string rathe
0710: 72 20 74 68 61 6e 20 61 20 73 65 70 61 72 61 74  r than a separat
0720: 65 20 66 69 6c 65 2c 20 61 6e 64 20 67 69 76 65  e file, and give
0730: 20 0a 74 68 65 20 70 72 6f 67 72 61 6d 6d 65 72   .the programmer
0740: 20 6d 6f 72 65 20 63 6f 6e 74 72 6f 6c 20 6f 76   more control ov
0750: 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20 61 6e  er the number an
0760: 64 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  d names of the c
0770: 6f 6c 75 6d 6e 73 2e 0a 54 68 65 20 6f 70 74 69  olumns..The opti
0780: 6f 6e 73 20 61 72 65 20 64 65 74 61 69 6c 65 64  ons are detailed
0790: 20 62 65 6c 6f 77 2e 20 20 54 68 65 20 43 53 56   below.  The CSV
07a0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
07b0: 73 20 75 73 75 61 6c 6c 79 0a 63 72 65 61 74 65  s usually.create
07c0: 64 20 61 73 20 61 20 54 45 4d 50 20 74 61 62 6c  d as a TEMP tabl
07d0: 65 20 73 6f 20 74 68 61 74 20 69 74 20 65 78 69  e so that it exi
07e0: 73 74 73 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65  sts only for the
07f0: 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
0800: 65 0a 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e.connection and
0810: 20 64 6f 65 73 20 6e 6f 74 20 62 65 63 6f 6d 65   does not become
0820: 20 61 20 70 65 72 6d 61 6e 65 6e 74 20 70 61 72   a permanent par
0830: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
0840: 65 20 73 63 68 65 6d 61 2e 0a 4e 6f 74 65 20 74  e schema..Note t
0850: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
0860: 22 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 52  "CREATE TEMP VIR
0870: 54 55 41 4c 20 54 41 42 4c 45 22 20 63 6f 6d 6d  TUAL TABLE" comm
0880: 61 6e 64 20 69 6e 20 53 51 4c 69 74 65 2e 0a 49  and in SQLite..I
0890: 6e 73 74 65 61 64 2c 20 70 72 65 70 65 6e 64 20  nstead, prepend 
08a0: 74 68 65 20 22 74 65 6d 70 2e 22 20 73 63 68 65  the "temp." sche
08b0: 6d 61 20 70 72 65 66 69 78 20 74 6f 20 74 68 65  ma prefix to the
08c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 72   name of the vir
08d0: 74 75 61 6c 0a 74 61 62 6c 65 2e 0a 0a 3c 70 3e  tual.table...<p>
08e0: 0a 54 68 65 20 74 68 69 72 64 20 6c 69 6e 65 20  .The third line 
08f0: 6f 66 20 74 68 65 20 65 78 61 6d 70 6c 65 20 73  of the example s
0900: 68 6f 77 73 20 74 68 65 20 76 69 72 74 75 61 6c  hows the virtual
0910: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 75 73 65   table being use
0920: 64 2c 20 74 6f 20 72 65 61 64 0a 61 6c 6c 20 63  d, to read.all c
0930: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 43 53  ontent of the CS
0940: 56 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  V file.  This is
0950: 20 70 65 72 68 61 70 73 20 74 68 65 20 73 69 6d   perhaps the sim
0960: 70 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 75  plest possible u
0970: 73 65 0a 6f 66 20 74 68 65 20 76 69 72 74 75 61  se.of the virtua
0980: 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 43 53  l table.  The CS
0990: 56 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  V virtual table 
09a0: 63 61 6e 20 62 65 20 75 73 65 64 20 61 6e 79 77  can be used anyw
09b0: 68 65 72 65 20 61 6e 20 6f 72 64 69 6e 61 72 79  here an ordinary
09c0: 0a 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63  .virtual table c
09d0: 61 6e 20 62 65 20 75 73 65 64 2e 20 20 4f 6e 65  an be used.  One
09e0: 20 63 61 6e 20 75 73 65 20 74 68 65 20 43 53 56   can use the CSV
09f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
0a00: 6e 73 69 64 65 20 73 75 62 71 75 65 72 69 65 73  nside subqueries
0a10: 2c 0a 6f 72 20 5b 63 6f 6d 6d 6f 6e 20 74 61 62  ,.or [common tab
0a20: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 73 5d 20  le expressions] 
0a30: 6f 72 20 61 64 64 20 57 48 45 52 45 2c 20 47 52  or add WHERE, GR
0a40: 4f 55 50 20 42 59 2c 20 48 41 56 49 4e 47 2c 20  OUP BY, HAVING, 
0a50: 4f 52 44 45 52 20 42 59 2c 0a 61 6e 64 20 4c 49  ORDER BY,.and LI
0a60: 4d 49 54 20 63 6c 61 75 73 65 73 20 61 73 20 72  MIT clauses as r
0a70: 65 71 75 69 72 65 64 2e 0a 0a 3c 68 31 3e 52 65  equired...<h1>Re
0a80: 63 6f 67 6e 69 7a 65 64 20 41 72 67 75 6d 65 6e  cognized Argumen
0a90: 74 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 54 68 65  ts</h1>..<p>.The
0aa0: 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 73   example above s
0ab0: 68 6f 77 65 64 20 61 20 73 69 6e 67 6c 65 20 3c  howed a single <
0ac0: 62 3e 66 69 6c 65 6e 61 6d 65 3d 27 74 68 65 66  b>filename='thef
0ad0: 69 6c 65 2e 63 73 76 27 3c 2f 62 3e 20 61 72 67  ile.csv'</b> arg
0ae0: 75 6d 65 6e 74 0a 66 6f 72 20 74 68 65 20 43 53  ument.for the CS
0af0: 56 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  V virtual table.
0b00: 20 20 42 75 74 20 6f 74 68 65 72 20 61 72 67 75    But other argu
0b10: 6d 65 6e 74 73 20 61 72 65 20 61 6c 73 6f 20 70  ments are also p
0b20: 6f 73 73 69 62 6c 65 2e 0a 0a 3c 75 6c 3e 0a 3c  ossible...<ul>.<
0b30: 6c 69 3e 3c 70 3e 3c 62 3e 66 69 6c 65 6e 61 6d  li><p><b>filenam
0b40: 65 3d 3c 2f 62 3e 3c 69 3e 46 49 4c 45 4e 41 4d  e=</b><i>FILENAM
0b50: 45 3c 2f 69 3e 0a 3c 70 3e 54 68 65 20 3c 62 3e  E</i>.<p>The <b>
0b60: 66 69 6c 65 6e 61 6d 65 3d 3c 2f 62 3e 20 61 72  filename=</b> ar
0b70: 67 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73  gument specifies
0b80: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 66 69 6c   an external fil
0b90: 65 20 66 72 6f 6d 20 77 68 69 63 68 0a 43 53 56  e from which.CSV
0ba0: 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 61 64   content is read
0bb0: 2e 20 20 45 76 65 72 79 20 43 53 56 20 76 69 72  .  Every CSV vir
0bc0: 74 75 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  tual table must 
0bd0: 68 61 76 65 20 65 69 74 68 65 72 20 61 20 0a 3c  have either a .<
0be0: 62 3e 66 69 6c 65 6e 61 6d 65 3d 3c 2f 62 3e 20  b>filename=</b> 
0bf0: 61 72 67 75 6d 65 6e 74 20 6f 72 20 61 20 3c 62  argument or a <b
0c00: 3e 64 61 74 61 3d 3c 2f 62 3e 20 61 72 67 75 6d  >data=</b> argum
0c10: 65 6e 74 20 61 6e 64 20 6e 6f 74 20 62 6f 74 68  ent and not both
0c20: 2e 0a 0a 3c 6c 69 3e 3c 70 3e 3c 62 3e 64 61 74  ...<li><p><b>dat
0c30: 61 3d 3c 2f 62 3e 3c 69 3e 54 45 58 54 3c 2f 69  a=</b><i>TEXT</i
0c40: 3e 0a 3c 70 3e 54 68 65 20 3c 62 3e 64 61 74 61  >.<p>The <b>data
0c50: 3d 3c 2f 62 3e 20 61 72 67 75 6d 65 6e 74 20 73  =</b> argument s
0c60: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 3c 69  pecifies that <i
0c70: 3e 54 45 58 54 3c 2f 69 3e 20 69 73 20 74 68 65  >TEXT</i> is the
0c80: 20 6c 69 74 65 72 61 6c 0a 63 6f 6e 74 65 6e 74   literal.content
0c90: 20 6f 66 20 74 68 65 20 43 53 56 20 66 69 6c 65   of the CSV file
0ca0: 2e 0a 0a 3c 6c 69 3e 3c 70 3e 3c 62 3e 73 63 68  ...<li><p><b>sch
0cb0: 65 6d 61 3d 3c 2f 62 3e 3c 69 3e 53 43 48 45 4d  ema=</b><i>SCHEM
0cc0: 41 3c 2f 69 3e 0a 3c 70 3e 20 54 68 65 20 3c 62  A</i>.<p> The <b
0cd0: 3e 73 63 68 65 6d 61 3d 3c 2f 62 3e 20 61 72 67  >schema=</b> arg
0ce0: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
0cf0: 61 20 5b 43 52 45 41 54 45 20 54 41 42 4c 45 5d  a [CREATE TABLE]
0d00: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a   statement that.
0d10: 74 68 65 20 43 53 56 20 76 69 72 74 75 61 6c 20  the CSV virtual 
0d20: 74 61 62 6c 65 20 70 61 73 73 65 73 20 74 6f 20  table passes to 
0d30: 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 64 65 63  the [sqlite3_dec
0d40: 6c 61 72 65 5f 76 74 61 62 28 29 5d 20 69 6e 74  lare_vtab()] int
0d50: 65 72 66 61 63 65 20 69 6e 0a 6f 72 64 65 72 20  erface in.order 
0d60: 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6e 75  to define the nu
0d70: 6d 62 65 72 20 61 6e 64 20 6e 61 6d 65 73 20 6f  mber and names o
0d80: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
0d90: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
0da0: 6c 65 2e 0a 49 66 20 62 6f 74 68 20 74 68 65 20  le..If both the 
0db0: 3c 62 3e 73 63 68 65 6d 61 3d 3c 2f 62 3e 20 61  <b>schema=</b> a
0dc0: 6e 64 20 74 68 65 20 3c 62 3e 63 6f 6c 75 6d 6e  nd the <b>column
0dd0: 73 3d 3c 2f 62 3e 20 61 72 67 75 6d 65 6e 74 73  s=</b> arguments
0de0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 0a 74 68   are omitted,.th
0df0: 65 6e 20 74 68 65 20 43 53 56 20 76 69 72 74 75  en the CSV virtu
0e00: 61 6c 20 74 61 62 6c 65 20 72 65 61 64 73 20 74  al table reads t
0e10: 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  he first row of 
0e20: 74 68 65 20 69 6e 70 75 74 20 63 6f 6e 74 65 6e  the input conten
0e30: 74 20 69 6e 20 6f 72 64 65 72 0a 74 6f 20 64 65  t in order.to de
0e40: 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62  termine the numb
0e50: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e  er of columns an
0e60: 64 20 6e 61 6d 65 73 20 74 68 65 20 63 6f 6c 75  d names the colu
0e70: 6d 6e 73 20 3c 62 3e 63 4e 4e 4e 3c 2f 62 3e 20  mns <b>cNNN</b> 
0e80: 77 68 65 72 65 0a 3c 62 3e 4e 4e 4e 3c 2f 62 3e  where.<b>NNN</b>
0e90: 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
0ea0: 65 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73  ecutive integers
0eb0: 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 61 6c 6c  .  It is not all
0ec0: 6f 77 65 64 20 74 6f 20 68 61 76 65 0a 62 6f 74  owed to have.bot
0ed0: 68 20 3c 62 3e 73 63 68 65 6d 61 3d 3c 2f 62 3e  h <b>schema=</b>
0ee0: 20 61 6e 64 20 3c 62 3e 63 6f 6c 75 6d 6e 73 3d   and <b>columns=
0ef0: 3c 2f 62 3e 20 61 72 67 75 6d 65 6e 74 73 2e 0a  </b> arguments..
0f00: 0a 3c 6c 69 3e 3c 70 3e 3c 62 3e 63 6f 6c 75 6d  .<li><p><b>colum
0f10: 6e 73 3d 3c 2f 62 3e 3c 69 3e 4e 3c 2f 69 3e 0a  ns=</b><i>N</i>.
0f20: 3c 70 3e 54 68 65 20 3c 62 3e 63 6f 6c 75 6d 6e  <p>The <b>column
0f30: 73 3d 3c 2f 62 3e 3c 69 3e 4e 3c 2f 69 3e 20 61  s=</b><i>N</i> a
0f40: 72 67 75 6d 65 6e 74 20 63 61 75 73 65 73 20 74  rgument causes t
0f50: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
0f60: 20 74 6f 20 68 61 76 65 0a 65 78 61 63 74 6c 79   to have.exactly
0f70: 20 3c 69 3e 4e 3c 2f 69 3e 20 63 6f 6c 75 6d 6e   <i>N</i> column
0f80: 73 2e 20 20 49 66 20 74 68 65 20 69 6e 70 75 74  s.  If the input
0f90: 20 64 61 74 61 20 63 6f 6e 74 61 69 6e 73 20 6d   data contains m
0fa0: 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e  ore columns than
0fb0: 20 74 68 69 73 2c 0a 74 68 65 6e 20 74 68 65 20   this,.then the 
0fc0: 65 78 63 65 73 73 20 63 6f 6c 75 6d 6e 73 20 61  excess columns a
0fd0: 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20  re ignored.  If 
0fe0: 74 68 65 20 69 6e 70 75 74 20 64 61 74 61 20 63  the input data c
0ff0: 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 63 6f  ontains fewer co
1000: 6c 75 6d 6e 73 2c 0a 74 68 65 6e 20 65 78 74 72  lumns,.then extr
1010: 61 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 66 69  a columns are fi
1020: 6c 6c 65 64 20 77 69 74 68 20 4e 55 4c 4c 2e 0a  lled with NULL..
1030: 3c 2f 75 3e 0a                                   </u>.