module ActiveRecord::Explain

def collecting_queries_for_explain # :nodoc:

:nodoc:
asynchronously by the subscriber and returned.
Executes the block with the collect flag enabled. Queries are collected
def collecting_queries_for_explain # :nodoc:
  ExplainRegistry.collect = true
  yield
  ExplainRegistry.queries
ensure
  ExplainRegistry.reset
end

def exec_explain(queries) # :nodoc:

:nodoc:
Returns a formatted string ready to be logged.
Makes the adapter execute EXPLAIN for the tuples of queries and bindings.
def exec_explain(queries) # :nodoc:
  str = queries.map do |sql, binds|
    msg = +"EXPLAIN for: #{sql}"
    unless binds.empty?
      msg << " "
      msg << binds.map { |attr| render_bind(attr) }.inspect
    end
    msg << "\n"
    msg << connection.explain(sql, binds)
  end.join("\n")
  # Overriding inspect to be more human readable, especially in the console.
  def str.inspect
    self
  end
  str
end

def render_bind(attr)

def render_bind(attr)
  if ActiveModel::Attribute === attr
    value = if attr.type.binary? && attr.value
      "<#{attr.value_for_database.to_s.bytesize} bytes of binary data>"
    else
      connection.type_cast(attr.value_for_database)
    end
  else
    value = connection.type_cast(attr)
    attr  = nil
  end
  [attr&.name, value]
end