def parse_bql_phrases(scanner): semantics = BQLSemantics() parser = grammar.Parser(semantics) while not semantics.failed: token = scanner.read() semantics.context.append(token) if token[0] == -1: # error semantics.syntax_error(token) else: if token[0] == 0: # EOF # Implicit ; at EOF. parser.feed((grammar.T_SEMI, '')) parser.feed(token) if semantics.phrase is not None: phrase = semantics.phrase semantics.phrase = None if 0 < len(semantics.errors): # Keep parsing in order to detect more errors, but # don't yield any broken phrases in case the caller # will try to process them before we finish parsing # the whole thing. continue if 0 < scanner.n_numpar: n_numpar = scanner.n_numpar nampar_map = scanner.nampar_map yield ast.Parametrized(phrase, n_numpar, nampar_map) else: yield phrase if token[0] == 0: # EOF break if 0 < len(semantics.errors): raise BQLParseError(semantics.errors) if semantics.failed: raise BQLParseError(['parse failed mysteriously!'])
def test_parametrized(): assert parse_bql_string('select * from t where id = ?;') == \ [ast.Parametrized(ast.Select(ast.SELQUANT_ALL, [ast.SelColAll(None)], [ast.SelTab('t', None)], ast.ExpOp(ast.OP_EQ, ( ast.ExpCol(None, 'id'), ast.ExpNumpar(1), )), None, None, None), 1, {})] assert parse_bql_string('select * from t where id = ?123;') == \ [ast.Parametrized(ast.Select(ast.SELQUANT_ALL, [ast.SelColAll(None)], [ast.SelTab('t', None)], ast.ExpOp(ast.OP_EQ, ( ast.ExpCol(None, 'id'), ast.ExpNumpar(123), )), None, None, None), 123, {})] assert parse_bql_string('select * from t where id = :foo;') == \ [ast.Parametrized(ast.Select(ast.SELQUANT_ALL, [ast.SelColAll(None)], [ast.SelTab('t', None)], ast.ExpOp(ast.OP_EQ, ( ast.ExpCol(None, 'id'), ast.ExpNampar(1, ':foo'), )), None, None, None), 1, {':foo': 1})] assert parse_bql_string('select * from t where a = :foo and b = @foo;') \ == \ [ast.Parametrized(ast.Select(ast.SELQUANT_ALL, [ast.SelColAll(None)], [ast.SelTab('t', None)], ast.ExpOp(ast.OP_BOOLAND, ( ast.ExpOp(ast.OP_EQ, ( ast.ExpCol(None, 'a'), ast.ExpNampar(1, ':foo'), )), ast.ExpOp(ast.OP_EQ, ( ast.ExpCol(None, 'b'), ast.ExpNampar(2, '@foo'), )), )), None, None, None), 2, {':foo': 1, '@foo': 2})] assert parse_bql_string('select * from t where a = $foo and b = ?1;') == \ [ast.Parametrized(ast.Select(ast.SELQUANT_ALL, [ast.SelColAll(None)], [ast.SelTab('t', None)], ast.ExpOp(ast.OP_BOOLAND, ( ast.ExpOp(ast.OP_EQ, ( ast.ExpCol(None, 'a'), ast.ExpNampar(1, '$foo'), )), ast.ExpOp(ast.OP_EQ, ( ast.ExpCol(None, 'b'), ast.ExpNumpar(1), )), )), None, None, None), 1, {'$foo': 1})] assert parse_bql_string('select * from t' + ' where a = ?123 and b = :foo and c = ?124;') == \ [ast.Parametrized(ast.Select(ast.SELQUANT_ALL, [ast.SelColAll(None)], [ast.SelTab('t', None)], ast.ExpOp(ast.OP_BOOLAND, ( ast.ExpOp(ast.OP_BOOLAND, ( ast.ExpOp(ast.OP_EQ, ( ast.ExpCol(None, 'a'), ast.ExpNumpar(123), )), ast.ExpOp(ast.OP_EQ, ( ast.ExpCol(None, 'b'), ast.ExpNampar(124, ':foo'), )), )), ast.ExpOp(ast.OP_EQ, ( ast.ExpCol(None, 'c'), ast.ExpNumpar(124), )), )), None, None, None), 124, {':foo': 124})]