mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-08-01 16:04:19 +00:00
Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
@ -2,7 +2,7 @@
|
||||
|
||||
require 'yaml'
|
||||
|
||||
class Database
|
||||
module Database
|
||||
class QueryAnalyzers
|
||||
attr_reader :analyzers
|
||||
|
||||
|
@ -9,3 +9,5 @@ MultiplePartitionScanDetector:
|
||||
# These fingerprints can be found in the auto_explain pipeline artifacts.
|
||||
# Example:
|
||||
# - c2cfe803a497101b
|
||||
JSONBScanDetector:
|
||||
todos:
|
||||
|
@ -3,7 +3,7 @@
|
||||
require 'json'
|
||||
require 'zlib'
|
||||
|
||||
class Database
|
||||
module Database
|
||||
class QueryAnalyzers
|
||||
class Base
|
||||
attr_accessor :output
|
||||
|
46
scripts/database/query_analyzers/jsonb_scan_detector.rb
Normal file
46
scripts/database/query_analyzers/jsonb_scan_detector.rb
Normal file
@ -0,0 +1,46 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'base'
|
||||
|
||||
module Database
|
||||
class QueryAnalyzers
|
||||
class JSONBScanDetector < Database::QueryAnalyzers::Base
|
||||
JSONB_MATCH_OPERATOR_EXPRESSION = /<@|@>/
|
||||
|
||||
def initialize(*args)
|
||||
super
|
||||
output[:bad_queries] = []
|
||||
end
|
||||
|
||||
def analyze(query)
|
||||
super
|
||||
return if config['todos']&.include?(query['fingerprint'])
|
||||
|
||||
output[:bad_queries] << query if has_operator_in_where?(query['query'])
|
||||
end
|
||||
|
||||
def save!
|
||||
return if output[:bad_queries].empty?
|
||||
|
||||
Zlib::GzipWriter.open(output_path("jsonb_column_scans.ndjson")) do |file|
|
||||
output[:bad_queries].each do |query|
|
||||
file.puts(JSON.generate(query))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def has_operator_in_where?(query)
|
||||
return false unless query.match?(JSONB_MATCH_OPERATOR_EXPRESSION)
|
||||
|
||||
clauses = query.split(/\sWHERE\s|\sJOIN\s/)
|
||||
return false if clauses.length < 2
|
||||
|
||||
clauses[1..].each do |c|
|
||||
return true if c.include?('::jsonb')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
@ -2,7 +2,7 @@
|
||||
|
||||
require_relative 'base'
|
||||
|
||||
class Database
|
||||
module Database
|
||||
class QueryAnalyzers
|
||||
class MultiplePartitionScanDetector < Database::QueryAnalyzers::Base
|
||||
def analyze(query)
|
||||
|
Reference in New Issue
Block a user