Skip to content

Conversation

@pyup-bot
Copy link
Collaborator

Update gevent from 21.1.2 to 25.9.1.

Changelog

25.9.1

===================


Features
--------

- gevent is now tested on PyPy 3.11 v7.3.20. Previously it was tested
with the now end-of-life PyPy 3.10 v7.3.17.



Bugfixes
--------

- Fix a ``TypeError`` in the C extensions when attempting to put items
into a full ``SimpleQueue.``

It is believed this problem started in version 25.4.1. On older
versions, using the environment variable ``PURE_PYTHON`` or
``GEVENT_PURE_PYTHON`` works around
See :issue:`2139`.

25.8.2

===================


Bugfixes
--------

- Make the ``queue`` attribute of ``gevent.queue.Queue`` objects
writable from Python when the C extension is in use. When
monkey-patched, this lets subclasses assign to it from their ``_init``
method. (Prior to 25.8.1 the ``_init`` method simply wasn't called.)
See :issue:`2136`.

25.8.1

===================


Features
--------

- gevent is now tested on the latest available versions of Python:
3.14rc1, 3.13.5, 3.12.11, 3.11.13, and 3.10.18.

We expect to remove support for Python 3.9 soon.



Bugfixes
--------

- Prevent an ``AssertionError`` (from ``AbstractLinkable``, such as
locks, events, etc) from being printed after ``os.fork`` under certain
conditions.

See also :issue:`2058`.
See :issue:`1895`.
- Avoid a rare ``AttributeError`` that could occur during circular
garbage collection.
See :issue:`1961`.
- Update c-ares from 1.33.1 to 1.34.5.

This contains `a bug fix <https://github.com/c-ares/c-ares/pull/974>`_
resolving excess CPU usage for certain platforms.
See :issue:`2084`.
- Fix several possible interpreter crashes when there are race
conditions or programmers don't follow the documented rules and close
open files while they are still in use by other components.

For example, :meth:`selectors.BaseSelector.unregister` says "A file
object shall be unregistered prior to being closed." Failure to do so
is implementation dependent; in gevent, with libev compiled with
debugging enabled, this would crash the process, and with libuv,
an unexpected, uncatchable exception would be raised. Now, more common
failure scenarios are handled gracefully.

This also means that gevent now monkey-patches :func:`os.close` (on
POSIX) to help handle these cases.
See :issue:`2100`.
- Fix some ignored AssertionErrors after forking on older versions of
Python.

See also :issue:`2111`.
See :issue:`2111`.
- Make the classes in ``gevent.queue`` more compatible with classes that
expect to subclass the standard library queue classes.
See :issue:`2114`.
- Provide ``gevent.signal.set_wakeup_fd`` (monkey-patched by default) to
allow waking up on ``SIGCHLD``. Previously, gevent's internal handling
of ``SIGCHLD`` prevented this from working.
See :issue:`2126`.

25.5.1

===================


Features
--------

- Update the bundled libuv to 1.51 from 1.44.2.

Note that this changes the minimum supported versions of various
operating systems. Linux now requires kernel 3.10 and glibc 2.17, up
from 2.6.32 and glibc 2.12; macOS now requires version 11, up from
version 10.15; Windows now requires Windows 10 and Visual Studio 2017,
up from Windows 8 and VS 2015; finally, FreeBSD now requires version
12, up from version 10.

The musl Linux wheels are now built with muslinux_1_2 instead of
musllinux_1_1.
See :issue:`2108`.
- Add support for Cython 3.1 on Windows.

- Add support for Python 3.14b1 and significantly expand the set of
standard library tests we run with monkey-patching.

25.4.2

===================


Features
--------

- Make gevent's ``queue`` classes subscriptable to match the standard library.
See :issue:`2102`.
- Make the c-ares resolver build on Windows.

25.4.1

===================


Features
--------

- Add a new environment variable and configuration setting to control
whether blocking reports are printed by the monitor thread.
See :issue:`2070`.
- Add initial support for Python 3.14a7. Earlier and later versions of
Python 3.14 may or may not work as expected.



Bugfixes
--------

- Fix using gevent's BackdoorServer with Unix sockets.
See :issue:`1769`.
- Monkey-patching the ``queue`` module (done by default in
``patch_all``) now patches ``Queue``, ``PriorityQueue``, and
``LifoQueue``. In addition to the general benefits of making all those
classes cooperative, this is known to solve a non-deterministic
deadlock with ``urllib3``.

In addition, ``Queue`` was renamed to ``SimpleQueue``; previously
``SimpleQueue`` was an alias for the undocumented
``queue._PySimpleQueue``. This makes ``SimpleQueue`` cooperative even
without monkey-patching.

Likewise, ``JoinableQueue`` was renamed to ``Queue``, providing the
``join`` method to all ``Queue`` objects, thus matching the standard
library. The old name remains for backwards compatibility.
See :issue:`1957`.

.. caution::
  Only the documented, tested (by the standard library), attributes are identical between
  the standard library and gevent ``Queue`` implementations.
  Internal implementation details are very different, and using
  undocumented, untested details such as the internal ``Condition``
  object ``all_tasks_done`` instead of the documented, tested
  ``join`` method will fail with this change.

  If you have code that relies on undocumented implementation
  details that cannot bo ported to the documented interface, please
  file an issue.


- Do not assume that ``threading.get_native_id`` exists. This improves
support for untested platforms.
See :issue:`2053`.
- Do not use pywsgi in a security-conscious environment.

Fix one security issue related to HTTP 100 Continue handling.
See :issue:`2075`.

24.11.1

====================


Bugfixes
--------

- Remove some legacy code that supported Python 2 for compatibility with
the upcoming releases of Cython 3.1.

Also, the ``PeriodicMonitorThreadStartedEvent`` now properly
implements the ``IPeriodicMonitorThreadStartedEvent`` interface.
The ``EventLoopBlocked`` event includes the hub which was blocked,
and it is notified before the report is printed so that event
listeners can modify the report.
See :issue:`2076`.

24.10.3

====================


Bugfixes
--------

- Fix clearing stack frames on Python 3.13. This is invoked when you
fork after having used the thread pool.
See :issue:`2067`.
- Distribute manylinux2014 wheels for x86_64.
See :issue:`2068`.
- Stop switching to the hub in the after fork hook in a child process. This could lead to strange behaviour, and is different than what all other versions of Python do.

24.10.2

====================


Bugfixes
--------

- Workaround a Cython bug compiling on GCC14.
See :issue:`2049`.

24.10.1

====================


Features
--------

- Update the bundled c-ares to 1.33.1.

- Add support for Python 3.13.

- The functions and classes in ``gevent.subprocess`` no longer accept
 ``stdout=STDOUT`` and raise a ``ValueError``.

Several additions and changes to the ``queue`` module, including:

- ``Queue.shutdown`` is available on all versions of Python.
- ``LifoQueue`` is now a joinable queue.

- gevent.monkey changed from a module to a package. The public API
remains the same.

For this release, private APIs (undocumented, marked internal, or
beginning with an underscore) are also preserved. However, these may
be changed or removed at any time in the future. If you are using one
of these APIs and cannot replace it, please contact the gevent team.



Bugfixes
--------

- For platforms that don't have ``socketpair``, upgrade our fallback
code to avoid a security issue.
See :issue:`2048`.


Deprecations and Removals
-------------------------

- Remove support for Python 3.8, which has reached the end of its
support lifecycle.
See :issue:`remove_py38`.

24.2.1

===================


Bugfixes
--------

- Add support for Python patch releases 3.11.8 and 3.12.2, which changed
internal details of threading.

As a result of these changes, note that it is no longer possible to
change the ``__class__`` of a ``gevent.threading._DummyThread``
object on those versions.

See :issue:`2020`.

Other
-----

Other updates for compatibility with the standard library include:

- Errors raised from ``subprocess.Popen`` may not have a filename set.
- ``SSLSocket.recv_into`` and ``SSLSocket.read`` no longer require the
 buffer to implement ``len`` and now work with buffers whose size is
 not 1.
- gh-108310: Fix CVE-2023-40217: Check for & avoid the ssl pre-close
 flaw.

In addition:

- Drop ``setuptools`` to a soft test dependency.
- Drop support for very old versions of CFFI.
- Update bundled c-ares from 1.19.1 to 1.26.0.
- Locks created by gevent, but acquired from multiple different
 threads (not recommended), no longer spin to implement timeouts
 and interruptible blocking. Instead, they use the native
 functionality of the Python 3 lock. This may improve some scenarios.
 See :issue:`2013`.

23.9.1

===================


Bugfixes
--------

- Require greenlet 3.0 on Python 3.11 and Python 3.12; greenlet 3.0 is
recommended for all platforms. This fixes a number of obscure crashes
on all versions of Python, as well as fixing a fairly common problem
on Python 3.11+ that could manifest as either a crash or as a
``SystemError``.
See :issue:`1985`.


----

23.9.0.post1

=========================

- Fix Windows wheel builds.
- Fix macOS wheel builds.

23.9.0

===================


Bugfixes
--------

- Make ``gevent.select.select`` accept arbitrary iterables, not just
sequences. That is, you can now pass in a generator of file
descriptors instead of a realized list. Internally, arbitrary
iterables are copied into lists. This better matches what the standard
library does. Thanks to David Salvisberg.
See :issue:`1979`.
- On Python 3.11 and newer, opt out of Cython's fast exception
manipulation, which *may* be causing problems in certain circumstances
when combined with greenlets.

On all versions of Python, adjust some error handling in the default
C-based loop. This fixes several assertion failures on debug versions
of CPython. Hopefully it has a positive impact under real conditions.
See :issue:`1985`.
- Make ``gevent.pywsgi`` comply more closely with the HTTP specification
for chunked transfer encoding. In particular, we are much stricter
about trailers, and trailers that are invalid (too long or featuring
disallowed characters) forcibly close the connection to the client
*after* the results have been sent.

Trailers otherwise continue to be ignored and are not available to the
WSGI application.

Previously, carefully crafted invalid trailers in chunked requests on
keep-alive connections might appear as two requests to
``gevent.pywsgi``. Because this was handled exactly as a normal
keep-alive connection with two requests, the WSGI application should
handle it normally. However, if you were counting on some upstream
server to filter incoming requests based on paths or header fields,
and the upstream server simply passed trailers through without
validating them, then this embedded second request would bypass those
checks. (If the upstream server validated that the trailers meet the
HTTP specification, this could not occur, because characters that are
required in an HTTP request, like a space, are not allowed in
trailers.) CVE-2023-41419 was reserved for this.

Our thanks to the original reporters, Keran Mu
(mkr22mails.tsinghua.edu.cn) and Jianjun Chen
(jianjuntsinghua.edu.cn), from Tsinghua University and Zhongguancun
Laboratory.
See :issue:`1989`.


----

23.7.0

===================


Features
--------

- Add preliminary support for Python 3.12, using greenlet 3.0a1. This
is somewhat tricky to build from source at this time, and there is
one known issue: On Python 3.12b3, dumping tracebacks of greenlets
is not available.
:issue:`1969`.
- Update the bundled c-ares version to 1.19.1.
See :issue:`1947`.


Bugfixes
--------

- Fix an edge case connecting a non-blocking ``SSLSocket`` that could result
in an AttributeError. In a change to match the standard library,
calling ``sock.connect_ex()`` on a subclass of ``socket`` no longer
calls the subclass's ``connect`` method.

Initial fix by Priyankar Jain.
See :issue:`1932`.
- Make gevent's ``FileObjectThread`` (mostly used on Windows) implement
``readinto`` cooperatively. PR by Kirill Smelkov.
See :issue:`1948`.
- Work around an ``AttributeError`` during cyclic garbage collection
when Python finalizers (``__del__`` and the like) attempt to use
gevent APIs. This is not a recommended practice, and it is unclear if
catching this ``AttributeError`` will fix any problems or just shift
them. (If we could determine the root situation that results in this
cycle, we might be able to solve it.)
See :issue:`1961`.


Deprecations and Removals
-------------------------

- Remove support for obsolete Python versions. This is everything prior
to 3.8.

Related changes include:

- Stop using ``pkg_resources`` to find entry points (plugins).
 Instead, use ``importlib.metadata``.
- Honor ``sys.unraisablehook`` when a callback function produces an
 exception, and handling the exception in the hub *also* produces an
 exception. In older versions, these would be simply printed.
- ``setup.py`` no longer includes the ``setup_requires`` keyword.
 Installation with a tool that understands ``pyproject.toml`` is
 recommended.
- The bundled tblib has been updated to version 2.0.


----

22.10.2

====================


Bugfixes
--------

- Update to greenlet 2.0. This fixes a deallocation issue that required
a change in greenlet's ABI. The design of greenlet 2.0 is intended to
prevent future fixes and enhancements from requiring an ABI change,
making it easier to update gevent and greenlet independently.

.. caution::

  greenlet 2.0 requires a modern-ish C++ compiler. This may mean
  certain older platforms are no longer supported.
  See :issue:`1909`.


----

22.10.1

====================


Features
--------

- Update bundled libuv to 1.44.2.
See :issue:`1913`.


Misc
----

- See :issue:`1898`., See :issue:`1910`., See :issue:`1915`.


----

22.08.0

====================


Features
--------

- Windows: Test and provide binary wheels for PyPy3.7.

Note that there may be issues with subprocesses, signals, and it may
be slow.
See :issue:`1798`.
- Upgrade embedded c-ares to 1.18.1.
See :issue:`1847`.
- Upgrade bundled libuv to 1.42.0 from 1.40.0.
See :issue:`1851`.
- Added preliminary support for Python 3.11 (rc2 and later).

Some platforms may or may not have binary wheels at this time.

.. important:: Support for legacy versions of Python, including 2.7
              and 3.6, will be ending soon. The
              maintenance burden has become too great and the
              maintainer's time is too limited.

              Ideally, there will be a release of gevent compatible
              with a final release of greenlet 2.0 that still
              supports those legacy versions, but that may not be
              possible; this may be the final release to support them.

:class:`gevent.threadpool.ThreadPool` can now optionally expire idle
threads. This is used by default in the implicit thread pool used for
DNS requests and other user-submitted tasks; other uses of a
thread-pool need to opt-in to this.
See :issue:`1867`.


Bugfixes
--------

- Truly disable the effects of compiling with ``-ffast-math``.
See :issue:`1864`.


----

21.12.0

====================


Features
--------

- Update autoconf files for Apple Silicon Macs. Note that while there
are reports of compiling gevent on Apple Silicon Macs now, this is
*not* a tested configuration. There may be some remaining issues with
CFFI on some systems as well.
See :issue:`1721`.
- Build and upload CPython 3.10 binary manylinux wheels.

Unfortunately, this required us to stop building and uploading CPython
2.7 binary manylinux wheels. Binary wheels for 2.7 continue to be
available for Windows and macOS.
See :issue:`1822`.
- Test and distribute musllinux_1_1 wheels.
See :issue:`1837`.
- Update the tested versions of PyPy2 and PyPy3. For PyPy2, there should
be no user visible changes, but for PyPy3, support has moved from
Python 3.6 to Python 3.7.
See :issue:`1843`.


Bugfixes
--------

- Try to avoid linking to two different Python runtime DLLs on Windows.
See :issue:`1814`.
- Stop compiling manylinux wheels with ``-ffast-math.`` This was
implicit in ``-Ofast``, but could alter the global state of the
process. Analysis and fix thanks to Ilya Konstantinov.
See :issue:`1820`.
- Fix hanging the interpreter on shutdown if gevent monkey patching
occurred on a non-main thread in Python 3.9.8 and above. (Note that
this is not a recommended practice.)
See :issue:`1839`.


----

21.8.0

===================


Features
--------

- Update the embedded c-ares from 1.16.1 to 1.17.1.
See :issue:`1758`.
- Add support for Python 3.10rc1 and newer.

As part of this, the minimum required greenlet version was increased
to 1.1.0 (on CPython), and the minimum version of Cython needed to
build gevent from a source checkout is 3.0a9.

Note that the dnspython resolver is not available on Python 3.10.
See :issue:`1790`.
- Update from Cython 3.0a6 to 3.0a9.
See :issue:`1801`.


Misc
----

- See :issue:`1789`.


----
Links

Update sqlalchemy from 2.0.44 to 2.0.44.

Changelog

2.0.44

:released: October 10, 2025

 .. change::
     :tags: bug, sql
     :tickets: 12271

     Improved the implementation of :meth:`.UpdateBase.returning` to use more
     robust logic in setting up the ``.c`` collection of a derived statement
     such as a CTE.  This fixes issues related to RETURNING clauses that feature
     expressions based on returned columns with or without qualifying labels.

 .. change::
     :tags: usecase, asyncio
     :tickets: 12273

     Generalize the terminate logic employed by the asyncpg dialect to reuse
     it in the aiomysql and asyncmy dialect implementation.

 .. change::
     :tags: bug, mssql
     :tickets: 12798

     Improved the base implementation of the asyncio cursor such that it
     includes the option for the underlying driver's cursor to be actively
     closed in those cases where it requires ``await`` in order to complete the
     close sequence, rather than relying on garbage collection to "close" it,
     when a plain :class:`.Result` is returned that does not use ``await`` for
     any of its methods.  The previous approach of relying on gc was fine for
     MySQL and SQLite dialects but has caused problems with the aioodbc
     implementation on top of SQL Server.   The new option is enabled
     for those dialects which have an "awaitable" ``cursor.close()``, which
     includes the aioodbc, aiomysql, and asyncmy dialects (aiosqlite is also
     modified for 2.1 only).

 .. change::
     :tags: bug, ext
     :tickets: 12802

     Fixed issue caused by an unwanted functional change while typing
     the :class:`.MutableList` class.
     This change also reverts all other functional changes done in
     the same change.

 .. change::
     :tags: bug, typing
     :tickets: 12813

     Fixed typing bug where the :meth:`.Session.execute` method advertised that
     it would return a :class:`.CursorResult` if given an insert/update/delete
     statement.  This is not the general case as several flavors of ORM
     insert/update do not actually yield a :class:`.CursorResult` which cannot
     be differentiated at the typing overload level, so the method now yields
     :class:`.Result` in all cases.  For those cases where
     :class:`.CursorResult` is known to be returned and the ``.rowcount``
     attribute is required, please use ``typing.cast()``.

 .. change::
     :tags: usecase, orm
     :tickets: 12829

     The way ORM Annotated Declarative interprets Python :pep:`695` type aliases
     in ``Mapped[]`` annotations has been refined to expand the lookup scheme. A
     :pep:`695` type can now be resolved based on either its direct presence in
     :paramref:`_orm.registry.type_annotation_map` or its immediate resolved
     value, as long as a recursive lookup across multiple :pep:`695` types is
     not required for it to resolve. This change reverses part of the
     restrictions introduced in 2.0.37 as part of :ticket:`11955`, which
     deprecated (and disallowed in 2.1) the ability to resolve any :pep:`695`
     type that was not explicitly present in
     :paramref:`_orm.registry.type_annotation_map`. Recursive lookups of
     :pep:`695` types remains deprecated in 2.0 and disallowed in version 2.1,
     as do implicit lookups of ``NewType`` types without an entry in
     :paramref:`_orm.registry.type_annotation_map`.

     Additionally, new support has been added for generic :pep:`695` aliases that
     refer to :pep:`593` ``Annotated`` constructs containing
     :func:`_orm.mapped_column` configurations. See the sections below for
     examples.

     .. seealso::

         :ref:`orm_declarative_type_map_pep695_types`

         :ref:`orm_declarative_mapped_column_generic_pep593`

 .. change::
     :tags: bug, postgresql
     :tickets: 12847

     Fixed issue where selecting an enum array column containing NULL values
     would fail to parse properly in the PostgreSQL dialect. The
     :func:`._split_enum_values` function now correctly handles NULL entries by
     converting them to Python ``None`` values.

 .. change::
     :tags: bug, typing
     :tickets: 12855

     Added new decorator :func:`_orm.mapped_as_dataclass`, which is a function
     based form of :meth:`_orm.registry.mapped_as_dataclass`; the method form
     :meth:`_orm.registry.mapped_as_dataclass` does not seem to be correctly
     recognized within the scope of :pep:`681` in recent mypy versions.

 .. change::
     :tags: bug, sqlite
     :tickets: 12864

     Fixed issue where SQLite table reflection would fail for tables using
     ``WITHOUT ROWID`` and/or ``STRICT`` table options when the table contained
     generated columns. The regular expression used to parse ``CREATE TABLE``
     statements for generated column detection has been updated to properly
     handle these SQLite table options that appear after the column definitions.
     Pull request courtesy Tip ten Brink.

 .. change::
     :tags: bug, postgresql
     :tickets: 12874

     Fixed issue where the :func:`_sql.any_` and :func:`_sql.all_` aggregation
     operators would not correctly coerce the datatype of the compared value, in
     those cases where the compared value were not a simple int/str etc., such
     as a Python ``Enum`` or other custom value.   This would lead to execution
     time errors for these values.  This issue is essentially the same as
     :ticket:`6515` which was for the now-legacy :meth:`.ARRAY.any` and
     :meth:`.ARRAY.all` methods.

 .. change::
     :tags: bug, engine
     :tickets: 12881

     Implemented initial support for free-threaded Python by adding new tests
     and reworking the test harness to include Python 3.13t and Python 3.14t in
     test runs. Two concurrency issues have been identified and fixed: the first
     involves initialization of the ``.c`` collection on a ``FromClause``, a
     continuation of :ticket:`12302`, where an optional mutex under
     free-threading is added; the second involves synchronization of the pool
     "first_connect" event, which first received thread synchronization in
     :ticket:`2964`, however under free-threading the creation of the mutex
     itself runs under the same free-threading mutex. Support for free-threaded
     wheels on Pypi is implemented as well within the 2.1 series only.  Initial
     pull request and test suite courtesy Lysandros Nikolaou.

 .. change::
     :tags: bug, schema
     :tickets: 12884

     Fixed issue where :meth:`_schema.MetaData.reflect` did not forward
     dialect-specific keyword arguments to the :class:`_engine.Inspector`
     methods, causing options like ``oracle_resolve_synonyms`` to be ignored
     during reflection. The method now ensures that all extra kwargs passed to
     :meth:`_schema.MetaData.reflect` are forwarded to
     :meth:`_engine.Inspector.get_table_names` and related reflection methods.
     Pull request courtesy Lukáš Kožušník.

 .. change::
     :tags: bug, mssql
     :tickets: 12894

     Fixed issue where the index reflection for SQL Server would
     not correctly return the order of the column inside an index
     when the order of the columns in the index did not match the
     order of the columns in the table.
     Pull request courtesy of Allen Chen.

 .. change::
     :tags: bug, orm
     :tickets: 12905

     Fixed a caching issue where :func:`_orm.with_loader_criteria` would
     incorrectly reuse cached bound parameter values when used with
     :class:`_sql.CompoundSelect` constructs such as :func:`_sql.union`. The
     issue was caused by the cache key for compound selects not including the
     execution options that are part of the :class:`_sql.Executable` base class,
     which :func:`_orm.with_loader_criteria` uses to apply its criteria
     dynamically. The fix ensures that compound selects and other executable
     constructs properly include execution options in their cache key traversal.

 .. change::
     :tags: bug, mssql, reflection
     :tickets: 12907

     Fixed issue in the MSSQL dialect's foreign key reflection query where
     duplicate rows could be returned when a foreign key column and its
     referenced primary key column have the same name, and both the referencing
     and referenced tables have indexes with the same name. This resulted in an
     "ForeignKeyConstraint with duplicate source column references are not
     supported" error when attempting to reflect such tables. The query has been
     corrected to exclude indexes on the child table when looking for unique
     indexes referenced by foreign keys.

 .. change::
     :tags: bug, platform

     Unblocked automatic greenlet installation for Python 3.14 now that
     there are greenlet wheels on pypi for python 3.14.

.. changelog::

2.0.43

:released: August 11, 2025

 .. change::
     :tags: usecase, oracle
     :tickets: 12711

     Extended :class:`_oracle.VECTOR` to support sparse vectors. This update
     introduces :class:`_oracle.VectorStorageType` to specify sparse or dense
     storage and added :class:`_oracle.SparseVector`. Pull request courtesy
     Suraj Shaw.

 .. change::
     :tags: bug, orm
     :tickets: 12748

     Fixed issue where using the ``post_update`` feature would apply incorrect
     "pre-fetched" values to the ORM objects after a multi-row UPDATE process
     completed.  These "pre-fetched" values would come from any column that had
     an :paramref:`.Column.onupdate` callable or a version id generator used by
     :paramref:`.orm.Mapper.version_id_generator`; for a version id generator
     that delivered random identifiers like timestamps or UUIDs, this incorrect
     data would lead to a DELETE statement against those same rows to fail in
     the next step.


 .. change::
     :tags: bug, postgresql
     :tickets: 12778

     Fixed regression in PostgreSQL dialect where JSONB subscription syntax
     would generate incorrect SQL for JSONB-returning functions, causing syntax
     errors. The dialect now properly wraps function calls and expressions in
     parentheses when using the ``[]`` subscription syntax, generating
     ``(function_call)[index]`` instead of ``function_call[index]`` to comply
     with PostgreSQL syntax requirements.

 .. change::
     :tags: usecase, engine
     :tickets: 12784

     Added new parameter :paramref:`.create_engine.skip_autocommit_rollback`
     which provides for a per-dialect feature of preventing the DBAPI
     ``.rollback()`` from being called under any circumstances, if the
     connection is detected as being in "autocommit" mode.   This improves upon
     a critical performance issue identified in MySQL dialects where the network
     overhead of the ``.rollback()`` call remains prohibitive even if autocommit
     mode is set.

     .. seealso::

         :ref:`dbapi_autocommit_skip_rollback`

 .. change::
     :tags: bug, orm
     :tickets: 12787

     Fixed issue where :paramref:`_orm.mapped_column.use_existing_column`
     parameter in :func:`_orm.mapped_column` would not work when the
     :func:`_orm.mapped_column` is used inside of an ``Annotated`` type alias in
     polymorphic inheritance scenarios. The parameter is now properly recognized
     and processed during declarative mapping configuration.

 .. change::
     :tags: bug, orm
     :tickets: 12790

     Improved the implementation of the :func:`_orm.selectin_polymorphic`
     inheritance loader strategy to properly render the IN expressions using
     chunks of 500 records each, in the same manner as that of the
     :func:`_orm.selectinload` relationship loader strategy.  Previously, the IN
     expression would be arbitrarily large, leading to failures on databases
     that have limits on the size of IN expressions including Oracle Database.

.. changelog::

2.0.42

:released: July 29, 2025

 .. change::
     :tags: usecase, orm
     :tickets: 10674

     Added ``dataclass_metadata`` argument to all ORM attribute constructors
     that accept dataclasses parameters, e.g. :paramref:`.mapped_column.dataclass_metadata`,
     :paramref:`.relationship.dataclass_metadata`, etc.
     It's passed to the underlying dataclass ``metadata`` attribute
     of the dataclass field. Pull request courtesy Sigmund Lahn.

 .. change::
     :tags: usecase, postgresql
     :tickets: 10927

     Added support for PostgreSQL 14+ :class:`.JSONB` subscripting syntax.
     When connected to PostgreSQL 14 or later, JSONB columns now
     automatically use the native subscript notation ``jsonb_col['key']``
     instead of the arrow operator ``jsonb_col -> 'key'`` for both read and
     write operations. This provides better compatibility with PostgreSQL's
     native JSONB subscripting feature while maintaining backward
     compatibility with older PostgreSQL versions. JSON columns continue to
     use the traditional arrow syntax regardless of PostgreSQL version.

     .. warning::

       **For applications that have indexes against JSONB subscript
       expressions**

       This change caused an unintended side effect for indexes that were
       created against expressions that use subscript notation, e.g.
       ``Index("ix_entity_json_ab_text", data["a"]["b"].astext)``. If these
       indexes were generated with the older syntax e.g. ``((entity.data ->
       'a') ->> 'b')``, they will not be used by the PostgreSQL query
       planner when a query is made using SQLAlchemy 2.0.42 or higher on
       PostgreSQL versions 14 or higher. This occurs because the new text
       will resemble ``(entity.data['a'] ->> 'b')`` which will fail to
       produce the exact textual syntax match required by the PostgreSQL
       query planner.  Therefore, for users upgrading to SQLAlchemy 2.0.42
       or higher, existing indexes that were created against :class:`.JSONB`
       expressions that use subscripting would need to be dropped and
       re-created in order for them to work with the new query syntax, e.g.
       an expression like ``((entity.data -> 'a') ->> 'b')`` would become
       ``(entity.data['a'] ->> 'b')``.

       .. seealso::

             :ticket:`12868` - discussion of this issue

 .. change::
     :tags: bug, orm
     :tickets: 12593

     Implemented the :func:`_orm.defer`, :func:`_orm.undefer` and
     :func:`_orm.load_only` loader options to work for composite attributes, a
     use case that had never been supported previously.

 .. change::
     :tags: bug, postgresql, reflection
     :tickets: 12600

     Fixed regression caused by :ticket:`10665` where the newly modified
     constraint reflection query would fail on older versions of PostgreSQL
     such as version 9.6.  Pull request courtesy Denis Laxalde.

 .. change::
     :tags: bug, mysql
     :tickets: 12648

     Fixed yet another regression caused by by the DEFAULT rendering changes in
     2.0.40 :ticket:`12425`, similar to :ticket:`12488`, this time where using a
     CURRENT_TIMESTAMP function with a fractional seconds portion inside a
     textual default value would also fail to be recognized as a
     non-parenthesized server default.



 .. change::
     :tags: bug, mssql
     :tickets: 12654

     Reworked SQL Server column reflection to be based on the ``sys.columns``
     table rather than ``information_schema.columns`` view.  By correctly using
     the SQL Server ``object_id()`` function as a lead and joining to related
     tables on object_id rather than names, this repairs a variety of issues in
     SQL Server reflection, including:

     * Issue where reflected column comments would not correctly line up
       with the columns themselves in the case that the table had been ALTERed
     * Correctly targets tables with awkward names such as names with brackets,
       when reflecting not just the basic table / columns but also extended
       information including IDENTITY, computed columns, comments which
       did not work previously
     * Correctly targets IDENTITY, computed status from temporary tables
       which did not work previously

 .. change::
     :tags: bug, sql
     :tickets: 12681

     Fixed issue where :func:`.select` of a free-standing scalar expression that
     has a unary operator applied, such as negation, would not apply result
     processors to the selected column even though the correct type remains in
     place for the unary expression.


 .. change::
     :tags: bug, sql
     :tickets: 12692

     Hardening of the compiler's actions for UPDATE statements that access
     multiple tables to report more specifically when tables or aliases are
     referenced in the SET clause; on cases where the backend does not support
     secondary tables in the SET clause, an explicit error is raised, and on the
     MySQL or similar backends that support such a SET clause, more specific
     checking for not-properly-included tables is performed.  Overall the change
     is preventing these erroneous forms of UPDATE statements from being
     compiled, whereas previously it was relied on the database to raise an
     error, which was not always guaranteed to happen, or to be non-ambiguous,
     due to cases where the parent table included the same column name as the
     secondary table column being updated.


 .. change::
     :tags: bug, orm
     :tickets: 12692

     Fixed bug where the ORM would pull in the wrong column into an UPDATE when
     a key name inside of the :meth:`.ValuesBase.values` method could be located
     from an ORM entity mentioned in the statement, but where that ORM entity
     was not the actual table that the statement was inserting or updating.  An
     extra check for this edge case is added to avoid this problem.

 .. change::
     :tags: bug, postgresql
     :tickets: 12728

     Re-raise catched ``CancelledError`` in the terminate method of the
     asyncpg dialect to avoid possible hangs of the code execution.


 .. change::
     :tags: usecase, sql
     :tickets: 12734

     The :func:`_sql.values` construct gains a new method :meth:`_sql.Values.cte`,
     which allows creation of a named, explicit-columns :class:`.CTE` against an
     unnamed ``VALUES`` expression, producing a syntax that allows column-oriented
     selection from a ``VALUES`` construct on modern versions of PostgreSQL, SQLite,
     and MariaDB.

 .. change::
     :tags: bug, reflection, postgresql
     :tickets: 12744

     Fixes bug that would mistakenly interpret a domain or enum type
     with name starting in ``interval`` as an ``INTERVAL`` type while
     reflecting a table.

 .. change::
     :tags: usecase, postgresql
     :tickets: 8664

     Added ``postgresql_ops`` key to the ``dialect_options`` entry in reflected
     dictionary. This maps names of columns used in the index to respective
     operator class, if distinct from the default one for column's data type.
     Pull request courtesy Denis Laxalde.

     .. seealso::

         :ref:`postgresql_operator_classes`

 .. change::
     :tags: engine

     Improved validation of execution parameters passed to the
     :meth:`_engine.Connection.execute` and similar methods to
     provided a better error when tuples are passed in.
     Previously the execution would fail with a difficult to
     understand error message.

.. changelog::

2.0.41

:released: May 14, 2025

 .. change::
     :tags: usecase, postgresql
     :tickets: 10665

     Added support for ``postgresql_include`` keyword argument to
     :class:`_schema.UniqueConstraint` and :class:`_schema.PrimaryKeyConstraint`.
     Pull request courtesy Denis Laxalde.

     .. seealso::

         :ref:`postgresql_constraint_options`

 .. change::
     :tags: usecase, oracle
     :tickets: 12317, 12341

     Added new datatype :class:`_oracle.VECTOR` and accompanying DDL and DQL
     support to fully support this type for Oracle Database. This change
     includes the base :class:`_oracle.VECTOR` type that adds new type-specific
     methods ``l2_distance``, ``cosine_distance``, ``inner_product`` as well as
     new parameters ``oracle_vector`` for the :class:`.Index` construct,
     allowing vector indexes to be configured, and ``oracle_fetch_approximate``
     for the :meth:`.Select.fetch` clause.  Pull request courtesy Suraj Shaw.

     .. seealso::

         :ref:`oracle_vector_datatype`


 .. change::
     :tags: bug, platform
     :tickets: 12405

     Adjusted the test suite as well as the ORM's method of scanning classes for
     annotations to work under current beta releases of Python 3.14 (currently
     3.14.0b1) as part of an ongoing effort to support the production release of
     this Python release.  Further changes to Python's means of working with
     annotations is expected in subsequent beta releases for which SQLAlchemy's
     test suite will need further adjustments.



 .. change::
     :tags: bug, mysql
     :tickets: 12488

     Fixed regression caused by the DEFAULT rendering changes in version 2.0.40
     via :ticket:`12425` where using lowercase ``on update`` in a MySQL server
     default would incorrectly apply parenthesis, leading to errors when MySQL
     interpreted the rendered DDL.  Pull request courtesy Alexander Ruehe.

 .. change::
     :tags: bug, sqlite
     :tickets: 12566

     Fixed and added test support for some SQLite SQL functions hardcoded into
     the compiler, most notably the ``localtimestamp`` function which rendered
     with incorrect internal quoting.

 .. change::
     :tags: bug, engine
     :tickets: 12579

     The error message that is emitted when a URL cannot be parsed no longer
     includes the URL itself within the error message.


 .. change::
     :tags: bug, typing
     :tickets: 12588

     Removed ``__getattr__()`` rule from ``sqlalchemy/__init__.py`` that
     appeared to be trying to correct for a previous typographical error in the
     imports. This rule interferes with type checking and is removed.


 .. change::
     :tags: bug, installation

     Removed the "license classifier" from setup.cfg for SQLAlchemy 2.0, which
     eliminates loud deprecation warnings when building the package.  SQLAlchemy
     2.1 will use a full :pep:`639` configuration in pyproject.toml while
     SQLAlchemy 2.0 remains using ``setup.cfg`` for setup.



.. changelog::

2.0.40

:released: March 27, 2025

 .. change::
     :tags: usecase, postgresql
     :tickets: 11595

     Added support for specifying a list of columns for ``SET NULL`` and ``SET
     DEFAULT`` actions of ``ON DELETE`` clause of foreign key definition on
     PostgreSQL.  Pull request courtesy Denis Laxalde.

     .. seealso::

         :ref:`postgresql_constraint_options`

 .. change::
     :tags: bug, orm
     :tickets: 12329

     Fixed regression which occurred as of 2.0.37 where the checked
     :class:`.ArgumentError` that's raised when an inappropriate type or object
     is used inside of a :class:`.Mapped` annotation would raise ``TypeError``
     with "boolean value of this clause is not defined" if the object resolved
     into a SQL expression in a boolean context, for programs where future
     annotations mode was not enabled.  This case is now handled explicitly and
     a new error message has also been tailored for this case.  In addition, as
     there are at least half a dozen distinct error scenarios for intepretation
     of the :class:`.Mapped` construct, these scenarios have all been unified
     under a new subclass of :class:`.ArgumentError` called
     :class:`.MappedAnnotationError`, to provide some continuity between these
     different scenarios, even though specific messaging remains distinct.

 .. change::
     :tags: bug, mysql
     :tickets: 12332

     Support has been re-added for the MySQL-Connector/Python DBAPI using the
     ``mysql+mysqlconnector://`` URL scheme.   The DBAPI now works against
     modern MySQL versions as well as MariaDB versions (in the latter case it's
     required to pass charset/collation explicitly).   Note however that
     server side cursor support is disabled due to unresolved issues with this
     driver.

 .. change::
     :tags: bug, sql
     :tickets: 12363

     Fixed issue in :class:`.CTE` constructs involving multiple DDL
     :class:`_sql.Insert` statements with multiple VALUES parameter sets where the
     bound parameter names generated for these parameter sets would conflict,
     generating a compile time error.


 .. change::
     :tags: bug, sqlite
     :tickets: 12425

     Expanded the rules for when to apply parenthesis to a server default in DDL
     to suit the general case of a default string that contains non-word
     characters such as spaces or operators and is not a string literal.

 .. change::
     :tags: bug, mysql
     :tickets: 12425

     Fixed issue in MySQL server default reflection where a default that has
     spaces would not be correctly reflected.  Additionally, expanded the rules
     for when to apply parenthesis to a server default in DDL to suit the
     general case of a default string that contains non-word characters such as
     spaces or operators and is not a string literal.


 .. change::
     :tags: usecase, postgresql
     :tickets: 12432

     When building a PostgreSQL ``ARRAY`` literal using
     :class:`_postgresql.array` with an empty ``clauses`` argument, the
     :paramref:`_postgresql.array.type_` parameter is now significant in that it
     will be used to render the resulting ``ARRAY[]`` SQL expression with a
     cast, such as ``ARRAY[]::INTEGER``. Pull request courtesy Denis Laxalde.

 .. change::
     :tags: sql, usecase
     :tickets: 12450

     Implemented support for the GROUPS frame specification in window functions
     by adding :paramref:`_sql.over.groups` option to :func:`_sql.over`
     and :meth:`.FunctionElement.over`. Pull request courtesy Kaan Dikmen.

 .. change::
     :tags: bug, sql
     :tickets: 12451

     Fixed regression caused by :ticket:`7471` leading to a SQL compilation
     issue where name disambiguation for two same-named FROM clauses with table
     aliasing in use at the same time would produce invalid SQL in the FROM
     clause with two "AS" clauses for the aliased table, due to double aliasing.

 .. change::
     :tags: bug, asyncio
     :tickets: 12471

     Fixed issue where :meth:`.AsyncSession.get_transaction` and
     :meth:`.AsyncSession.get_nested_transaction` would fail with
     ``NotImplementedError`` if the "proxy transaction" used by
     :class:`.AsyncSession` were garbage collected and needed regeneration.

 .. change::
     :tags: bug, orm
     :tickets: 12473

     Fixed regression in ORM Annotated Declarative class interpretation caused
     by ``typing_extension==4.13.0`` that introduced a different implementation
     for ``TypeAliasType`` while SQLAlchemy assumed that it would be equivalent
     to the ``typing`` version, leading to pep-695 type annotations not
     resolving to SQL types as expected.

.. changelog::

2.0.39

:released: March 11, 2025

 .. change::
     :tags: bug, postgresql
     :tickets: 11751

     Add SQL typing to reflection query used to retrieve a the structure
     of IDENTITY columns, adding explicit JSON typing to the query to suit
     unusual PostgreSQL driver configurations that don't support JSON natively.

 .. change::
     :tags: bug, postgresql

     Fixed issue affecting PostgreSQL 17.3 and greater where reflection of
     domains with "NOT NULL" as part of their definition would include an
     invalid constraint entry in the data returned by
     :meth:`_postgresql.PGInspector.get_domains` corresponding to an additional
     "NOT NULL" constraint that isn't a CHECK constraint; the existing
     ``"nullable"`` entry in the dictionary already indicates if the domain
     includes a "not null" constraint.   Note that such domains also cannot be
     reflected on PostgreSQL 17.0 through 17.2 due to a bug on the PostgreSQL
     side; if encountering errors in reflection of domains which include NOT
     NULL, upgrade to PostgreSQL server 17.3 or greater.

 .. change::
     :tags: typing, usecase
     :tickets: 11922

     Support generic types for compound selects (:func:`_sql.union`,
     :func:`_sql.union_all`, :meth:`_sql.Select.union`,
     :meth:`_sql.Select.union_all`, etc) returning the type of the first select.
     Pull request courtesy of Mingyu Park.

 .. change::
     :tags: bug, postgresql
     :tickets: 12060

     Fixed issue in PostgreSQL network types :class:`_postgresql.INET`,
     :class:`_postgresql.CIDR`, :class:`_postgresql.MACADDR`,
     :class:`_postgresql.MACADDR8` where sending string values to compare to
     these types would render an explicit CAST to VARCHAR, causing some SQL /
     driver combinations to fail.  Pull request courtesy Denis Laxalde.

 .. change::
     :tags: bug, orm
     :tickets: 12326

     Fixed bug where using DML returning such as :meth:`.Insert.returning` with
     an ORM model that has :func:`_orm.column_property` constructs that contain
     subqueries would fail with an internal error.

 .. change::
     :tags: bug, orm
     :tickets: 12328

     Fixed bug in ORM enabled UPDATE (and theoretically DELETE) where using a
     multi-table DML statement would not allow ORM mapped columns from mappers
     other than the primary UPDATE mapper to be named in the RETURNING clause;
     they would be omitted instead and cause a column not found exception.

 .. change::
     :tags: bug, asyncio
     :tickets: 12338

     Fixed bug where :meth:`_asyncio.AsyncResult.scalar`,
     :meth:`_asyncio.AsyncResult.scalar_one_or_none`, and
     :meth:`_asyncio.AsyncResult.scalar_one` would raise an ``AttributeError``
     due to a missing internal attribute.  Pull request courtesy Allen Ho.

 .. change::
     :tags: bug, orm
     :tickets: 12357

     Fixed issue where the "is ORM" flag of a :func:`.select` or other ORM
     statement would not be propagated to the ORM :class:`.Session` based on a
     multi-part operator expression alone, e.g. such as ``Cls.attr + Cls.attr +
     Cls.attr`` or similar, leading to ORM behaviors not taking place for such
     statements.

 .. change::
     :tags: bug, orm
     :tickets: 12364

     Fixed issue where using :func:`_orm.aliased` around a :class:`.CTE`
     construct could cause inappropriate "duplicate CTE" errors in cases where
     that aliased construct appeared multiple times in a single statement.

 .. change::
     :tags: bug, sqlite
     :tickets: 12368

     Fixed issue that omitted the comma between multiple SQLite table extension
     clauses, currently ``WITH ROWID`` and ``STRICT``, when both options
     :paramref:`.Table.sqlite_with_rowid` and  :paramref:`.Table.sqlite_strict`
     were configured at their non-default settings at the same time.  Pull
     request courtesy david-fed.

 .. change::
     :tags: bug, sql
     :tickets: 12382

     Added new parameters :paramref:`.AddConstraint.isolate_from_table` and
     :paramref:`.DropConstraint.isolate_from_table`, defaulting to True, which
     both document and allow to be controllable the long-standing behavior of
     these two constructs blocking the given constraint from being included
     inline within the "CREATE TABLE" sequence, under the assumption that
     separate add/drop directives were to be used.

 .. change::
     :tags: bug, postgresql
     :tickets: 12417

     Fixed compiler issue in the PostgreSQL dialect where incorrect keywords
     would be passed when using "FOR UPDATE OF" inside of a subquery.

.. changelog::

2.0.38

:released: February 6, 2025

 .. change::
     :tags: postgresql, usecase, asyncio
     :tickets: 12077

     Added an additional ``asyncio.shield()`` call within the connection
     terminate process of the asyncpg driver, to mitigate an issue where
     terminate would be prevented from completing under the anyio concurrency
     library.

 .. change::
     :tags: bug, dml, mariadb, mysql
     :tickets: 12117

     Fixed a bug where the MySQL statement compiler would not properly compile
     statements where :meth:`_mysql.Insert.on_duplicate_key_update` was passed
     values that included ORM-mapped attributes (e.g.
     :class:`InstrumentedAttribute` objects) as keys. Pull request courtesy of
     mingyu.

 .. change::
     :tags: bug, postgresql
     :tickets: 12159

     Adjusted the asyncpg connection wrapper so that the
     ``connection.transaction()`` call sent to asyncpg sends ``None`` for
     ``isolation_level`` if not otherwise set in the SQLAlchemy dialect/wrapper,
     thereby allowing asyncpg to make use of the server level setting for
     ``isolation_level`` in the absense of a client-level setting. Previously,
     this behavior of asyncpg was blocked by a hardcoded ``read_committed``.

 .. change::
     :tags: bug, sqlite, aiosqlite, asyncio, pool
     :tickets: 12285

     Changed default connection pool used by the ``aiosqlite`` dialect
     from :class:`.NullPool` to :class:`.AsyncAdaptedQueuePool`; this change
     should have been made when 2.0 was first released as the ``pysqlite``
     dialect was similarly changed to use :class:`.QueuePool` as detailed
     in :ref:`change_7490`.


 .. change::
     :tags: bug, engine
     :tickets: 12289

     Fixed event-related issue where invoking :meth:`.Engine.execution_options`
     on a :class:`.Engine` multiple times while making use of event-registering
     parameters such as ``isolation_level`` would lead to internal errors
     involving event registration.

 .. change::
     :tags: bug, sql
     :tickets: 12302

     Reorganized the internals by which the ``.c`` collection on a
     :class:`.FromClause` gets generated so that it is resilient against the
     collection being accessed in concurrent fashion.   An example is creating a
     :class:`.Alias` or :class:`.Subquery` and accessing it as a module level
     variable.  This impacts the Oracle dialect which uses such module-level
     global alias objects but is of general use as well.

 .. change::
     :tags: bug, sql
     :tickets: 12314

     Fixed SQL composition bug which impacted caching where using a ``None``
     value inside of an ``in_()`` expression would bypass the usual "expanded
     bind parameter" logic used by the IN construct, which allows proper caching
     to take place.


.. changelog::

2.0.37

:released: January 9, 2025

 .. change::
     :tags: usecase, mariadb
     :tickets: 10720

     Added sql types ``INET4`` and ``INET6`` in the MariaDB dialect.  Pull
     request courtesy Adam Žurek.

 .. change::
     :tags: bug, orm
     :tickets: 11370

     Fixed issue regarding ``Union`` types that would be present in the
     :paramref:`_orm.registry.type_annotation_map` of a :class:`_orm.registry`
     or declarative base class, where a :class:`.Mapped` element that included
     one of the subtypes present in that ``Union`` would be matched to that
     entry, potentially ignoring other entries that matched exactly.   The
     correct behavior now takes place such that an entry should only match in
     :paramref:`_orm.registry.type_annotation_map` exactly, as a ``Union`` type
     is a self-contained type. For example, an attribute with ``Mapped[float]``
     would previously match to a :paramref:`_orm.registry.type_annotation_map`
     entry ``Union[float, Decimal]``; this will no longer match and will now
     only match to an entry that states ``float``. Pull request courtesy Frazer
     McLean.

 .. change::
     :tags: bug, postgresql
     :tickets: 11724

     Fixes issue in :meth:`.Dialect.get_multi_indexes` in the PostgreSQL
     dialect, where an error would be thrown when attempting to use alembic with
     a vector index from the pgvecto.rs extension.

 .. change::
     :tags:  usecase, mysql, mariadb
     :tickets: 11764

     Added support for the ``LIMIT`` clause with ``DELETE`` for the MySQL and
     MariaDB dialects, to complement the already present option for
     ``UPDATE``. The :meth:`.Delete.with_dialect_options` method of the
     :func:`.delete` construct accepts parameters for ``mysql_limit`` and
     ``mariadb_limit``, allowing users to specify a limit on the number of rows
     deleted. Pull request courtesy of Pablo Nicolás Estevez.


 .. change::
     :tags:  bug, mysql, mariadb

     Added logic to ensure that the ``mysql_limit`` and ``mariadb_limit``
     parameters of :meth:`.Update.with_dialect_options` and
     :meth:`.Delete.with_dialect_options` when compiled to string will only
     compile if the parameter is passed as an integer; a ``ValueError`` is
     raised otherwise.

 .. change::
     :tags: bug, orm
     :tickets: 11944

     Fixed bug in how type unions were handled within
     :paramref:`_orm.registry.type_annotation_map` as well as
     :class:`._orm.Mapped` that made the lookup behavior of ``a | b`` different
     from that of ``Union[a, b]``.

 .. change::
     :tags: bug, orm
     :tickets: 11955

     .. note:: this change has been revised in version 2.0.44.  Simple matches
        of ``TypeAliasType`` without a type map entry are no longer deprecated.

     Consistently handle ``TypeAliasType`` (defined in PEP 695) obtained with
     the ``type X = int`` syntax introduced in python 3.12. Now in all cases one
     such alias must be explicitly added to the type map for it to be usable
     inside :class:`.Mapped`. This change also revises the approach added in
     :ticket:`11305`, now requiring the ``TypeAliasType`` to be added to the
     type map. Documentation on how unions and type alias types are handled by
     SQLAlchemy has been added in the
     :ref:`orm_declarative_mapped_column_type_map` section of the documentation.

 .. change::
     :tags: feature, oracle
     :tickets: 12016

     Added new table option ``oracle_tablespace`` to specify the ``TABLESPACE``
     option when creating a table in Oracle. This allows users to define the
     tablespace in which the table should be created. Pull request courtesy of
     Miguel Grillo.

 .. change::
     :tags: orm, bug
     :tickets: 12019

     Fixed regression caused by an internal code change in response to recent
     Mypy releases that caused the very unusual case of a list of ORM-mapped
     attribute expressions passed to :meth:`.ColumnOperators.in_` to no longer
     be accepted.

 .. change::
     :tags: oracle, usecase
     :tickets: 12032

     Use the connection attribute ``max_identifier_length`` available
     in oracledb since version 2.5 when determining the identifier length
     in the Oracle dialect.

 .. change::
     :tags: bug, sql
     :tickets: 12084

     Fixed issue in "lambda SQL" feature where the tracking of bound parameters
     could be corrupted if the same lambda were evaluated across multiple
     compile phases, including when using the same lambda across multiple engine
     instances or with statement caching disabled.


 .. change::
     :tags: usecase, postgresql
     :tickets: 12093

     The :class:`_postgresql.Range` type now supports
     :meth:`_postgresql.Range.__contains__`. Pull request courtesy of Frazer
     McLean.

 .. change::
     :tags: bug, oracle
     :tickets: 12100

     Fixed compilation of ``TABLE`` function when used in a ``FROM`` clause in
     Oracle Database dialect.

 .. change::
     :tags: bug, oracle
     :tickets: 12150

     Fixed issue in oracledb / cx_oracle dialects where output type handlers for
     ``CLOB`` were being routed to ``NVARCHAR`` rather than ``VARCHAR``, causing
     a double conversion to take place.


 .. change::
     :tags: bug, postgresql
     :tickets: 12170

     Fixed issue where creating a table with a primary column of
     :class:`_sql.SmallInteger` and using the asyncpg driver would result in
     the type being compiled to ``SERIAL`` rather than ``SMALLSERIAL``.

 .. change::
     :tags: bug, orm
     :tickets: 12207

     Fixed issues in type handling within the
     :paramref:`_orm.registry.type_annotation_map` feature which prevented the
     use of unions, using either pep-604 or ``Union`` syntaxes under future
     annotations mode, which contained multiple generic types as elements from
     being correctly resolvable.

 .. change::
     :tags: bug, orm
     :tickets: 12216

     Fixed issue in event system which prevented an event listener from being
     attached and detached from multiple class-like objects, namely the
     :class:`.sessionmaker` or :class:`.scoped_session` targets that assign to
     :class:`.Session` subclasses.


 .. change::
     :tags: bug, postgresql
     :tickets: 12220

     Adjusted the asyncpg dialect so that an empty SQL string, which is valid
     for PostgreSQL server, may be successfully processed at the dialect level,
     such as when using :meth:`.Connection.exec_driver_sql`. Pull request
     courtesy Andrew Jackson.


 .. change::
     :tags: usecase, sqlite
     :tickets: 7398

     Added SQLite table option to enable ``STRICT`` tables. Pull request
     courtesy of Guilherme Crocetti.

.. changelog::

2.0.36

:released: October 15, 2024

 .. change::
     :tags: bug, schema
     :tickets: 11317

     Fixed bug where SQL functions passed to
     :paramref:`_schema.Column.server_default` would not be rendered with the
     particular form of parenthesization now required by newer versions of MySQL
     and MariaDB. Pull request courtesy of huuya.

 .. change::
     :tags: bug, orm
     :tickets: 11912

     Fixed bug in ORM bulk update/delete where using RETURNING with bulk
     update/delete in combination with ``populate_existing`` would fail to
     accommodate the ``populate_existing`` option.

 .. change::
     :tags: bug, orm
     :tickets: 11917

     Continuing from :ticket:`11912`, columns marked with
     :paramref:`.mapped_column.onupdate`,
     :paramref:`.mapped_column.server_onupdate`, or :class:`.Computed` are now
     refreshed in ORM instances when running an ORM enabled UPDATE with WHERE
     criteria, even if the statement does not use RETURNING or
     ``populate_existing``.

 .. change::
     :tags: usecase, orm
     :tickets: 11923

     Added new parameter :paramref:`_orm.mapped_column.hash` to ORM constructs
     such as :meth:`_orm.mapped_column`, :meth:`_orm.relationship`, etc.,
     which is interpreted for ORM Native Dataclasses in the same way as other
     dataclass-specific field parameters.

 .. change::
     :tags: bug, postgresql, reflection
     :tickets: 11961

     Fixed bug in reflection of table comments where unrelated text would be
     returned if an entry in the ``pg_description`` table happened to share the
     same oid (objoid) as the table being reflected.

 .. change::
     :tags: bug, orm
     :tickets: 11965

     Fixed regression caused by fixes to joined eager loading in :ticket:`11449`
     released in 2.0.31, where a particular joinedload case could not be
     asserted correctly.   We now have an example of that case so the assertion
     has been repaired to allow for it.


 .. change::
     :tags: orm, bug
     :tickets: 11973

     Improved the error message emitted when trying to map as dataclass a class
     while also manually providing the ``__table__`` attribute.
     This usage is currently not supported.

 .. change::
     :tags: mysql, performance
     :tickets: 11975

     Improved a query used for the MySQL 8 backend when reflecting foreign keys
     to be better optimized.   Previously, for a database that had millions of
     columns across all tables, the

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants