--- /dev/null
+.. change::
+ :tags: bug, typing
+ :tickets: 9183
+
+ Fixed typing of limit, offset and fetch to allow ``None``.
+
+
from ..sql._typing import _ColumnsClauseArgument
from ..sql._typing import _DMLColumnArgument
from ..sql._typing import _JoinTargetArgument
+ from ..sql._typing import _LimitOffsetType
from ..sql._typing import _MAYBE_ENTITY
from ..sql._typing import _no_kw
from ..sql._typing import _NOT_ENTITY
@_generative
@_assertions(_no_statement_condition)
- def limit(
- self: SelfQuery, limit: Union[int, _ColumnExpressionArgument[int]]
- ) -> SelfQuery:
+ def limit(self: SelfQuery, limit: _LimitOffsetType) -> SelfQuery:
"""Apply a ``LIMIT`` to the query and return the newly resulting
``Query``.
@_generative
@_assertions(_no_statement_condition)
- def offset(
- self: SelfQuery, offset: Union[int, _ColumnExpressionArgument[int]]
- ) -> SelfQuery:
+ def offset(self: SelfQuery, offset: _LimitOffsetType) -> SelfQuery:
"""Apply an ``OFFSET`` to the query and return the newly resulting
``Query``.
_EquivalentColumnMap = Dict["ColumnElement[Any]", Set["ColumnElement[Any]"]]
+_LimitOffsetType = Union[int, _ColumnExpressionArgument[int], None]
+
if TYPE_CHECKING:
def is_sql_compiler(c: Compiled) -> TypeGuard[SQLCompiler]:
from ._typing import _ColumnExpressionOrStrLabelArgument
from ._typing import _FromClauseArgument
from ._typing import _JoinTargetArgument
+ from ._typing import _LimitOffsetType
from ._typing import _MAYBE_ENTITY
from ._typing import _NOT_ENTITY
from ._typing import _OnClauseArgument
def _offset_or_limit_clause(
self,
- element: Union[int, _ColumnExpressionArgument[Any]],
+ element: _LimitOffsetType,
name: Optional[str] = None,
type_: Optional[_TypeEngineArgument[int]] = None,
) -> ColumnElement[Any]:
@_generative
def limit(
- self: SelfGenerativeSelect,
- limit: Union[int, _ColumnExpressionArgument[int]],
+ self: SelfGenerativeSelect, limit: _LimitOffsetType
) -> SelfGenerativeSelect:
"""Return a new selectable with the given LIMIT criterion
applied.
@_generative
def fetch(
self: SelfGenerativeSelect,
- count: Union[int, _ColumnExpressionArgument[int]],
+ count: _LimitOffsetType,
with_ties: bool = False,
percent: bool = False,
) -> SelfGenerativeSelect:
@_generative
def offset(
- self: SelfGenerativeSelect,
- offset: Union[int, _ColumnExpressionArgument[int]],
+ self: SelfGenerativeSelect, offset: _LimitOffsetType
) -> SelfGenerativeSelect:
"""Return a new selectable with the given OFFSET criterion
applied.
from ..util.typing import Protocol
if typing.TYPE_CHECKING:
- from ._typing import _ColumnExpressionArgument
from ._typing import _EquivalentColumnMap
+ from ._typing import _LimitOffsetType
from ._typing import _TypeEngineArgument
from .elements import BinaryExpression
from .elements import TextClause
def _offset_or_limit_clause(
- element: Union[int, _ColumnExpressionArgument[int]],
+ element: _LimitOffsetType,
name: Optional[str] = None,
type_: Optional[_TypeEngineArgument[int]] = None,
) -> ColumnElement[int]:
def _offset_or_limit_clause_asint_if_possible(
- clause: Optional[Union[int, _ColumnExpressionArgument[int]]]
-) -> Optional[Union[int, _ColumnExpressionArgument[int]]]:
+ clause: _LimitOffsetType,
+) -> _LimitOffsetType:
"""Return the offset or limit clause as a simple integer if possible,
else return the clause.
def _make_slice(
- limit_clause: Optional[Union[int, _ColumnExpressionArgument[int]]],
- offset_clause: Optional[Union[int, _ColumnExpressionArgument[int]]],
+ limit_clause: _LimitOffsetType,
+ offset_clause: _LimitOffsetType,
start: int,
stop: int,
) -> Tuple[Optional[ColumnElement[int]], Optional[ColumnElement[int]]]:
# EXPECTED_TYPE: User
reveal_type(uobj1)
+ sess.query(User).limit(None).offset(None).limit(10).offset(10).limit(
+ User.id
+ ).offset(User.id)
+
# more result tests in typed_results.py
def t_select_2() -> None:
- stmt = select(User).filter(User.id == 5)
+ stmt = (
+ select(User)
+ .filter(User.id == 5)
+ .limit(1)
+ .offset(3)
+ .offset(None)
+ .limit(None)
+ .limit(User.id)
+ .offset(User.id)
+ .fetch(1)
+ .fetch(None)
+ .fetch(User.id)
+ )
# EXPECTED_TYPE: Select[Tuple[User]]
reveal_type(stmt)