defmodule ExSQL.AST.CreateTable do @moduledoc "A `CREATE TABLE` statement." @typedoc """ A table-level constraint, after the column list. * `{:primary_key, name | nil, [col_name]}` — composite PK * `{:unique, name | nil, [col_name]}` — composite UNIQUE * `{:check, name | nil, expr}` — CHECK expression * `{:foreign_key, name | nil, [col_name], ref_table, [ref_col], actions}` — table FK; `actions` is `%{on_delete: action, on_update: action, deferred: boolean}` with action one of `:no_action | :restrict | :set_null | :set_default | :cascade` """ @type fk_action :: :no_action | :restrict | :set_null | :set_default | :cascade @type fk_actions :: %{on_delete: fk_action(), on_update: fk_action(), deferred: boolean()} @type table_constraint :: {:primary_key, String.t() | nil, [String.t()]} | {:unique, String.t() | nil, [String.t()]} | {:check, String.t() | nil, ExSQL.Parser.expr()} | {:foreign_key, String.t() | nil, [String.t()], String.t(), [String.t()], fk_actions()} defstruct name: nil, schema: nil, columns: [], if_not_exists: false, constraints: [], without_rowid: false, strict: false, query: nil @type t :: %__MODULE__{ name: String.t(), schema: String.t() | nil, columns: [ExSQL.AST.ColumnDef.t()], if_not_exists: boolean(), constraints: [table_constraint()], without_rowid: boolean(), strict: boolean(), query: ExSQL.Parser.statement() | nil } end