lib/sql_parser.ex

defmodule SqlParser do
  @moduledoc """
  Documentation for `SqlParser`.
  """

  @doc """
  Parses a SQL query into an AST.

  Optionally accepts a dialect and a recursion limit.

  Examples

    iex>  {:ok, [%SqlParser.Query{}]} = SqlParser.parse("SELECT * FROM foo", dialect: :postgres, recursion_limit: 10)

    iex>  {:ok, [%SqlParser.Query{}]} = SqlParser.parse("SELECT * FROM foo")
  """
  def parse(sql, opts \\ [])

  def parse(sql, dialect) when is_atom(dialect) do
    parse(sql, dialect: dialect)
  end

  def parse(sql, opts) when is_list(opts) do
    dialect = opts[:dialect] || :ansi
    recursion_limit = (opts[:recursion_limit] && {:limit, opts[:recursion_limit]}) || :infinity

    case SqlParser.Parse.parse_statements(sql, dialect, recursion_limit) do
      {:ok, %SqlParser.Document{statements: statements}} -> {:ok, statements}
      {:error, error} -> {:error, error}
    end
  end

  def to_sql(ast, opts \\ []) do
    dialect = opts[:dialect] || :ansi

    case SqlParser.Parse.to_sql(ast, dialect) do
      {:ok, sql} -> {:ok, sql}
      {:error, error} -> {:error, error}
    end
  end
end