in mysqlx-connector-python/lib/mysqlx/expr.py [0:0]
def atomic_expr(self) -> MessageType:
"""Parse an atomic expression and return a protobuf Expr object"""
token = self.next_token()
if token.token_type in [TokenType.EROTEME, TokenType.COLON]:
return self.parse_place_holder(token)
if token.token_type == TokenType.LCURLY:
return self.parse_json_doc()
if token.token_type == TokenType.LSQBRACKET:
return self.parse_json_array()
if token.token_type == TokenType.CAST:
return self.cast()
if token.token_type == TokenType.LPAREN:
expr = self._expr()
self.expect_token(TokenType.RPAREN)
return expr
if token.token_type in [TokenType.PLUS, TokenType.MINUS]:
peek = self.peek_token()
if peek.token_type == TokenType.LNUM:
self.tokens[self.pos].value = token.value + peek.value
return self.atomic_expr()
return build_unary_op(token.value, self.atomic_expr())
if token.token_type in (TokenType.NOT, TokenType.NEG, TokenType.BANG):
return build_unary_op(token.value, self.atomic_expr())
if token.token_type == TokenType.LSTRING:
return build_literal_expr(build_string_scalar(token.value))
if token.token_type == TokenType.NULL:
return build_literal_expr(build_null_scalar())
if token.token_type == TokenType.LNUM:
if "." in token.value:
return build_literal_expr(build_double_scalar(float(token.value)))
return build_literal_expr(build_int_scalar(int(token.value)))
if token.token_type in [TokenType.TRUE, TokenType.FALSE]:
return build_literal_expr(
build_bool_scalar(token.token_type == TokenType.TRUE)
)
if token.token_type == TokenType.DOLLAR:
return self.document_field()
if token.token_type == TokenType.MUL:
return self.star_operator()
if token.token_type == TokenType.IDENT:
self.pos = self.pos - 1 # stay on the identifier
if self.next_token_type_is(TokenType.LPAREN) or (
self.next_token_type_is(TokenType.DOT)
and self.pos_token_type_is(self.pos + 2, TokenType.IDENT)
and self.pos_token_type_is(self.pos + 3, TokenType.LPAREN)
):
# Function call
return self.function_call()
return (
self.document_field()
if not self._allow_relational_columns
else self.column_identifier()
)
raise ValueError(
f"Unknown token type = {token.token_type} when expecting atomic "
f"expression at {self.pos}"
)