Class: Gitlab::Database::QueryAnalyzers::PreventSetOperatorMismatch

Inherits:
Base
  • Object
show all
Defined in:
lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch.rb,
lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch/node.rb,
lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch/type.rb,
lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch/froms.rb,
lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch/columns.rb,
lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch/targets.rb,
lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch/references.rb,
lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch/select_stmt.rb,
lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch/common_table_expressions.rb

Defined Under Namespace

Modules: Type Classes: Columns, CommonTableExpressions, Froms, Node, References, SelectStmt, Targets

Constant Summary collapse

SetOperatorStarError =
Class.new(QueryAnalyzerError)
DETECT_REGEX =
/.*SELECT.+\b(UNION|EXCEPT|INTERSECT)\b/i

Constants inherited from Base

Base::QueryAnalyzerError

Class Method Summary collapse

Methods inherited from Base

analyzer_key, begin!, context, context_key, end!, requires_tracking?, suppress=, suppress_key, suppress_schema_issues_for_decomposed_tables, suppressed?, with_suppressed

Class Method Details

.analyze(parsed) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch.rb', line 17

def analyze(parsed)
  return unless requires_detection?(parsed.sql)

  # This analyzer requires the PgQuery parsed query to be present
  return unless parsed.pg

  # Only handle SELECT queries.
  parsed.pg.tree.stmts.each do |stmt|
    select_stmt = next_select_stmt(stmt)
    next unless select_stmt

    types = SelectStmt.new(select_stmt).types

    raise SetOperatorStarError if types.any?(Type::INVALID)
  end
end

.enabled?Boolean

Returns:

  • (Boolean)


12
13
14
15
# File 'lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch.rb', line 12

def enabled?
  ::Feature::FlipperFeature.table_exists? &&
    Feature.enabled?(:query_analyzer_gitlab_schema_metrics, type: :ops)
end