READ_CSV
READ_CSV is a table function: it reads a CSV file directly by path, without
registering it as a table in a catalog first. Use it in a FROM clause wherever a
table name is expected.
Syntax
FROM READ_CSV(<path> [, separator => <char>]
[, has_header_row => <boolean>]
[, ignore_errors => <boolean>]
[, infer_sample_size => <integer>])Parameters
<path>— single string literal giving the file path (or glob pattern matching multiple files) to read.separator => <char>, default','— Single-character field separator. Use'\t'for TSV.has_header_row => <boolean>, defaulttrue— Iffalse, the first row is treated as data, and columns are namedcol_0,col_1, ...ignore_errors => <boolean>, defaultfalse— Column types are inferred from the firstinfer_sample_sizevalues seen in each column. If a later value in that column doesn't fit the inferred type, the default (false) fails the query, naming the column and the offending value. Set totrueto treat that value asNULLinstead.infer_sample_size => <integer>, default5— Number of non-null values per column sampled to infer its type. A larger value reduces the chance of a later type mismatch at the cost of a larger upfront sample.
Examples
Query a Single File
SELECT *
FROM READ_CSV('data/orders.csv');Tab-Separated File with No Header Row
SELECT *
FROM READ_CSV('data/orders.tsv', separator => '\t', has_header_row => false);Query a Set of Files with a Glob
SELECT *
FROM READ_CSV('data/orders-*.csv');Tolerate Values That Don't Match the Inferred Column Type
SELECT *
FROM READ_CSV('data/orders.csv', ignore_errors => true);Alias the Relation
SELECT o.id, o.total
FROM READ_CSV('data/orders.csv') AS o
WHERE o.total > 100;Notes
- Supported column types are
INTEGER,FLOAT,VARCHAR, andNULL— a column widens fromINTEGERtoFLOATtoVARCHARas needed to fit the values seen during inference. There is noBOOLEANtype: CSV has no native boolean literal syntax, so values liketrue/falseare read asVARCHAR. - Column names and types are inferred from the file's own content at query-plan time;
there is no
AS alias(col1, col2, ...)form to rename columns — useSELECT ... AS new_nameinstead. A plain relation alias (AS alias, no column list) is supported. - Standard filter and column pushdown apply: simple
WHERE column op literalpredicates and the columns your query actually references are pushed into the read. - A glob path (containing
*,?, or[) matches multiple files; their combined content is read as one relation. Every matched file's columns and inferred types must agree with the first file's — a file whose schema disagrees fails the query rather than silently producing mismatched or missing columns. gs://bucket/objectpaths are supported and are always fetched anonymously (a public GCS object is read; a private one fails with an error) — Opteryx never signs a request or uses platform credentials on your behalf for a path given toREAD_CSV. Glob patterns are not supported forgs://paths, because listing a bucket's contents needs a permission a public, unauthenticated read does not have. Usegs://, notgcs://.