module OracleSqlParser::Grammar

grammar Delete
  rule delete_statement
    delete_keyword space delete_from_clause
    condition:(space delete_condition)?
    returning_clause:returning_clause? {
      def ast
        OracleSqlParser::Ast::DeleteStatement[
          :target => delete_from_clause.ast,
          :where_clause => condition.try(:delete_condition).ast
        ]
      end
    }
  end

  rule delete_from_clause
    from_keyword space delete_target {
      def ast
        delete_target.ast
      end
    }
  end

  rule delete_target
    t:(
      table_reference /
      delete_target_subquery
    )
    a:(space t_alias)? {
      def ast
        table_or_subquery = t.ast
        if table_or_subquery.instance_of? OracleSqlParser::Ast::DeleteTarget
          table_or_subquery
        else
          OracleSqlParser::Ast::DeleteTarget[
            :name => t.ast,
            :alias => a.try(:t_alias).ast,
          ]
        end
      end
    }
  end

  rule delete_target_subquery
    t:(table_keyword space)? '(' space? subquery space? ')' {
      def ast
        OracleSqlParser::Ast::DeleteTarget[
          :table => t.try(:table_keyword).ast,
          :name => subquery.ast
        ]
      end
    }
  end

  rule delete_condition
    where_keyword space
    where:(
      search_condition /
      delete_current_of
    ) {
      def ast
        OracleSqlParser::Ast::WhereClause[:condition => where.ast]
      end
    }
  end

  rule delete_current_of
    current_of {
      def ast
        super
      end
    }
  end
end

end