예제 #1
0
def test_expr_mul_order():
    assert parse_expr('a + b * c') == OpBox(
        op='OP_ADD',
        left=NameBox('a'),
        right=OpBox(
            op='OP_MUL',
            left=NameBox('b'),
            right=NameBox('c'),
        ),
    )
예제 #2
0
def test_expr_compare_order():
    assert parse_expr('a AND b = c') == OpBox(
        op='OP_AND',
        left=NameBox('a'),
        right=OpBox(
            op='OP_EQ',
            left=NameBox('b'),
            right=NameBox('c'),
        ),
    )
예제 #3
0
def test_expr_braces():
    assert parse_expr('a * (b + c)') == OpBox(
        op='OP_MUL',
        left=NameBox('a'),
        right=OpBox(
            op='OP_ADD',
            left=NameBox('b'),
            right=NameBox('c'),
        ),
    )
예제 #4
0
def test_group_by():
    query = parse('SELECT a FROM z GROUP BY foo + bar, foo')
    assert query.group_by == [
        OpBox(
            op='OP_ADD',
            left=NameBox('foo'),
            right=NameBox('bar'),
        ),
        NameBox('foo'),
    ]
예제 #5
0
def test_expr_multi_add_sub():
    assert parse_expr('a + b - c') == OpBox(
        op='OP_SUB',
        left=OpBox(
            op='OP_ADD',
            left=NameBox('a'),
            right=NameBox('b'),
        ),
        right=NameBox('c'),
    )
예제 #6
0
def test_expr_logic_order():
    assert parse_expr('a * b AND c') == OpBox(
        op='OP_AND',
        left=OpBox(
            op='OP_MUL',
            left=NameBox('a'),
            right=NameBox('b'),
        ),
        right=NameBox('c'),
    )
예제 #7
0
def test_parser_simple_query():
    assert parse('SELECT x FROM z') == QueryBox(
        exprs=[
            NamedExprBox(None, NameBox('x')),
        ],
        froms=[NameBox('z')],
        where=None,
        limit=None,
        offset=None,
        group_by=None,
    )
예제 #8
0
def parse_expr(expr: str) -> ExprBox:
    query_box = parse('SELECT %s FROM z' % expr)
    assert len(query_box.exprs) == 1
    assert query_box.froms == [NameBox('z')]
    expr = query_box.exprs[0]
    assert expr.name is None
    return expr.expr
예제 #9
0
def test_expr_lshift():
    assert parse_expr('a << b') == OpBox(
        left=NameBox('a'),
        right=NameBox('b'),
        op='OP_LSHIFT',
    )
예제 #10
0
def test_expr_rshift():
    assert parse_expr('a >> b') == OpBox(
        left=NameBox('a'),
        right=NameBox('b'),
        op='OP_RSHIFT',
    )
예제 #11
0
def test_expr_neg():
    assert parse_expr('-a') == SingleOpBox(
        value=NameBox('a'),
        op='OP_SUB',
    )
예제 #12
0
def test_expr_not_in():
    assert parse_expr('a NOT IN b') == OpBox(
        left=NameBox('a'),
        right=NameBox('b'),
        op='OP_NOT_IN',
    )
예제 #13
0
def test_expr_not_like():
    assert parse_expr('a NOT LIKE b') == OpBox(
        left=NameBox('a'),
        right=NameBox('b'),
        op='OP_NOT_LIKE',
    )
예제 #14
0
def test_expr_func():
    assert parse_expr('lower(b)') == FuncBox(name='lower',
                                             args=[
                                                 NameBox('b'),
                                             ])
예제 #15
0
def test_expr_dotted_name():
    assert parse_expr('foo.bar') == NameBox('bar', table_value='foo')
예제 #16
0
def test_parser_with_named_column_with_strings():
    assert parse('SELECT "a-a" AS "named" FROM z').exprs == [
        NamedExprBox(name=NameBox('named'), expr=NameBox('a-a')),
    ]
예제 #17
0
def test_expr_module():
    assert parse_expr('a % b') == OpBox(
        left=NameBox('a'),
        right=NameBox('b'),
        op='OP_MOD',
    )
예제 #18
0
def test_expr_bitwise_xor():
    assert parse_expr('a ^ b') == OpBox(
        left=NameBox('a'),
        right=NameBox('b'),
        op='OP_BITWISE_XOR',
    )
예제 #19
0
def test_expr_bitwise_and():
    assert parse_expr('a & b') == OpBox(
        left=NameBox('a'),
        right=NameBox('b'),
        op='OP_BITWISE_AND',
    )
예제 #20
0
def test_expr_func_with_args():
    assert parse_expr('a(b, c)') == FuncBox(name='a',
                                            args=[
                                                NameBox('b'),
                                                NameBox('c'),
                                            ])
예제 #21
0
def test_expr_typecast():
    assert parse_expr('a::INT') == TypeCastBox(
        value=NameBox('a'),
        to='int',
    )
예제 #22
0
def test_parser_with_named_column_without_as():
    assert parse('SELECT a named FROM z').exprs == [
        NamedExprBox(name=NameBox('named'), expr=NameBox('a')),
    ]
예제 #23
0
def test_expr_name():
    assert parse_expr('foo') == NameBox('foo')
예제 #24
0
def test_expr_absolute_sign():
    assert parse_expr('@ a') == SingleOpBox(
        value=NameBox('a'),
        op='OP_ABSOLUTE',
    )
예제 #25
0
def test_expr_add():
    assert parse_expr('a + b') == OpBox(
        op='OP_ADD',
        left=NameBox('a'),
        right=NameBox('b'),
    )
예제 #26
0
def test_parser_where():
    assert parse('SELECT a FROM z WHERE a = b').where == OpBox(
        op='OP_EQ',
        left=NameBox('a'),
        right=NameBox('b'),
    )
예제 #27
0
def test_expr_not():
    assert parse_expr('NOT a') == SingleOpBox(
        value=NameBox('a'),
        op='OP_NOT',
    )
예제 #28
0
def test_parser_with_many_columns():
    assert parse('SELECT a, b, c FROM z').exprs == [
        NamedExprBox(None, NameBox('a')),
        NamedExprBox(None, NameBox('b')),
        NamedExprBox(None, NameBox('c')),
    ]
예제 #29
0
def test_expr_bitwise_not():
    assert parse_expr('~ a') == SingleOpBox(
        value=NameBox('a'),
        op='OP_BITWISE_NOT',
    )
예제 #30
0
def dotted_name(left: Token, _, right: Token) -> NameBox:
    left_name = unquote_name(left.getstr())
    right_name = unquote_name(right.getstr())
    return NameBox(right_name, table_value=left_name)