class ElasticAPM::Sql::Signature
def parse_tokens
rubocop:disable Metrics/CyclomaticComplexity
def parse_tokens t = @tokenizer case t.token when CALL return unless scan_until IDENT "CALL #{t.text}" when DELETE return unless scan_until FROM return unless scan_token IDENT table = scan_dotted_identifier "DELETE FROM #{table}" when INSERT, REPLACE action = t.text return unless scan_until INTO return unless scan_token IDENT table = scan_dotted_identifier "#{action} INTO #{table}" when SELECT level = 0 while t.scan case t.token when LPAREN then level += 1 when RPAREN then level -= 1 when FROM next unless level == 0 break unless scan_token IDENT table = scan_dotted_identifier return "SELECT FROM #{table}" end end when UPDATE # Scan for the table name. Some dialects allow option keywords before # the table name. return 'UPDATE' unless scan_token IDENT table = t.text period = false first_period = false while t.scan case t.token when IDENT if period table += t.text period = false end unless first_period table = t.text end # Two adjacent identifiers found after the first period. Ignore # the secondary ones, in case they are unknown keywords. when PERIOD period = true first_period = true table += '.' else return "UPDATE #{table}" end end end end