def test_is_select_query(self): self.assertTrue(is_select_query('SELECT * FROM foo')) self.assertTrue(is_select_query('select * from foo')) self.assertTrue(is_select_query('SELECT * FROM foo;')) self.assertTrue(is_select_query(' SELECT * FROM foo;')) self.assertFalse(is_select_query('BEGIN')) self.assertFalse(is_select_query('COMMIT')) self.assertFalse(is_select_query('/* SELECT */ COMMIT')) self.assertFalse(is_select_query('TRUNCATE foo;')) self.assertFalse(is_select_query('UPDATE foo SET bar=42 WHERE id=1'))
def check_high_offset_selects(_, queries): """ :type _ indexdigest.database.Database :type queries list[str] :rtype: list[LinterEntry] """ for query in queries: # ignore insert queries (#140) if not is_select_query(query): continue res = get_query_limit_and_offset(query) if res is None: continue (limit, offset) = res if offset < OFFSET_THRESHOLD: continue table_name = get_query_tables(query)[0] context = OrderedDict() context['query'] = query context['limit'] = limit context['offset'] = offset yield LinterEntry(linter_type='high_offset_selects', table_name=table_name, message='"{}" query uses too high offset impacting the performance'. format(shorten_query(query)), context=context)
def is_wildcard_query(query): """ Checks if provided query selects using a * wildcard :type query str :rtype bool """ if not is_select_query(query): return False query = preprocess_query(query) tokens = get_query_tokens(query) last_token = None for token in tokens: if token.ttype is Wildcard: # print([query, token, 'last token', last_token]) # check what was before the wildcard # count(*) ? if last_token and str(last_token) not in ['(']: return True else: last_token = token return False
def query_has_having_clause(query): """ Checks if provided query uses HAVING clause :type query str :rtype bool """ if not is_select_query(query): return False query = preprocess_query(query) tokens = get_query_tokens(query) for token in tokens: if token.ttype is Keyword and str(token).upper() == 'HAVING': return True return False