module SQLiterate

grammar Keywords
  rule keyword
    with_kw / as_kw / select_kw / from_kw / join_kw / inner_kw / outer_kw /
    left_kw / right_kw / full_kw / natural_kw / on_kw / using_kw /
    where_kw / not_kw / and_kw / or_kw / true_kw / false_kw /
    is_kw / isnull_kw / notnull_kw / in_kw / between_kw / overlaps_kw /
    like_kw / ilike_kw / similar_kw / null_kw / order_kw / by_kw /
    desc_kw / asc_kw / all_kw / distinct_kw / cast_kw /
    bigint_kw / boolean_kw / double_kw / float_kw / int_kw / real_kw /
    smallint_kw / string_kw / timestamp_kw / tinyint_kw / integer_kw /
    group_kw / having_kw / nulls_kw / first_kw / last_kw / union_kw /
    intersect_kw / except_kw / limit_kw / offset_kw /
    case_kw / when_kw / then_kw / else_kw / end_kw / symmetric_kw /
    unknown_kw / exists_kw / any_kw / some_kw
  end

  rule type_name
    bigint_kw / boolean_kw / double_kw / float_kw /
    int_kw / real_kw / smallint_kw / string_kw /
    timestamp_kw / tinyint_kw / integer_kw
    <Node::TypeName>
  end

  rule kw_sep
    ![\p{Alpha}_]
  end

  rule with_kw
    [wW] [iI] [tT] [hH] kw_sep
  end

  rule as_kw
    [aA] [sS] kw_sep
  end

  rule select_kw
    [sS] [eE] [lL] [eE] [cC] [tT] kw_sep
  end

  rule from_kw
    [fF] [rR] [oO] [mM] kw_sep
  end

  rule join_kw
    [jJ] [oO] [iI] [nN] kw_sep
  end

  rule inner_kw
    [iI] [nN] [nN] [eE] [rR] kw_sep
  end

  rule outer_kw
    [oO] [uU] [tT] [eE] [rR] kw_sep
  end

  rule left_kw
    [lL] [eE] [fF] [tT] kw_sep
  end

  rule right_kw
    [rR] [iI] [gG] [hH] [tT] kw_sep
  end

  rule full_kw
    [fF] [uU] [lL] [lL] kw_sep
  end

  rule natural_kw
    [nN] [aA] [tT] [uU] [rR] [aA] [lL] kw_sep
  end

  rule on_kw
    [oO] [nN] kw_sep
  end

  rule using_kw
    [uU] [sS] [iI] [nN] [gG] kw_sep
  end

  rule where_kw
    [wW] [hH] [eE] [rR] [eE] kw_sep
  end

  rule not_kw
    [nN] [oO] [tT] kw_sep
  end

  rule and_kw
    [aA] [nN] [dD] kw_sep
  end

  rule or_kw
    [oO] [rR] kw_sep
  end

  rule true_kw
    [tT] [rR] [uU] [eE] kw_sep
  end

  rule false_kw
    [fF] [aA] [lL] [sS] [eE] kw_sep
  end

  rule is_kw
    [iI] [sS] kw_sep
  end

  rule isnull_kw
    [iI] [sS] [nN] [uU] [lL] [lL] kw_sep
  end

  rule notnull_kw
    [nN] [oO] [tT] [nN] [uU] [lL] [lL] kw_sep
  end

  rule in_kw
    [iI] [nN] kw_sep
  end

  rule between_kw
    [bB] [eE] [tT] [wW] [eE] [eE] [nN] kw_sep
  end

  rule overlaps_kw
    [oO] [vV] [eE] [rR] [lL] [aA] [pP] [sS] kw_sep
  end

  rule like_kw
    [lL] [iI] [kK] [eE] kw_sep
  end

  rule ilike_kw
    [iI] [lL] [iI] [kK] [eE] kw_sep
  end

  rule similar_kw
    [sS] [iI] [mM] [iI] [lL] [aA] [rR] kw_sep
  end

  rule null_kw
    [nN] [uU] [lL] [lL] kw_sep
  end

  rule order_kw
    [oO] [rR] [dD] [eE] [rR] kw_sep
  end

  rule by_kw
    [bB] [yY] kw_sep
  end

  rule order_by_kw
    order_kw required_space by_kw
  end

  rule desc_kw
    [dD] [eE] [sS] [cC] kw_sep
  end

  rule asc_kw
    [aA] [sS] [cC] kw_sep
  end

  rule all_kw
    [aA] [lL] [lL] kw_sep
  end

  rule distinct_kw
    [dD] [iI] [sS] [tT] [iI] [nN] [cC] [tT] kw_sep
  end

  rule cast_kw
    [cC] [aA] [sS] [tT] kw_sep
  end

  rule bigint_kw
    [bB] [iI] [gG] [iI] [nN] [tT] kw_sep
  end

  rule boolean_kw
    [bB] [oO] [oO] [lL] [eE] [aA] [nN] kw_sep
  end

  rule double_kw
    [dD] [oO] [uU] [bB] [lL] [eE] kw_sep
  end

  rule real_kw
    [rR] [eE] [aA] [lL] kw_sep
  end

  rule float_kw
    [fF] [lL] [oO] [aA] [tT] kw_sep
  end

  rule int_kw
    [iI] [nN] [tT] kw_sep
  end

  rule integer_kw
    [iI] [nN] [tT] [eE] [gG] [eE] [rR] kw_sep
  end

  rule smallint_kw
    [sS] [mM] [aA] [lL] [lL] [iI] [nN] [tT] kw_sep
  end

  rule string_kw
    [sS] [tT] [rR] [iI] [nN] [gG] kw_sep
  end

  rule timestamp_kw
    [tT] [iI] [mM] [eE] [sS] [tT] [aA] [mM] [pP] kw_sep
  end

  rule tinyint_kw
    [tT] [iI] [nN] [yY] [iI] [nN] [tT] kw_sep
  end

  rule group_kw
    [gG] [rR] [oO] [uU] [pP] kw_sep
  end

  rule group_by_kw
    group_kw required_space by_kw
  end

  rule having_kw
    [hH] [aA] [vV] [iI] [nN] [gG] kw_sep
  end

  rule nulls_kw
    [nN] [uU] [lL] [lL] [sS] kw_sep
  end

  rule first_kw
    [fF] [iI] [rR] [sS] [tT] kw_sep
  end

  rule last_kw
    [lL] [aA] [sS] [tT] kw_sep
  end

  rule union_kw
    [uU] [nN] [iI] [oO] [nN] kw_sep
  end

  rule intersect_kw
    [iI] [nN] [tT] [eE] [rR] [sS] [eE] [cC] [tT] kw_sep
  end

  rule except_kw
    [eE] [xX] [cC] [eE] [pP] [tT] kw_sep
  end

  rule limit_kw
    [lL] [iI] [mM] [iI] [tT] kw_sep
  end

  rule offset_kw
    [oO] [fF] [fF] [sS] [eE] [tT] kw_sep
  end

  rule case_kw
    [cC] [aA] [sS] [eE] kw_sep
  end

  rule when_kw
    [wW] [hH] [eE] [nN] kw_sep
  end

  rule then_kw
    [tT] [hH] [eE] [nN] kw_sep
  end

  rule else_kw
    [eE] [lL] [sS] [eE] kw_sep
  end

  rule end_kw
    [eE] [nN] [dD] kw_sep
  end

  rule symmetric_kw
    [sS] [yY] [mM] [mM] [eE] [tT] [rR] [iI] [cC] kw_sep
  end

  rule unknown_kw
    [uU] [nN] [kK] [nN] [oO] [wW] [nN] kw_sep
  end

  rule exists_kw
    [eE] [xX] [iI] [sS] [tT] [sS] kw_sep
  end

  rule any_kw
    [aA] [nN] [yY] kw_sep
  end

  rule some_kw
    [sS] [oO] [mM] [eE] kw_sep
  end
end

end