QuackDB.SQL (quackdb v0.5.3)

Copy Markdown View Source

Client-side SQL parameter formatting for DuckDB Quack queries.

DuckDB's current Quack protocol request shape does not expose server-side bind parameters. QuackDB therefore formats positional ? placeholders as DuckDB SQL literals before sending a PrepareRequest.

The formatter scans SQL and ignores placeholders inside quoted strings and SQL comments. It supports conservative scalar values and raises QuackDB.Error for unsupported parameter shapes rather than producing lossy SQL.

Summary

Functions

Builds a CALL function(args..., option = value...); statement.

Builds a DuckDB COLUMNS(...) expression.

Builds a DuckDB CUBE (...) grouping expression.

Builds an EXPLAIN ... or EXPLAIN ANALYZE ... statement.

Builds a DuckDB GROUPING SETS (...) grouping expression.

Builds an INSTALL extension; statement.

Builds a DuckDB SQL literal or raises QuackDB.Error for unsupported values.

Builds a LOAD extension; statement.

Builds a DuckDB PIVOT statement.

Builds a DuckDB ROLLUP (...) grouping expression.

Builds a SET name = value; statement.

Builds a SET GLOBAL name = value; statement.

Builds a DuckDB star expression such as * EXCLUDE (...) or table.* REPLACE (...).

Builds a DuckDB *COLUMNS(...) unpacked columns expression.

Builds a DuckDB UNPIVOT statement.

Types

parameter()

@type parameter() ::
  nil
  | boolean()
  | integer()
  | float()
  | String.t()
  | Decimal.t()
  | Date.t()
  | Time.t()
  | NaiveDateTime.t()
  | DateTime.t()
  | QuackDB.Interval.t()
  | Duration.t()
  | {:blob, binary()}
  | {:json, term()}
  | {:interval, integer(), integer(), integer()}
  | [parameter()]

Functions

call(function, positional_args \\ [], named_args \\ [])

@spec call(atom() | String.t(), [parameter()], keyword(parameter())) :: iodata()

Builds a CALL function(args..., option = value...); statement.

columns(selector \\ :star, options \\ [])

@spec columns(
  :star | String.t() | [atom() | String.t()] | keyword(),
  keyword()
) :: iodata()

Builds a DuckDB COLUMNS(...) expression.

cube(columns)

@spec cube([atom() | String.t() | {:expr, iodata()}]) :: iodata()

Builds a DuckDB CUBE (...) grouping expression.

explain(statement, options \\ [])

@spec explain(
  iodata(),
  keyword()
) :: iodata()

Builds an EXPLAIN ... or EXPLAIN ANALYZE ... statement.

Pass analyze: true to run the query and include DuckDB execution timings. Pass format: :json, :html, :graphviz, :mermaid, or :text to use DuckDB's EXPLAIN (FORMAT ...) output.

format(statement, params)

@spec format(iodata(), [parameter()]) ::
  {:ok, String.t()} | {:error, QuackDB.Error.t()}

grouping_sets(sets)

@spec grouping_sets([[atom() | String.t() | {:expr, iodata()}]]) :: iodata()

Builds a DuckDB GROUPING SETS (...) grouping expression.

install(extension)

@spec install(atom() | String.t()) :: iodata()

Builds an INSTALL extension; statement.

literal(value)

@spec literal(parameter()) :: {:ok, iodata()} | {:error, QuackDB.Error.t()}

literal!(value)

@spec literal!(parameter()) :: iodata()

Builds a DuckDB SQL literal or raises QuackDB.Error for unsupported values.

load(extension)

@spec load(atom() | String.t()) :: iodata()

Builds a LOAD extension; statement.

pivot(source, options)

@spec pivot(
  iodata(),
  keyword()
) :: iodata()

Builds a DuckDB PIVOT statement.

rollup(columns)

@spec rollup([atom() | String.t() | {:expr, iodata()}]) :: iodata()

Builds a DuckDB ROLLUP (...) grouping expression.

set(name, value)

@spec set(atom() | String.t(), parameter()) :: iodata()

Builds a SET name = value; statement.

set_global(name, value)

@spec set_global(atom() | String.t(), parameter()) :: iodata()

Builds a SET GLOBAL name = value; statement.

star(options \\ [])

@spec star(keyword()) :: iodata()

Builds a DuckDB star expression such as * EXCLUDE (...) or table.* REPLACE (...).

unpack_columns(selector \\ :star, options \\ [])

@spec unpack_columns(
  :star | String.t() | [atom() | String.t()] | keyword(),
  keyword()
) :: iodata()

Builds a DuckDB *COLUMNS(...) unpacked columns expression.

unpivot(source, options)

@spec unpivot(
  iodata(),
  keyword()
) :: iodata()

Builds a DuckDB UNPIVOT statement.