Class: Gitlab::Database::QueryAnalyzers::PreventSetOperatorMismatch::Columns
- Inherits:
-
Object
- Object
- Gitlab::Database::QueryAnalyzers::PreventSetOperatorMismatch::Columns
- Defined in:
- lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch/columns.rb
Overview
Columns refer to table columns produced by queries and parts of queries. If we have ‘SELECT namespaces.id` then `id` is a column. But, we can also have `WHERE namespaces.id > 10` and `id` is also a column.
In static analysis of a SQL query a column source can be ambiguous. Such as in ‘SELECT id FROM users, namespaces. In such cases we assume `id` could come from either `users` or `namespaces`.
Class Method Summary collapse
-
.types(select_stmt) ⇒ Object
Determine the type of each column in the select statement.
Class Method Details
.types(select_stmt) ⇒ Object
Determine the type of each column in the select statement. Returns a Set object containing a Types enum. When an error is found parsing will return immediately.
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch/columns.rb', line 19 def types(select_stmt) # Forward through any errors when the column refers to a part of the SQL query that is known to include # errors. For example, the column may refer to a column from a CTE that was invalid. return Set.new([Type::INVALID]) if References.errors?(select_stmt.all_references) types = Set.new # Resolve the type of reference for each target in the select statement. target_list = select_stmt.node.target_list targets = target_list.map(&:res_target) targets.each do |target| target_type = get_target_type(target, select_stmt) # A NULL target is of the form: # SELECT NULL::namespaces FROM namespaces types += if Targets.null?(target) # Maintain any errors but otherwise ignore this target. target_type & [Type::INVALID] else target_type end end types end |