module ActiveRecord::ConnectionAdapters::SQLite3::DatabaseStatements

def exec_query(sql, name = nil, binds = [], prepare: false, async: false) # :nodoc:

:nodoc:
def exec_query(sql, name = nil, binds = [], prepare: false, async: false) # :nodoc:
  sql = transform_query(sql)
  check_if_write_query(sql)
  materialize_transactions
  mark_transaction_written_if_write(sql)
  type_casted_binds = type_casted_binds(binds)
  log(sql, name, binds, type_casted_binds, async: async) do
    ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
      # Don't cache statements if they are not prepared
      unless prepare
        stmt = @connection.prepare(sql)
        begin
          cols = stmt.columns
          unless without_prepared_statement?(binds)
            stmt.bind_params(type_casted_binds)
          end
          records = stmt.to_a
        ensure
          stmt.close
        end
      else
        stmt = @statements[sql] ||= @connection.prepare(sql)
        cols = stmt.columns
        stmt.reset!
        stmt.bind_params(type_casted_binds)
        records = stmt.to_a
      end
      build_result(columns: cols, rows: records)
    end
  end
end