def get_value(self, tok: Token): if tok.ttype == tokens.Name.Placeholder: return self.placeholder_index(tok) elif tok.match(tokens.Keyword, 'NULL'): return None elif tok.match(tokens.Keyword, 'DEFAULT'): return 'DEFAULT' else: raise SQLDecodeError
def _token2op(self, tok: Token, statement: SQLStatement) -> '_Op': op = None kw = {'statement': statement, 'query': self.query} if tok.match(tokens.Keyword, 'AND'): op = AndOp(**kw) elif tok.match(tokens.Keyword, 'OR'): op = OrOp(**kw) elif tok.match(tokens.Keyword, 'IN'): op = InOp(**kw) elif tok.match(tokens.Keyword, 'NOT'): if statement.next_token.match(tokens.Keyword, 'IN'): op = NotInOp(**kw) statement.skip(1) else: op = NotOp(**kw) elif tok.match(tokens.Keyword, 'LIKE'): op = LikeOp(**kw) elif tok.match(tokens.Keyword, 'iLIKE'): op = iLikeOp(**kw) elif tok.match(tokens.Keyword, 'BETWEEN'): op = BetweenOp(**kw) statement.skip(3) elif tok.match(tokens.Keyword, 'IS'): op = IsOp(**kw) elif isinstance(tok, Comparison): op = CmpOp(tok, self.query) elif isinstance(tok, Parenthesis): if (tok[1].match(tokens.Name.Placeholder, '.*', regex=True) or tok[1].match(tokens.Keyword, 'Null') or isinstance(tok[1], IdentifierList) or tok[1].ttype == tokens.DML ): pass else: op = ParenthesisOp(SQLStatement(tok), self.query) elif tok.match(tokens.Punctuation, (')', '(')): pass elif isinstance(tok, Identifier): pass else: raise SQLDecodeError return op
def _token2op(self, tok: Token, statement: SQLStatement) -> '_Op': op = None kw = {'statement': statement, 'query': self.query} if tok.match(tokens.Name.Placeholder, '%(.+)s', regex=True): return op if tok.match(tokens.Keyword, 'AND'): op = AndOp(**kw) elif tok.match(tokens.Keyword, 'OR'): op = OrOp(**kw) elif any( t.match(tokens.Comparison, 'IN') for t in [tok, *getattr(tok, 'tokens', [])]): op = InOp(**kw, token='current_token') elif tok.match(tokens.Keyword, 'NOT'): if statement.next_token.match(tokens.Keyword, 'IN'): op = NotInOp(**kw) statement.skip(1) else: op = NotOp(**kw) elif tok.value.endswith("REGEXP"): op = RegexpOp(**kw) elif isinstance(tok, Comparison) and 'LIKE' in tok.normalized: op = LikeOp(**kw) elif isinstance(tok, Comparison) and 'iLIKE' in tok.normalized: op = iLikeOp(**kw) elif tok.match(tokens.Keyword, 'BETWEEN'): op = BetweenOp(**kw) statement.skip(3) elif tok.match(tokens.Keyword, 'IS'): op = IsOp(**kw) elif tok.value in JSON_OPERATORS: op = JSONOp(**kw) elif isinstance(tok, Comparison): op = CmpOp(tok, self.query) elif isinstance(tok, Parenthesis): if (tok[1].match(tokens.Name.Placeholder, '.*', regex=True) or tok[1].match(tokens.Keyword, 'Null') or isinstance(tok[1], IdentifierList) or tok[1].ttype == tokens.DML): pass else: op = ParenthesisOp(SQLStatement(tok), self.query) elif tok.match(tokens.Punctuation, (')', '(')): pass elif isinstance(tok, Identifier): t = statement.next_token if not t or t.match(tokens.Punctuation, (')', '(')) or t.match(tokens.Keyword, ('AND', 'OR')): op = ColOp(tok, self.query) else: raise SQLDecodeError return op