Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,36 @@ module ConnectionAdapters
module Sqlserver
module CoreExt
module Explain

SQLSERVER_STATEMENT_PREFIX = "EXEC sp_executesql "
SQLSERVER_PARAM_MATCHER = /@\d+ =/

def exec_explain(queries)
unprepared_queries = queries.map { |sql, bind| [unprepare_sqlserver_statement(sql), bind] }
super(unprepared_queries)
end

private
# This is somewhat hacky, but it should reliably reformat our prepared sql statment
# which uses sp_executesql to just the first argument, then unquote it. Likewise our

# This is somewhat hacky, but it should reliably reformat our prepared sql statment
# which uses sp_executesql to just the first argument, then unquote it. Likewise our
# do_exec_query method should substitude the @n args withe the quoted values.
def unprepare_sqlserver_statement(sql)
if sql.starts_with?(SQLSERVER_STATEMENT_PREFIX)
executesql = sql.from(SQLSERVER_STATEMENT_PREFIX.length)
executesql_args = executesql.split(', ')
executesql_args.reject! { |arg| arg =~ SQLSERVER_PARAM_MATCHER }
executesql_args.pop if executesql_args.many?
has_sqlserver_params = executesql_args.reject! { |arg| arg =~ SQLSERVER_PARAM_MATCHER }
if has_sqlserver_params
executesql_args.pop if executesql_args.many?
end
executesql = executesql_args.join(', ').strip.match(/N'(.*)'/)[1]
Utils.unquote_string(executesql)
else
sql
end
end


end
end
end
Expand Down