defmodule ExSQL.AST.Insert do
@moduledoc """
An `INSERT` (or `REPLACE INTO`) statement.
`columns` is `nil` when the column list is omitted (all table columns in
declaration order); column names may also be `rowid`/`oid`/`_rowid_` to
set the rowid explicitly. `source` is one of:
* `{:values, rows}` — a list of value-expression lists
* `{:select, query}` — `INSERT INTO ... SELECT ...`
* `:default_values` — `INSERT INTO ... DEFAULT VALUES`
`or_conflict` carries the `OR` clause (`REPLACE INTO` parses as
`or_conflict: :replace`). `upsert` is the list of `ON CONFLICT` clauses in
source order: `{:nothing, target}` or `{:update, target, assignments,
where}`, with `target` either `nil` (catch-all, last only) or
`{columns, where}` for a targeted clause.
"""
defstruct table: nil,
schema: nil,
target_qualified: false,
columns: nil,
source: nil,
or_conflict: nil,
upsert: [],
returning: []
@type source ::
{:values, [[ExSQL.Parser.expr()]]}
| {:select, ExSQL.Parser.statement()}
| :default_values
@type t :: %__MODULE__{
table: String.t(),
schema: String.t() | nil,
target_qualified: boolean(),
columns: [String.t()] | nil,
source: source(),
or_conflict: nil | :replace | :ignore | :abort | :fail | :rollback,
upsert: [term()],
returning: list()
}
end