コード例 #1
0
ファイル: test_utils.py プロジェクト: reedy/index-digest
    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'))
コード例 #2
0
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)
コード例 #3
0
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
コード例 #4
0
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