module OracleSqlParser::Grammar

grammar Select
  include OracleSqlParser::Grammar::Select::Order
  include OracleSqlParser::Grammar::Select::Group
  include OracleSqlParser::Grammar::Select::Join
  include OracleSqlParser::Grammar::Select::ForUpdate
  include OracleSqlParser::Grammar::Select::Union
  include OracleSqlParser::Grammar::Select::QueryBlock
  include OracleSqlParser::Grammar::Select::RowLimit

  rule select_statement
    space? subquery for_update:(space for_update_clause)? space? {
      def ast
        OracleSqlParser::Ast::SelectStatement[
          :subquery => subquery.ast,
          :for_update_clause => for_update.try(:for_update_clause).ast
        ]
      end
    }
  end

  rule subquery
    query:(
      left_parenthesis:'(' space? subquery space? right_parenthesis:')' /
      query_block !(space union_or_intersect_or_minus) /
      subqueries:subqueries_with_union
    )
    order:(space order_by_clause)?
    row_limit:(space row_limiting_clause:row_limiting_clause)? {
      def ast
        OracleSqlParser::Ast::Subquery[
          :has_parenthesis => query.try(:left_parenthesis) ? true : nil,
          :query_block => query.try(:query_block).ast,
          :subqueries => query.try(:subqueries).ast,
          :subquery => query.try(:subquery).ast,
          :order_by_clause => order.try(:order_by_clause).ast,
          :row_limiting_clause => row_limit.try(:row_limiting_clause).ast,
        ]
      end
    }
  end
end

end