Class: SqlGenius::Core::QueryExplainer
- Inherits:
-
Object
- Object
- SqlGenius::Core::QueryExplainer
- Defined in:
- lib/sql_genius/core/query_explainer.rb
Overview
Runs EXPLAIN against a SELECT query via a Core::Connection. Optionally skips SQL validation (used for explaining captured slow queries from mysql’s own logs where the exact text may include references to otherwise-blocked tables).
Rejects obviously-truncated SQL — captured slow queries from the slow query log are capped at ~2000 characters, so if the last character doesn’t look like a valid terminator we refuse to try. This avoids confusing EXPLAIN errors from partial statements.
Reuses Core::QueryRunner::Rejected for validation failures so callers can rescue one error type for both runners.
Defined Under Namespace
Classes: Truncated
Instance Method Summary collapse
- #explain(sql, skip_validation: false) ⇒ Object
-
#initialize(connection, config) ⇒ QueryExplainer
constructor
A new instance of QueryExplainer.
Constructor Details
#initialize(connection, config) ⇒ QueryExplainer
Returns a new instance of QueryExplainer.
20 21 22 23 |
# File 'lib/sql_genius/core/query_explainer.rb', line 20 def initialize(connection, config) @connection = connection @config = config end |
Instance Method Details
#explain(sql, skip_validation: false) ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/sql_genius/core/query_explainer.rb', line 25 def explain(sql, skip_validation: false) unless skip_validation error = SqlValidator.validate( sql, blocked_tables: @config.blocked_tables, connection: @connection, ) raise QueryRunner::Rejected, error if error end clean_sql = normalize_placeholders(SqlValidator.normalize_identifier_quotes(sql, @connection).gsub(/;\s*\z/, "")) unless looks_complete?(clean_sql) raise Truncated, "This query appears to be truncated and cannot be explained." end @connection.exec_query("EXPLAIN #{clean_sql}") end |