Safe SQL fragment builders for DuckDB table-producing data sources.
DuckDB can query files, object stores, and lakehouse tables directly through
table functions such as read_parquet/2, read_csv/2, read_json/2,
read_xlsx/2, delta_scan/2, and iceberg_scan/2. This module builds those
fragments with QuackDB's SQL literal formatting so callers do not need to
manually interpolate paths or options.
These helpers return SQL fragments, not executable queries. Use them in raw SQL
that is sent to QuackDB.query/4 or Ecto.Adapters.SQL.query/4:
source = QuackDB.Source.parquet("s3://bucket/events/*.parquet", hive_partitioning: true)
QuackDB.query!(conn, ["SELECT count(*) FROM ", source])Options are emitted as DuckDB named parameters:
QuackDB.Source.csv("events.csv", header: true, columns: %{id: "INTEGER", name: "VARCHAR"})Plain Elixir maps are formatted as DuckDB struct literals, which is the shape
used by options such as columns. Use {:map, map} when a DuckDB MAP {...}
literal is required.
Summary
Functions
Builds a read_csv(...) table function fragment.
Builds a delta_scan(...) table function fragment.
Builds a histogram_values(...) table function fragment.
Builds an iceberg_scan(...) table function fragment.
Builds a read_json(...) table function fragment.
Builds a read_parquet(...) table function fragment.
Wraps a source in a DuckDB USING SAMPLE subquery.
Returns true when a value looks like a QuackDB source table-function fragment.
Builds a DuckDB table-function fragment for a validated function name.
Builds a read_xlsx(...) table function fragment.
Types
@type option_value() :: QuackDB.SQL.parameter() | atom() | %{optional(atom() | String.t() | integer()) => option_value()} | {:struct, keyword(option_value()) | map()} | {:map, map()}
Functions
@spec csv( path_or_paths(), keyword(option_value()) ) :: String.t()
Builds a read_csv(...) table function fragment.
@spec delta( path_or_paths(), keyword(option_value()) ) :: String.t()
Builds a delta_scan(...) table function fragment.
Builds a histogram_values(...) table function fragment.
@spec iceberg( path_or_paths(), keyword(option_value()) ) :: String.t()
Builds an iceberg_scan(...) table function fragment.
@spec json( path_or_paths(), keyword(option_value()) ) :: String.t()
Builds a read_json(...) table function fragment.
@spec parquet( path_or_paths(), keyword(option_value()) ) :: String.t()
Builds a read_parquet(...) table function fragment.
Wraps a source in a DuckDB USING SAMPLE subquery.
Returns true when a value looks like a QuackDB source table-function fragment.
@spec table_function(String.t(), path_or_paths(), keyword(option_value())) :: String.t()
Builds a DuckDB table-function fragment for a validated function name.
@spec xlsx( String.t(), keyword(option_value()) ) :: String.t()
Builds a read_xlsx(...) table function fragment.