defmodule ExSQL.AST.Compound do @moduledoc """ A compound `SELECT`: two queries joined by `UNION [ALL]`, `INTERSECT`, or `EXCEPT`. Compounds nest left-associatively, so `a UNION b UNION c` parses as `(a UNION b) UNION c` with `left` itself a `Compound`. The `ORDER BY` and `LIMIT` clauses apply to the whole compound — SQLite rejects them on any component but the last, and so does the parser. """ alias ExSQL.AST.Select defstruct op: :union, left: nil, right: nil, order_by: [], limit: nil, offset: nil @type op :: :union | :union_all | :intersect | :except @type t :: %__MODULE__{ op: op(), left: Select.t() | t(), right: Select.t(), order_by: [{Select.expr(), :asc | :desc}], limit: Select.expr() | nil, offset: Select.expr() | nil } end