module OracleSqlParser::Grammar::Select

grammar RowLimit
  rule row_limiting_clause
    fetch:fetch {
      def ast
        OracleSqlParser::Ast::RowLimitingClause[
          :fetch => fetch.ast
        ]
      end
    }
  end

  rule offset
    offset_keyword space offset:number_literal space row:(row_keyword / rows_keyword) {
      def ast
        OracleSqlParser::Ast::Offset[
          :offset_keyword => offset_keyword,
          :offset => offset,
          :row_keyword => row.try(:row_keyword),
          :rows_keyword => row.try(:rows_keyword),
        ]
      end
    }
  end

  rule fetch
    fetch_keyword space
      first:(first_keyword / next_keyword) space
      rowcount:(rowcount:integer / percentage:integer percentage_keyword) space
      rows:(row_keyword / rows_keyword) space
      only:(only_keyword:only_keyword / with_keyword:with_keyword space ties_keyword:ties_keyword)
    {
      def ast
        OracleSqlParser::Ast::Fetch[
          fetch: fetch_keyword.ast,
          first: first.ast,
          rowcount: rowcount.try(:rowcount).ast,
          percentage: rowcount.try(:percentage).ast,
          percentage_keyword: rowcount.try(:percentage_keyword).ast,
          rows: rows.ast,
          only: only.try(:only_keyword).ast,
          with: only.try(:with_keyword).ast,
          ties: only.try(:ties_keyword).ast,
        ]
      end
    }
  end
end

end