From: jazzthief Date: Mon, 30 Jan 2023 10:25:09 +0000 (+0100) Subject: Add column-expression-level implementation of NOT X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=23ab873d4a03f15ba27013011ba3aa8acb59c24c;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Add column-expression-level implementation of NOT --- diff --git a/lib/sqlalchemy/__init__.py b/lib/sqlalchemy/__init__.py index c8e8efdee3..a843b7ae5f 100644 --- a/lib/sqlalchemy/__init__.py +++ b/lib/sqlalchemy/__init__.py @@ -89,6 +89,7 @@ from .sql.expression import between as between from .sql.expression import BinaryExpression as BinaryExpression from .sql.expression import bindparam as bindparam from .sql.expression import BindParameter as BindParameter +from .sql.expression import bitwise_not as bitwise_not from .sql.expression import BooleanClauseList as BooleanClauseList from .sql.expression import CacheKey as CacheKey from .sql.expression import Case as Case diff --git a/lib/sqlalchemy/sql/_elements_constructors.py b/lib/sqlalchemy/sql/_elements_constructors.py index 1d8818a1ff..976bd0bee3 100644 --- a/lib/sqlalchemy/sql/_elements_constructors.py +++ b/lib/sqlalchemy/sql/_elements_constructors.py @@ -1018,6 +1018,12 @@ def distinct(expr: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]: return UnaryExpression._create_distinct(expr) +def bitwise_not(expr: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]: + """Produce a column-expression-level unary ``~`` clause.""" + + return UnaryExpression._create_bitwise_not(expr) + + def extract(field: str, expr: _ColumnExpressionArgument[Any]) -> Extract: """Return a :class:`.Extract` construct. diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index 5538ca4f3a..240970e68a 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -3529,6 +3529,21 @@ class UnaryExpression(ColumnElement[_T]): wraps_column_expression=False, ) + @classmethod + def _create_bitwise_not( + cls, + expr: _ColumnExpressionArgument[_T], + ) -> UnaryExpression[_T]: + col_expr: ColumnElement[_T] = coercions.expect( + roles.ExpressionElementRole, expr + ) + return UnaryExpression( + col_expr, + operator=operators.bitwise_not_op, + type_=col_expr.type, + wraps_column_expression=False, + ) + @property def _order_by_label_element(self) -> Optional[Label[Any]]: if self.modifier in (operators.desc_op, operators.asc_op): diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index 3f5c76a507..7076cd10d2 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -22,6 +22,7 @@ from ._elements_constructors import any_ as any_ from ._elements_constructors import asc as asc from ._elements_constructors import between as between from ._elements_constructors import bindparam as bindparam +from ._elements_constructors import bitwise_not as bitwise_not from ._elements_constructors import case as case from ._elements_constructors import cast as cast from ._elements_constructors import collate as collate