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'), ), )
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'), ), )
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'), ), )
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'), ]
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'), )
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'), )
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, )
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
def test_expr_lshift(): assert parse_expr('a << b') == OpBox( left=NameBox('a'), right=NameBox('b'), op='OP_LSHIFT', )
def test_expr_rshift(): assert parse_expr('a >> b') == OpBox( left=NameBox('a'), right=NameBox('b'), op='OP_RSHIFT', )
def test_expr_neg(): assert parse_expr('-a') == SingleOpBox( value=NameBox('a'), op='OP_SUB', )
def test_expr_not_in(): assert parse_expr('a NOT IN b') == OpBox( left=NameBox('a'), right=NameBox('b'), op='OP_NOT_IN', )
def test_expr_not_like(): assert parse_expr('a NOT LIKE b') == OpBox( left=NameBox('a'), right=NameBox('b'), op='OP_NOT_LIKE', )
def test_expr_func(): assert parse_expr('lower(b)') == FuncBox(name='lower', args=[ NameBox('b'), ])
def test_expr_dotted_name(): assert parse_expr('foo.bar') == NameBox('bar', table_value='foo')
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')), ]
def test_expr_module(): assert parse_expr('a % b') == OpBox( left=NameBox('a'), right=NameBox('b'), op='OP_MOD', )
def test_expr_bitwise_xor(): assert parse_expr('a ^ b') == OpBox( left=NameBox('a'), right=NameBox('b'), op='OP_BITWISE_XOR', )
def test_expr_bitwise_and(): assert parse_expr('a & b') == OpBox( left=NameBox('a'), right=NameBox('b'), op='OP_BITWISE_AND', )
def test_expr_func_with_args(): assert parse_expr('a(b, c)') == FuncBox(name='a', args=[ NameBox('b'), NameBox('c'), ])
def test_expr_typecast(): assert parse_expr('a::INT') == TypeCastBox( value=NameBox('a'), to='int', )
def test_parser_with_named_column_without_as(): assert parse('SELECT a named FROM z').exprs == [ NamedExprBox(name=NameBox('named'), expr=NameBox('a')), ]
def test_expr_name(): assert parse_expr('foo') == NameBox('foo')
def test_expr_absolute_sign(): assert parse_expr('@ a') == SingleOpBox( value=NameBox('a'), op='OP_ABSOLUTE', )
def test_expr_add(): assert parse_expr('a + b') == OpBox( op='OP_ADD', left=NameBox('a'), right=NameBox('b'), )
def test_parser_where(): assert parse('SELECT a FROM z WHERE a = b').where == OpBox( op='OP_EQ', left=NameBox('a'), right=NameBox('b'), )
def test_expr_not(): assert parse_expr('NOT a') == SingleOpBox( value=NameBox('a'), op='OP_NOT', )
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')), ]
def test_expr_bitwise_not(): assert parse_expr('~ a') == SingleOpBox( value=NameBox('a'), op='OP_BITWISE_NOT', )
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)