Module: Benedictus::SqlFormatter

Defined in:
lib/benedictus/sql_formatter.rb

Constant Summary collapse

INDENT =
"  "
BLOCK_KEYWORDS =
[
  "WITH RECURSIVE", "WITH",
  "SELECT DISTINCT", "SELECT",
  "FROM",
  "INNER JOIN",
  "LEFT OUTER JOIN", "LEFT JOIN",
  "RIGHT OUTER JOIN", "RIGHT JOIN",
  "FULL OUTER JOIN", "FULL JOIN",
  "CROSS JOIN", "JOIN",
  "WHERE", "GROUP BY", "ORDER BY", "HAVING",
  "LIMIT", "OFFSET",
  "UNION ALL", "UNION", "INTERSECT", "EXCEPT",
  "RETURNING"
].freeze
INLINE_KEYWORDS =
%w[
  ON AS AND OR NOT IN IS LIKE ILIKE BETWEEN
  NULL TRUE FALSE
  ASC DESC NULLS FIRST LAST
  USING CASE WHEN THEN ELSE END
  DISTINCT ALL ANY EXISTS INTERVAL
].freeze
PLACEHOLDER_OPEN =

ASCII placeholder delimiters chosen so they cannot appear in well-formed SQL or in keyword names. Using printable ASCII keeps the file text-classifiable (no control bytes).

"[[!benedictus-mask:"
PLACEHOLDER_CLOSE =
"!]]"
PLACEHOLDER_RE =
/\[\[!benedictus-mask:(\d+)!\]\]/

Class Method Summary collapse

Class Method Details

.format(sql) ⇒ Object



38
39
40
41
42
43
44
45
46
47
# File 'lib/benedictus/sql_formatter.rb', line 38

def format(sql)
  return "" if sql.nil? || sql.empty?

  masked, literals = mask_literals(sql.to_s)
  upcased = uppercase_keywords(masked)
  broken  = break_blocks(upcased)
  restore(broken, literals).strip
rescue StandardError
  sql.to_s
end