Class: QueryGuard::Analysis::SubqueryRiskDetector

Inherits:
RiskDetector
  • Object
show all
Defined in:
lib/query_guard/analysis/risk_detectors.rb

Overview

Detects subquery patterns

Constant Summary collapse

SUBQUERY_PATTERN =
/\(SELECT\b/i.freeze

Instance Attribute Summary

Attributes inherited from RiskDetector

#name

Instance Method Summary collapse

Constructor Details

#initialize ⇒ SubqueryRiskDetector

Returns a new instance of SubqueryRiskDetector.



158
159
160
# File 'lib/query_guard/analysis/risk_detectors.rb', line 158

def initialize
  super(:subquery_risk)
end

Instance Method Details

#detect(query, config) ⇒ Object



162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/query_guard/analysis/risk_detectors.rb', line 162

def detect(query, config)
  risks = []
  return risks unless matches_pattern?(query.sql, SUBQUERY_PATTERN)

  # Count subqueries

  subquery_count = query.sql.scan(/\(SELECT\b/i).length
  return risks if subquery_count.zero?

  # Nested subqueries are more risky

  risk_level = subquery_count > 2 ? :high : :medium

  risks << {
    pattern: :nested_subqueries,
    risk_level: risk_level,
    message: "Query contains #{subquery_count} subquery(ies); consider using JOINs or CTE for better performance",
    metadata: {
      subquery_count: subquery_count,
      recommendation: "Replace with JOIN or WITH clause",
      impact: "Multiple table scans"
    }
  }

  risks
end