Skip to main content

lib/ex_sql/ast/column_def.ex

defmodule ExSQL.AST.ColumnDef do
  @moduledoc """
  A column definition inside `CREATE TABLE`.

  `affinity` follows SQLite's type affinity model (section 3.1 of the SQLite
  datatype docs): every column has one of five affinities derived from its
  declared type, rather than a strict type.
  """

  defstruct name: nil,
            declared_type: nil,
            affinity: :blob,
            primary_key: false,
            autoincrement: false,
            not_null: false,
            unique: false,
            default: nil,
            collate: nil,
            references: nil,
            generated: nil,
            check: nil,
            check_name: nil

  @type affinity :: :integer | :text | :real | :numeric | :blob | :any

  @type t :: %__MODULE__{
          name: String.t(),
          declared_type: String.t() | nil,
          affinity: affinity(),
          primary_key: boolean(),
          autoincrement: boolean(),
          not_null: boolean(),
          unique: boolean(),
          default: ExSQL.Parser.expr() | nil,
          collate: String.t() | nil,
          references: term() | nil,
          generated: {:virtual | :stored, ExSQL.Parser.expr()} | nil,
          check: ExSQL.Parser.expr() | nil,
          check_name: String.t() | nil
        }
end