def visit_statement(self, tokens):
    tables = set()
    if self._tables:
      table_tokens = self._GetDescendants(
          tokens, 'table', do_not_cross=('exclude',))
      table_aliases = self._GetTableAliases(tokens)
      for table in table_tokens:
        table_name = str(table[0])
        if table_aliases in table_name:
          table_name = str(table_aliases[table_name]['table'][0])
        tables.add(table_name)
      if not self._tables & tables:
        # No tables in common
        return

    columns = set()
    if self._columns:
      columns = set(str(x[0]).lower() for x in self._GetDescendants(
          tokens, 'column', do_not_cross=('exclude',)))
      if not self._columns & columns:
        # No columns in common
        return

    values = set()
    if self._values:
      values = set(str(x[0]) for x in self._GetDescendants(
          tokens, 'val', do_not_cross=('exclude',)))
      if not self._values & values:
        # No values in common
        return

    operations = set()
    if self._operations:
      for operation in self._operations:
        if self._GetDescendants(tokens, operation):
          operations.add(operation)
      if not operations:
        # No such operations found
        return

    msg = self._msg % {
        'tables': tables,
        'columns': columns,
        'values': values,
        'operations': operations,
    }
    self.AddWarning(tokens, msg)
dataset/ETHPy150Open google/mysql-tools/parser_lib/validator.py/TouchChecker.visit_statement/swapped operands of `in`