]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/log
thirdparty/sqlalchemy/sqlalchemy.git
6 days agoMerge "Add JSON type support for Oracle dialect" into main main
Michael Bayer [Fri, 3 Apr 2026 19:19:48 +0000 (19:19 +0000)] 
Merge "Add JSON type support for Oracle dialect" into main

6 days agoAdd JSON type support for Oracle dialect
abdallah elhdad [Tue, 17 Mar 2026 14:33:29 +0000 (10:33 -0400)] 
Add JSON type support for Oracle dialect

Added support for the :class:`_sqltypes.JSON` datatype when using the
Oracle database with the oracledb dialect.  JSON values are serialized and
deserialized using configurable strategies that accommodate Oracle's native
JSON type available as of Oracle 21c.  Pull request courtesy Abdallah
Alhadad.

This fix also includes new dialect-level indicators for JSON support;
some attention given to issue #13213 indicates we can close that issue.

Fixes: #10375
Closes: #13065
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13065
Pull-request-sha: 9a89237f4ff7f4d7fa55de60ee9e616b8e15bbf5

Change-Id: I8cbe35bc632dc9419642ddca8bf4ba9c20c0ae37

6 days agocherry-pick changelog update for 2.0.50
Mike Bayer [Fri, 3 Apr 2026 16:38:35 +0000 (12:38 -0400)] 
cherry-pick changelog update for 2.0.50

6 days agocherry-pick changelog from 2.0.49
Mike Bayer [Fri, 3 Apr 2026 16:38:35 +0000 (12:38 -0400)] 
cherry-pick changelog from 2.0.49

8 days agoupdate for mypy 1.20.0
Mike Bayer [Wed, 1 Apr 2026 18:31:21 +0000 (14:31 -0400)] 
update for mypy 1.20.0

Change-Id: I95f72b8a1818b79d01d26531202199f24fe3b808

8 days agoreally remove cx_oracle from test setup
Mike Bayer [Wed, 1 Apr 2026 19:45:53 +0000 (15:45 -0400)] 
really remove cx_oracle from test setup

in 6282bcef11781b5ded26d48b22b5f we tried to disable cx_oracle
testing bug failed because pyproject was still pulling it in.
really fix this time

Change-Id: If5a46bf1ad9a9ee48e8693cccdc4b8b40cee392d

9 days agoMerge "accommodate subclass mapper in post-loader entity_isa check" into main
Michael Bayer [Tue, 31 Mar 2026 16:24:58 +0000 (16:24 +0000)] 
Merge "accommodate subclass mapper in post-loader entity_isa check" into main

9 days agoCoercion warning feedback for unary distinct outside aggregate function
bekapono [Tue, 24 Mar 2026 01:30:46 +0000 (21:30 -0400)] 
Coercion warning feedback for unary distinct outside aggregate function

A warning is emitted when using the standalone :func:`_.sql.distinct`
function in a :func:`_sql.select` columns list outside of an aggregate
function; this function is not intended as a replacement for the use of
:meth:`.Select.distinct`. Pull request courtesy bekapono.

Fixes: #11526
Closes: #13162
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13162
Pull-request-sha: c6e8be7a49fecb1402dc249c84e7f982c1c34821

Change-Id: Ibbdd64a922c62a7a9ead566590ad854db4066565

11 days agoaccommodate subclass mapper in post-loader entity_isa check
Mike Bayer [Sun, 29 Mar 2026 17:46:39 +0000 (13:46 -0400)] 
accommodate subclass mapper in post-loader entity_isa check

Fixed issue where using chained loader options such as
:func:`_orm.selectinload` after :func:`_orm.joinedload` with
:meth:`_orm.PropComparator.of_type` for a polymorphic relationship would
not properly apply the chained loader option. The loader option is now
correctly applied when using a call such as
``joinedload(A.b.of_type(poly)).selectinload(poly.SubClass.c)`` to eagerly
load related objects.

Fixes: #13209
Change-Id: I2d14838f1b1a9a2b18dc52137910dab0bccf0dd5

11 days agoMerge "fix: Session.get() with with_for_update=False skips identity map" into main
Michael Bayer [Sun, 29 Mar 2026 17:10:10 +0000 (17:10 +0000)] 
Merge "fix: Session.get() with with_for_update=False skips identity map" into main

13 days agoapply _path_with_polymorphic in prepend as well
Mike Bayer [Fri, 27 Mar 2026 18:24:10 +0000 (14:24 -0400)] 
apply _path_with_polymorphic in prepend as well

Fixed issue where using :meth:`_orm.Load.options` to apply a chained loader
option such as :func:`_orm.joinedload` or :func:`_orm.selectinload` with
:meth:`_orm.PropComparator.of_type` for a polymorphic relationship would
not generate the necessary clauses for the polymorphic subclasses. The
polymorphic loading strategy is now correctly propagated when using a call
such as ``joinedload(A.b).options(joinedload(B.c.of_type(poly)))`` to match
the behavior of direct chaining e.g.
``joinedload(A.b).joinedload(B.c.of_type(poly))``.

Fixes: #13202
Change-Id: I7b2ce2dd10a7f8583ff99495b0a65fa1a895ee29

13 days agofix: Session.get() with with_for_update=False skips identity map
joshuaswanson [Fri, 27 Mar 2026 16:41:11 +0000 (12:41 -0400)] 
fix: Session.get() with with_for_update=False skips identity map

Fixes #13176.

`Session.get()` checks `with_for_update is None` to decide whether to look up the identity map. Passing `with_for_update=False` fails this check and always hits the database, even though `ForUpdateArg._from_argument` already treats `False` and `None` identically (both return `None`). Changed to `with_for_update in (None, False)` to match.

Closes: #13199
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13199
Pull-request-sha: c639b8723888947317598df387c5e3e4d87acac4

Change-Id: I0584873f46099afadcdd760c0a267ae4d30528eb

2 weeks agouse getattr for metadata, registry and type_annotation_map
Federico Caselli [Tue, 24 Mar 2026 20:08:03 +0000 (21:08 +0100)] 
use getattr for metadata, registry and type_annotation_map

The ``metadata``, ``type_annotation_map``, or ``registry`` can now be
set up in a declarative base also via a mixin class, not only by
directly setting them on the subclass like before.
The declarative class setup now uses ``getattr()`` to look for these
attributes, instead of relying only on the class ``__dict__``.

Fixes: #13198
Change-Id: I032f0064aefb36e5c5a2f1186d7edd30d2863047

2 weeks agoMerge "detect and accommodate reverse condition for loader strategy" into main
Michael Bayer [Mon, 23 Mar 2026 21:21:49 +0000 (21:21 +0000)] 
Merge "detect and accommodate reverse condition for loader strategy" into main

2 weeks agolink insert.value to data insert tutorial
Federico Caselli [Mon, 23 Mar 2026 20:59:23 +0000 (21:59 +0100)] 
link insert.value to data insert tutorial

Change-Id: I892fd7357f88c0e8d16e8e6fb74f18f4541ff795

2 weeks agodetect and accommodate reverse condition for loader strategy
Mike Bayer [Mon, 23 Mar 2026 18:13:02 +0000 (14:13 -0400)] 
detect and accommodate reverse condition for loader strategy

Fixed issue where chained :func:`_orm.joinedload` options would not be
applied correctly when the final relationship in the chain is declared on a
base mapper and accessed through a subclass mapper in a
:func:`_orm.with_polymorphic` query. The path registry now correctly
computes the natural path when a property declared on a base class is
accessed through a path containing a subclass mapper, ensuring the loader
option can be located during query compilation.

Fixes: #13193
Change-Id: I9ec83a0f184caed2bf6dd087b20c3538d6c23597

2 weeks agoMerge "Add frame exclusion support for window functions" into main
Michael Bayer [Mon, 23 Mar 2026 12:29:36 +0000 (12:29 +0000)] 
Merge "Add frame exclusion support for window functions" into main

2 weeks agoMerge "mssql: fall back to base type for alias types during reflection" into main
Michael Bayer [Fri, 20 Mar 2026 20:37:40 +0000 (20:37 +0000)] 
Merge "mssql: fall back to base type for alias types during reflection" into main

2 weeks agomssql: fall back to base type for alias types during reflection
Carlos Serrano [Wed, 18 Mar 2026 15:37:08 +0000 (11:37 -0400)] 
mssql: fall back to base type for alias types during reflection

Fixed regression from version 2.0.42 caused by :ticket:`12654` where the
updated column reflection query would receive SQL Server "type alias" names
for special types such as ``sysname``, whereas previously the base name
would be received (e.g. ``nvarchar`` for ``sysname``), leading to warnings
that such types could not be reflected and resulting in :class:`.NullType`,
rather than the expected :class:`.NVARCHAR` for a type like ``sysname``.
The column reflection query now joins ``sys.types`` a second time to look
up the base type when the user type name is not present in
:attr:`.MSDialect.ischema_names`, and both names are checked in
:attr:`.MSDialect.ischema_names` for a match. Pull request courtesy Carlos
Serrano.

Fixes: #13181
Fixes: #13182
Closes: #13178
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13178
Pull-request-sha: be5c3850594665c0154ae215d4f9c322cc5a3f5a

Change-Id: I7fe86b80dfa45b208f7d97003ee5b1df3f07bfe7

2 weeks agoMerge "Remove version warning in SQL Server" into main
Michael Bayer [Fri, 20 Mar 2026 19:24:52 +0000 (19:24 +0000)] 
Merge "Remove version warning in SQL Server" into main

2 weeks agoMerge "Allow escaped quotes in Postgres quoted identifier" into main
Michael Bayer [Fri, 20 Mar 2026 19:23:30 +0000 (19:23 +0000)] 
Merge "Allow escaped quotes in Postgres quoted identifier" into main

3 weeks agoremove cx_oracle from testing
Mike Bayer [Thu, 19 Mar 2026 00:21:20 +0000 (20:21 -0400)] 
remove cx_oracle from testing

cx_oracle is no longer able to build from its .tar.gz form
reliably because it does not include setuptools in its build
dependencies.   It still can be built if pip is given
--no-build-isolation, or if a wheel file is installed rather than
the .tar.gz, but given how quickly cx_oracle has been pushed
aside by oracledb it's not really that important to be testing
it anymore.

Change-Id: I8a4b2cffabe5275a0df88b5a624ecd6379d84d37

3 weeks agoMerge "Add typing overloads to Query.__getitem__ and AppenderQuery.__getitem__" into...
Federico Caselli [Wed, 18 Mar 2026 23:37:29 +0000 (23:37 +0000)] 
Merge "Add typing overloads to Query.__getitem__ and AppenderQuery.__getitem__" into main

3 weeks agoAllow escaped quotes in Postgres quoted identifier
Austin Graham [Wed, 18 Mar 2026 14:57:13 +0000 (10:57 -0400)] 
Allow escaped quotes in Postgres quoted identifier

<!-- Provide a general summary of your proposed changes in the Title field above -->

### Description
Issue: https://github.com/sqlalchemy/sqlalchemy/issues/10902

Hello! This is my first PR here, so please let me know what I may have missed in terms of having a valuable contribution. I was looking through issues to grab an easy first one, and found this. Looks like someone else was going to have a go at it, but never did.

I simply added a small change to the FK regex in for Postgres that allows anything not quotes alongside escaped double quotes. Test is included for the scenario mentioned in the issue. Alongside that, I didn't see a test for general quoted strings, so I added another one that includes spaces and dashes, in my experience common things to be used inside quoted identifiers.

A manual test as well:
DB setup:
```
austin_test_bug=# CREATE TABLE """test_parent_table-quoted""" (id SERIAL PRIMARY KEY, val INTEGER);
CREATE TABLE
austin_test_bug=# CREATE TABLE test_child_table_ref_quoted (id SERIAL, parent INTEGER, CONSTRAINT fk_parent FOREIGN KEY (parent) REFERENCES """test_parent_table-quoted"""(id));
CREATE TABLE
austin_test_bug=# \d+
                                                     List of relations
 Schema |                Name                |   Type   |  Owner   | Persistence | Access method |    Size    | Description
--------+------------------------------------+----------+----------+-------------+---------------+------------+-------------
 public | "test_parent_table-quoted"         | table    | postgres | permanent   | heap          | 0 bytes    |
 public | "test_parent_table-quoted"_id_seq  | sequence | postgres | permanent   |               | 8192 bytes |
 public | test_child_table_ref_quoted        | table    | postgres | permanent   | heap          | 0 bytes    |
 public | test_child_table_ref_quoted_id_seq | sequence | postgres | permanent   |               | 8192 bytes |
(4 rows)

```

And the python:
```
>>> from sqlalchemy import create_engine, inspect
>>> engine = create_engine('postgresql://scott:tiger@localhost:5432/austin_test_bug')
>>> connection = engine.connect()
>>> inspect(connection).get_multi_foreign_keys()
{(None, '"test_parent_table-quoted"'): [], (None, 'test_child_table_ref_quoted'): [{'name': 'fk_parent', 'constrained_columns': ['parent'], 'referred_schema': None, 'referred_table': '"test_parent_table-quoted"', 'referred_columns': ['id'], 'options': {}, 'comment': None}]}
```

### Checklist
<!-- go over following points. check them with an `x` if they do apply, (they turn into clickable checkboxes once the PR is submitted, so no need to do everything at once)

-->

This pull request is:

- [ ] A documentation / typographical / small typing error fix
- Good to go, no issue or tests are needed
- [x] A short code fix
- please include the issue number, and create an issue if none exists, which
  must include a complete example of the issue.  one line code fixes without an
  issue and demonstration will not be accepted.
- Please include: `Fixes: #<issue number>` in the commit message
- please include tests.   one line code fixes without tests will not be accepted.
- [ ] A new feature implementation
- please include the issue number, and create an issue if none exists, which must
  include a complete example of how the feature would look.
- Please include: `Fixes: #<issue number>` in the commit message
- please include tests.

**Have a nice day!**

Fixes: #10902
Closes: #13179
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13179
Pull-request-sha: 8890dc3250a30fc62b8f15cd1da1353b81524c00

Change-Id: I185c2cb062740551ab931368de602054eb5a4acd

3 weeks agoci: add riscv64 wheel builds via QEMU (#13183)
Bruno Verachten [Wed, 18 Mar 2026 19:49:31 +0000 (20:49 +0100)] 
ci: add riscv64 wheel builds via QEMU (#13183)

Signed-off-by: Bruno Verachten <gounthar@gmail.com>
3 weeks agoRemove version warning in SQL Server
Federico Caselli [Wed, 18 Mar 2026 19:45:39 +0000 (20:45 +0100)] 
Remove version warning in SQL Server

Remove warning for SQL Server dialect when a new version is detected.
The warning was originally added more than 15 years ago due to an unexpected
value returned when using an old version of FreeTDS.
The assumption is that since then the issue has been resolved, so make the
SQL Server dialect behave like the other ones that don't have an upper bound
check on the version number.

This effectively reverts 64d92c836ce029e33b57bcabd4ca76944549e022
that was added for #1825

Fixes: #13185
Change-Id: I79c6951b2fbb6da2caefca97dc3e1b9d8f48f0ab

3 weeks agoclarify the Result.closed attribute
Mike Bayer [Wed, 18 Mar 2026 19:30:54 +0000 (15:30 -0400)] 
clarify the Result.closed attribute

document that Result.returns_rows is usually what people
want when they are looking for this.

References: #13184
Change-Id: Ia0b23e7482115bca3f93d20e21e53598aa9d084c

3 weeks agoMerge "ensure function classes are not shadowed" into main
Michael Bayer [Wed, 18 Mar 2026 15:01:24 +0000 (15:01 +0000)] 
Merge "ensure function classes are not shadowed" into main

3 weeks agoMerge "Improve typing story for core from clauses." into main
Federico Caselli [Tue, 17 Mar 2026 15:35:26 +0000 (15:35 +0000)] 
Merge "Improve typing story for core from clauses." into main

3 weeks agoAdd frame exclusion support for window functions
Varun Chawla [Tue, 24 Feb 2026 14:10:50 +0000 (09:10 -0500)] 
Add frame exclusion support for window functions

Add the `exclude` parameter to the `Over` construct and all `.over()`
methods, enabling SQL standard frame exclusion clauses
`EXCLUDE CURRENT ROW`, `EXCLUDE GROUP`, `EXCLUDE TIES`,
`EXCLUDE NO OTHERS` in window functions.
Pull request courtesy of Varun Chawla.

Fixes #11671
Closes: #13117
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13117
Pull-request-sha: 23f9d34dd80c45dff68ecc8c08331acf22b82279

Change-Id: I8efdb06876d5a11a9f5ed9abec2c187c6c9b7e5e

3 weeks agoMerge "Update _NamingSchemaCallable to support Index" into main
Federico Caselli [Mon, 16 Mar 2026 20:20:21 +0000 (20:20 +0000)] 
Merge "Update _NamingSchemaCallable to support Index" into main

3 weeks agoensure function classes are not shadowed
Federico Caselli [Thu, 12 Mar 2026 22:34:27 +0000 (23:34 +0100)] 
ensure function classes are not shadowed

Ensure the _FunctionGenerator method do not shadow the function class
of the same name

Fixed a typing issue where the typed members of :data:`.func` would return
the appropriate class of the same name, however this creates an issue for
typecheckers such as Zuban and pyrefly that assume :pep:`749` style
typechecking even if the file states that it's a :pep:`563` file; they see
the returned name as indicating the method object and not the class object.
These typecheckers are actually following along with an upcoming test
harness that insists on :pep:`749` style name resolution for this case
unconditionally.  Since :pep:`749` is the way of the future regardless,
differently-named type aliases have been added for these return types.

Fixes: #13167
Change-Id: If58a3858001c78ab21b2ed343205dfd9ce868576

4 weeks agoImprove typing story for core from clauses.
Federico Caselli [Thu, 22 Jan 2026 23:04:56 +0000 (00:04 +0100)] 
Improve typing story for core from clauses.

Most :class:`_sql.FromClause` subclasses are not generic on
:class:`.TypedColumns` subclasses, that can be used to type their
:attr:`_sql.FromClause.c` collection.
This applied to :class:`_schema.Table`, :class:`_sql.Join`,
:class:`_sql.Subquery`, :class:`_sql.CTE` and more.

Fixes: #13085
Change-Id: I724aca887a85c4a401df875903eda12125066680

4 weeks agoMerge "allow JSON, JSONB, etc. to be parameterized, type HSTORE" into main
Michael Bayer [Mon, 9 Mar 2026 22:57:59 +0000 (22:57 +0000)] 
Merge "allow JSON, JSONB, etc. to be parameterized, type HSTORE" into main

4 weeks agoUpdate _NamingSchemaCallable to support Index
Martin Baláž [Mon, 9 Mar 2026 17:19:04 +0000 (13:19 -0400)] 
Update _NamingSchemaCallable to support Index

<!-- Provide a general summary of your proposed changes in the Title field above -->

### Description
<!-- Describe your changes in detail -->
According to [the documentation](https://docs.sqlalchemy.org/en/21/core/metadata.html#sqlalchemy.schema.MetaData.params.naming_convention), the values associated with user-defined “token” keys in `naming_convention` should be callables of the form `fn(constraint, table)`, which accepts the constraint/index object and Table. However, the type alias `_NamingSchemaCallable` accepts only constraint in the first argument. I propose to update `_NamingSchemaCallable` to accept also an index.

### Example
```python
import sqlalchemy

def include_0_N_name(
schema_item: sqlalchemy.Index | sqlalchemy.Constraint,
table: sqlalchemy.Table,
) -> str:
tokens = []

for column in schema_item.dialect_options.get('postgresql', {}).get('include', []):
tokens.append("_")
tokens.append(column.name)

return "".join(tokens)

metadata = sqlalchemy.MetaData(
naming_convention={
"include_0_N_name": include_0_N_name,
"ix": "%(table_name)s_%(column_0_N_name)s%(include_0_N_name)s_idx",
"uq": "%(table_name)s_%(column_0_N_name)s%(include_0_N_name)s_key",
"fk": "%(table_name)s_%(column_0_N_name)s%(include_0_N_name)s_fkey",
"pk": "%(table_name)s_pkey",
},
)
```

### Checklist
<!-- go over following points. check them with an `x` if they do apply, (they turn into clickable checkboxes once the PR is submitted, so no need to do everything at once)

-->

This pull request is:

- [x] A documentation / typographical / small typing error fix
- Good to go, no issue or tests are needed
- [ ] A short code fix
- please include the issue number, and create an issue if none exists, which
  must include a complete example of the issue.  one line code fixes without an
  issue and demonstration will not be accepted.
- Please include: `Fixes: #<issue number>` in the commit message
- please include tests.   one line code fixes without tests will not be accepted.
- [ ] A new feature implementation
- please include the issue number, and create an issue if none exists, which must
  include a complete example of how the feature would look.
- Please include: `Fixes: #<issue number>` in the commit message
- please include tests.

Closes: #13161
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13161
Pull-request-sha: cf53bd722932741bceaba1dd16a52ba93ff579cc

Change-Id: I0daf8a6eeb458aaa09f3392e00d98c27dbf8ca3c

4 weeks agodocs: fix RelationshipProperty comparator cross-references (#13155)
Dr Alex Mitre [Fri, 6 Mar 2026 21:57:04 +0000 (15:57 -0600)] 
docs: fix RelationshipProperty comparator cross-references (#13155)

4 weeks agoallow JSON, JSONB, etc. to be parameterized, type HSTORE
Mike Bayer [Wed, 18 Feb 2026 15:12:52 +0000 (10:12 -0500)] 
allow JSON, JSONB, etc. to be parameterized, type HSTORE

Improved typing of :class:`_sqltypes.JSON` as well as dialect specific
variants like :class:`_postgresql.JSON` to include generic capabilities, so
that the types may be parameterized to indicate any specific type of
contents expected, e.g. ``JSONB[list[str]]()``.

Also types HSTORE

Fixes: #13131
Change-Id: Ia089ba4e3cebf6339a5420b2923cd267c4e6891a

4 weeks agoMerge "mssql-python" into main
Michael Bayer [Fri, 6 Mar 2026 19:06:20 +0000 (19:06 +0000)] 
Merge "mssql-python" into main

4 weeks agomssql-python
Mike Bayer [Wed, 17 Sep 2025 19:31:11 +0000 (15:31 -0400)] 
mssql-python

Added support for the ``mssql-python`` driver, Microsoft's official Python
driver for SQL Server.

Fixes: #12869
Change-Id: I9ce0fef1dd1105c20833cc6a46f24ac9580c4b39

4 weeks agoensure DeclarativeBase attributes are documented
Federico Caselli [Thu, 5 Mar 2026 22:54:44 +0000 (23:54 +0100)] 
ensure DeclarativeBase attributes are documented

Change-Id: I89af45911906aa9979b7c34d106fea424236ebb4

5 weeks agoAdd fast_executemany property to asyncadapt aioodbc cursor
Georg Sieber [Wed, 4 Mar 2026 23:24:44 +0000 (18:24 -0500)] 
Add fast_executemany property to asyncadapt aioodbc cursor

Enhanced the ``aioodbc`` dialect to expose the ``fast_executemany``
attribute of the pyodbc cursor.   This allows the ``fast_executemany``
parameter to work with the ``mssql+aioodbc`` dialect.   Pull request
courtesy Georg Sieber.

Fixes: #13152
Closes: #13151
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13151
Pull-request-sha: c25aa581afff6d49af74b3d7b58b9635a23556e9

Change-Id: I6f27600b509f4881769ecca944fc0939e26626e6

5 weeks agoOracle dialect reflection of RAW length
Daniel Sullivan [Tue, 3 Mar 2026 20:50:17 +0000 (15:50 -0500)] 
Oracle dialect reflection of RAW length

Fixed issue in Oracle dialect where the :class:`_oracle.RAW` datatype would
not reflect the length parameter.   Pull request courtesy Daniel Sullivan.

Fixes: #13150
Closes: #13149
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13149
Pull-request-sha: f7488faaf86451dfe53801faa848414c343614b3

Change-Id: I7db0219b6484317de15203b42f9ca5a84fe36bb7

5 weeks agocherry-pick changelog update for 2.0.49
Mike Bayer [Mon, 2 Mar 2026 15:29:08 +0000 (10:29 -0500)] 
cherry-pick changelog update for 2.0.49

5 weeks agocherry-pick changelog from 2.0.48
Mike Bayer [Mon, 2 Mar 2026 15:29:07 +0000 (10:29 -0500)] 
cherry-pick changelog from 2.0.48

5 weeks agofix changelog typo
Mike Bayer [Mon, 2 Mar 2026 14:38:02 +0000 (09:38 -0500)] 
fix changelog typo

Change-Id: I08ffdc1eda8921745e0459ca375e154ac3cf8b9d

5 weeks agomake local mutable copies for cargs / cparams in do_connect
Mike Bayer [Sun, 1 Mar 2026 18:05:21 +0000 (13:05 -0500)] 
make local mutable copies for cargs / cparams in do_connect

Fixed a critical issue in :class:`.Engine` where connections created in
conjunction with the :meth:`.ConnectionEvents.do_connect` event listeners
would receive shared, mutable collections for the connection arguments,
leading to a variety of potential issues including unlimited growth of the
argument list as well as elements within the parameter dictionary being
shared among concurrent connection calls.  In particular this could impact
do_connect routines making use of complex mutable authentication
structures.

Fixes: #13144
Change-Id: I1549dae36e8e7e6cf50fdaf796659b53e7b78234

5 weeks agoAdd typing overloads to Query.__getitem__ and AppenderQuery.__getitem__
medovi40k [Sat, 28 Feb 2026 23:10:17 +0000 (18:10 -0500)] 
Add typing overloads to Query.__getitem__ and AppenderQuery.__getitem__

Fixes #13128

### Description
`Query.__getitem__` and `AppenderQuery.__getitem__` previously returned Union[_T, List[_T]] for all inputs, making the return type inaccurate.
Added `@overload` signatures so that integer index returns _T and slice returns List[_T].

This pull request is:

- [x] A documentation / typographical / small typing error fix
- Good to go, no issue or tests are needed

Closes: #13142
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13142
Pull-request-sha: 9ba1f0145d90b18c997137aeba7fde72dac23a7c

Change-Id: Ib37ab63d3d844491c34cc5ccfc4efc1591a1878c

5 weeks agoadd changelog for b1e299b94a32ed48d0edc0fea59afebb8834b79d
Mike Bayer [Sat, 28 Feb 2026 18:11:22 +0000 (13:11 -0500)] 
add changelog for b1e299b94a32ed48d0edc0fea59afebb8834b79d

Change-Id: I5ea74e42a0495c0aa2b708aa3ba7e161768ba387

5 weeks agoMerge "Omit metadata kw from Enum repr" into main
Michael Bayer [Sat, 28 Feb 2026 18:07:44 +0000 (18:07 +0000)] 
Merge "Omit metadata kw from Enum repr" into main

6 weeks agoMerge branch 'main' of ssh://ssh.gerrit.sqlalchemy.org:29418/sqlalchemy/sqlalchemy
Mike Bayer [Tue, 24 Feb 2026 16:46:37 +0000 (11:46 -0500)] 
Merge branch 'main' of ssh://ssh.gerrit.sqlalchemy.org:29418/sqlalchemy/sqlalchemy

6 weeks agocherry-pick changelog update for 2.0.48
Mike Bayer [Tue, 24 Feb 2026 16:38:55 +0000 (11:38 -0500)] 
cherry-pick changelog update for 2.0.48

6 weeks agocherry-pick changelog from 2.0.47
Mike Bayer [Tue, 24 Feb 2026 16:38:55 +0000 (11:38 -0500)] 
cherry-pick changelog from 2.0.47

6 weeks agoOmit metadata kw from Enum repr
Federico Caselli [Thu, 22 Jan 2026 20:05:15 +0000 (21:05 +0100)] 
Omit metadata kw from Enum repr

Do not render metadata in the repr of enum.

Change-Id: Ic65e9572ff24af8d48e15277cbc824f7c5ce845a
References: #10604

6 weeks agoMerge "allow TypeEngine classes to export their repr() parameters" into main
Michael Bayer [Tue, 24 Feb 2026 16:31:11 +0000 (16:31 +0000)] 
Merge "allow TypeEngine classes to export their repr() parameters" into main

6 weeks agoallow TypeEngine classes to export their repr() parameters
Mike Bayer [Sun, 22 Feb 2026 21:04:48 +0000 (16:04 -0500)] 
allow TypeEngine classes to export their repr() parameters

Added a new :class:`.GenericRepr` class and :meth:`.TypeEngine.repr_struct`
method to provide better control over type representation. The
:class:`.TypeDecorator` class now properly displays its decorated type's
parameters in its ``__repr__()``, allowing introspection tools and
libraries like Alembic to better understand the structure of decorated
types, in particular for complex "schema" types such as :class:`.Enum` and
:class:`.Boolean`. Type classes can override
:meth:`.TypeEngine.repr_struct` to customize their representation
structure, and the returned :class:`.GenericRepr` object allows for
modifications such as changing the displayed class name.

Fixes: #13140
Change-Id: Ie41d249cfea56686b16c895b74ae03721207170b

6 weeks agoFix WeakSequence.__getitem__ catching KeyError instead of IndexError
Kadir Can Ozden [Sat, 21 Feb 2026 11:35:38 +0000 (06:35 -0500)] 
Fix WeakSequence.__getitem__ catching KeyError instead of IndexError

### Description

`WeakSequence.__getitem__` catches `KeyError` but the internal `_storage` is a `list`, which raises `IndexError` for out-of-range access. This means the `except KeyError` handler never executes, and the custom error message is never shown.

### Current behavior

```python
def __getitem__(self, index):
    try:
        obj = self._storage[index]  # _storage is a list
    except KeyError:  # lists don't raise KeyError
        raise IndexError("Index %s out of range" % index)
    else:
        return obj()
```

On an out-of-range index, the raw `IndexError` from list access propagates directly (e.g., `list index out of range`) instead of the intended custom message.

### Fix

Changed `except KeyError` to `except IndexError` so the handler actually catches the exception raised by list indexing.

Closes: #13136
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13136
Pull-request-sha: ceb8f9fe46590ec69686769f6736686789c88986

Change-Id: Ia36c2b9b0f3aec97624bcd2a9e49f43b9ed786d9

6 weeks agoMysql ddl compiler fall back to default index args
Tiansu Yu [Fri, 20 Feb 2026 14:20:40 +0000 (09:20 -0500)] 
Mysql ddl compiler fall back to default index args

Fixed issue where DDL compilation options were registered to the hard-coded
dialect name ``mysql``. This made it awkward for MySQL-derived dialects
like MariaDB, StarRocks, etc. to work with such options when different sets
of options exist for different platforms. Options are now registered under
the actual dialect name, and a fallback was added to help avoid errors when
an option does not exist for that dialect. Pull request courtesy Tiansu Yu.

Fixes: #13134
Closes: #13138
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13138
Pull-request-sha: 1bc953a2a1be97f82cdbbbc0d8961361716190fa

Change-Id: Ifa700a4e34da4d1923e9473dd8f0d2417dcfded4

7 weeks agoMerge "downgrade batches for bindparam() in SET" into main
Michael Bayer [Thu, 19 Feb 2026 17:53:35 +0000 (17:53 +0000)] 
Merge "downgrade batches for bindparam() in SET" into main

7 weeks agoMerge "dry up typing definition in declarative classes" into main
Michael Bayer [Wed, 18 Feb 2026 19:19:48 +0000 (19:19 +0000)] 
Merge "dry up typing definition in declarative classes" into main

7 weeks agodowngrade batches for bindparam() in SET
Mike Bayer [Tue, 17 Feb 2026 20:58:22 +0000 (15:58 -0500)] 
downgrade batches for bindparam() in SET

Fixed issue where :meth:`_postgresql.Insert.on_conflict_do_update`
using parametrized bound parameters in the ``set_`` clause would fail
when used with executemany batching. For dialects that use the
``use_insertmanyvalues_wo_returning`` optimization (psycopg2),
insertmanyvalues is now disabled when there is an ON CONFLICT clause.
For cases with RETURNING, row-at-a-time mode is used when the SET
clause contains parametrized bindparams (bindparams that receive
values from the parameters dict), ensuring each row's parameters are
correctly applied. ON CONFLICT statements using expressions like
``excluded.<column>`` continue to batch normally.

Fixed issue where :meth:`_sqlite.Insert.on_conflict_do_update`
using parametrized bound parameters in the ``set_`` clause would fail
when used with executemany batching. Row-at-a-time mode is now used
for ON CONFLICT statements with RETURNING that contain parametrized
bindparams, ensuring each row's parameters are correctly applied. ON
CONFLICT statements using expressions like ``excluded.<column>``
continue to batch normally.

Fixes: #13130
Change-Id: I0c5a9142401c745d38e58d071c16e53610f9bfea

8 weeks agodry up typing definition in declarative classes
Federico Caselli [Thu, 12 Feb 2026 21:00:47 +0000 (22:00 +0100)] 
dry up typing definition in declarative classes

Change-Id: I1b1360f2519015fc9a4fcc1e523276aacba2af48

8 weeks agoPoolProxiedConnection support context protocol
Federico Caselli [Mon, 9 Feb 2026 21:47:19 +0000 (22:47 +0100)] 
PoolProxiedConnection support context protocol

The connection object returned by :meth:`_engine.Engine.raw_connection`
now supports the context manager protocol, automatically returning the
connection to the pool when exiting the context.

Fixes: #13116
Change-Id: I51eb1fd61b772368f12a787e5f60db153a839e70

8 weeks agodocument thread starvation as a cause of pool exhaustion
Mike Bayer [Mon, 9 Feb 2026 14:26:38 +0000 (09:26 -0500)] 
document thread starvation as a cause of pool exhaustion

Fixes: #7679
Change-Id: I5f2619ac73a5e1f34b9131fe549122998db8a29a

8 weeks agoMerge "PostgreSQL / SQLite / Insert.on_conflict_do_update: respect compile_kwargs...
Michael Bayer [Mon, 9 Feb 2026 01:29:12 +0000 (01:29 +0000)] 
Merge "PostgreSQL / SQLite / Insert.on_conflict_do_update: respect compile_kwargs" into main

8 weeks agoPostgreSQL / SQLite / Insert.on_conflict_do_update: respect compile_kwargs
Loïc Simon [Thu, 5 Feb 2026 19:56:26 +0000 (14:56 -0500)] 
PostgreSQL / SQLite / Insert.on_conflict_do_update: respect compile_kwargs

Fixed issue where :meth:`_postgresql.Insert.on_conflict_do_update`
as well as  :meth:`_sqlite.Insert.on_conflict_do_update`
parameters were not respecting compilation options such as
``literal_binds=True``.

Pull request courtesy Loïc Simon.

Fixes: #13110
Closes: #13111
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13111
Pull-request-sha: 9ca251610b2eb1c5fdda6aeffa6e81dcaef23aaa

Change-Id: Ice21e508210d682098104c78e77bad8d24e6c93f

2 months agoMerge "allow batch with upsert if embed_values_counter is True" into main
Michael Bayer [Fri, 6 Feb 2026 15:06:37 +0000 (15:06 +0000)] 
Merge "allow batch with upsert if embed_values_counter is True" into main

2 months agofix failing test
Mike Bayer [Thu, 5 Feb 2026 16:47:07 +0000 (11:47 -0500)] 
fix failing test

the new addition of c names like "add" "extend" test
needed to be adjusted to target a single dialect

Change-Id: I94ab20314c8bc312135706ecc3d9aaad89b3caf4

2 months agoallow batch with upsert if embed_values_counter is True
Mike Bayer [Wed, 4 Feb 2026 02:07:59 +0000 (21:07 -0500)] 
allow batch with upsert if embed_values_counter is True

Fixed issue in the :ref:`engine_insertmanyvalues` feature where using
PostgreSQL's ``ON CONFLICT`` clause with
:paramref:`_dml.Insert.returning.sort_by_parameter_order` enabled would
generate invalid SQL when the insert used an implicit sentinel (server-side
autoincrement primary key). The generated SQL would incorrectly declare a
sentinel counter column in the ``imp_sen`` table alias without providing
corresponding values in the ``VALUES`` clause, leading to a
``ProgrammingError`` indicating column count mismatch. The fix allows batch
execution mode when ``embed_values_counter`` is active, as the embedded
counter provides the ordering capability needed even with upsert behaviors,
rather than unnecessarily downgrading to row-at-a-time execution.

Fixes: #13107
Change-Id: I382472b2cf2991b520344adea5783584e27425d0

2 months agoMerge "parse ON UPDATE / ON DELETE in any order" into main
Michael Bayer [Wed, 4 Feb 2026 15:35:55 +0000 (15:35 +0000)] 
Merge "parse ON UPDATE / ON DELETE in any order" into main

2 months agoMerge commit 'fe350d0f367c43c96'
Mike Bayer [Wed, 4 Feb 2026 15:29:58 +0000 (10:29 -0500)] 
Merge commit 'fe350d0f367c43c96'

Change-Id: I0dac9cfc9e93b3a8eaf747ec1b43b12aa9d0575d

2 months agoparse ON UPDATE / ON DELETE in any order
Mike Bayer [Tue, 3 Feb 2026 21:11:13 +0000 (16:11 -0500)] 
parse ON UPDATE / ON DELETE in any order

Fixed an issue in the PostgreSQL dialect where foreign key constraint
reflection would incorrectly swap or fail to capture ``onupdate`` and
``ondelete`` values when these clauses appeared in a different order than
expected in the constraint definition. This issue primarily affected
PostgreSQL-compatible databases such as CockroachDB, which may return ``ON
DELETE`` before ``ON UPDATE`` in the constraint definition string. The
reflection logic now correctly parses both clauses regardless of their
ordering.

Fixes: #13105
Change-Id: I1331b433f713632e84ae6a34467806e080b8003e

2 months agoforwards-port cpython issue 141560 for getfullargspec
Mike Bayer [Tue, 3 Feb 2026 13:53:53 +0000 (08:53 -0500)] 
forwards-port cpython issue 141560 for getfullargspec

Fixed issue when using ORM mappings with Python 3.14's :pep:`649` feature
that no longer requires "future annotations", where the ORM's introspection
of the ``__init__`` method of mapped classes would fail if non-present
identifiers in annotations were present.  The vendored ``getfullargspec()``
method has been amended to use ``Format.FORWARDREF`` under Python 3.14 to
prevent resolution of names that aren't present.

Fixes: #13104
References: https://github.com/python/cpython/issues/141560
Change-Id: I6af8026a07131d4a1e28cd7fc2e90509194ae957

2 months agoMerge "Fix mypy error on scalar call with tuple[Any, ...]" into main
Michael Bayer [Fri, 30 Jan 2026 19:09:40 +0000 (19:09 +0000)] 
Merge "Fix mypy error on scalar call with tuple[Any, ...]" into main

2 months agoFix mypy error on scalar call with tuple[Any, ...]
Yurii Karabas [Tue, 27 Jan 2026 01:54:01 +0000 (20:54 -0500)] 
Fix mypy error on scalar call with tuple[Any, ...]

Fixed issue in new :pep:`646` support for result sets where an issue in the
mypy type checker prevented "scalar" methods including
:meth:`.Connection.scalar`, :meth:`.Result.scalar`,
:meth:`_orm.Session.scalar`, as well as async versions of these methods
from applying the correct type to the scalar result value, when the columns
in the originating :func:`_sql.select` were typed as ``Any``.  Pull request
courtesy Yurii Karabas.

Fixes: #13091
Closes: #13092
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13092
Pull-request-sha: c0535dd7691c8b57d87fd5411cb0202866256fd6

Change-Id: Ifbebaf0bcfdda0dd293c3e278a639cd0c71d45cd

2 months agoMerge "split ReadOnlyColumnCollection from writeable methods" into main
Michael Bayer [Fri, 30 Jan 2026 16:53:54 +0000 (16:53 +0000)] 
Merge "split ReadOnlyColumnCollection from writeable methods" into main

2 months agoallow 2 uncleared connections at most
Mike Bayer [Fri, 30 Jan 2026 15:32:52 +0000 (10:32 -0500)] 
allow 2 uncleared connections at most

tests show that if the code is really broken, we have
5 or more connections lingering here, so for less than two
(it's usually one) just clean it out and consider it as GC noise.

To test this better we also open up the windows/mac archs that
were disabled for greenlet

Fixes: #13102
Change-Id: Iccf419e7f345bcae4a388d222ab69fc792a3c1ca

2 months agosplit ReadOnlyColumnCollection from writeable methods
Mike Bayer [Thu, 29 Jan 2026 22:56:30 +0000 (17:56 -0500)] 
split ReadOnlyColumnCollection from writeable methods

The :class:`.ColumnCollection` class hierarchy has been refactored to allow
column names such as ``add``, ``remove``, ``update``, ``extend``, and
``clear`` to be used without conflicts. :class:`.ColumnCollection` is now
an abstract base class, with mutation operations moved to
:class:`.WriteableColumnCollection` and :class:`.DedupeColumnCollection`
subclasses. The :class:`.ReadOnlyColumnCollection` exposed as attributes
such as :attr:`.Table.c` no longer includes mutation methods that raised
:class:`.NotImplementedError`, allowing these common column names to be
accessed naturally, e.g. ``table.c.add``, ``table.c.remove``,
``table.c.update``, etc.

Change-Id: I22da8314fe7c451003e948d774040d86901bbca4

2 months agoAdd external dialects for DynamoDB and MongoDB (#13100)
Peng Ren [Thu, 29 Jan 2026 19:52:43 +0000 (14:52 -0500)] 
Add external dialects for DynamoDB and MongoDB (#13100)

2 months agoimprove wording of a phrase in migration notes
Federico Caselli [Thu, 29 Jan 2026 09:00:35 +0000 (10:00 +0100)] 
improve wording of a phrase in migration notes

2 months agoMerge "Improve migration notes for 2.1" into main
Michael Bayer [Thu, 29 Jan 2026 01:12:51 +0000 (01:12 +0000)] 
Merge "Improve migration notes for 2.1" into main

2 months agoImprove migration notes for 2.1
Federico Caselli [Thu, 22 Jan 2026 21:59:37 +0000 (22:59 +0100)] 
Improve migration notes for 2.1

Added syntax extension and PostgreSQL persisted change in Compute

Change-Id: I17d107cdc707dfd798841d9df0a703a94d201ad7

2 months agoclarify that poolevents should be registered via engines
Mike Bayer [Tue, 27 Jan 2026 18:38:26 +0000 (13:38 -0500)] 
clarify that poolevents should be registered via engines

also clarify the role of engine.dispose()

references: #13097
Change-Id: I495863b58ffd05f4883f51ce2b3dcbd2bb2367b2

2 months agoMerge "ensure links render properly in the docs" into main
Michael Bayer [Sat, 24 Jan 2026 19:21:50 +0000 (19:21 +0000)] 
Merge "ensure links render properly in the docs" into main

2 months agoFix a typo in relationships.rst (#13087)
Imad Saddik [Fri, 23 Jan 2026 22:43:16 +0000 (23:43 +0100)] 
Fix a typo in relationships.rst (#13087)

2 months agoensure links render properly in the docs
Federico Caselli [Thu, 22 Jan 2026 20:56:59 +0000 (21:56 +0100)] 
ensure links render properly in the docs

Change-Id: Ie4d028d45f3c44e07b36a3d4fe16c9663ebe02ba

2 months agofix wheel generation in free-threaded python build
Federico Caselli [Thu, 22 Jan 2026 20:13:28 +0000 (21:13 +0100)] 
fix wheel generation in free-threaded python build

Change-Id: Iebd81d7c6fb15ebe146a3ff20a85c35adc80fe9b

2 months agoremove 12240. rst (note space)
Mike Bayer [Wed, 21 Jan 2026 21:37:03 +0000 (16:37 -0500)] 
remove 12240. rst (note space)

this file got successfully merged into changelog_21 for the 2.1.0b1
release however the file deletion phase missed the file itself,
causing it to render in both 2.1.0b1 and 2.1.0b2 on the site.

Change-Id: I0acf9dcc67694a781ae67a641e9b367706fcbfb3

2 months agoVersion 2.1.0b2 placeholder
Mike Bayer [Wed, 21 Jan 2026 20:57:09 +0000 (15:57 -0500)] 
Version 2.1.0b2 placeholder

2 months ago- 2.1.0b1 rel_2_1_0b1
Mike Bayer [Wed, 21 Jan 2026 19:26:27 +0000 (14:26 -0500)] 
- 2.1.0b1

2 months agoMerge "change float -> Double in the _type_map." into main
Federico Caselli [Wed, 21 Jan 2026 18:35:28 +0000 (18:35 +0000)] 
Merge "change float -> Double in the _type_map." into main

2 months agocherry-pick changelog update for 2.0.47
Mike Bayer [Wed, 21 Jan 2026 18:04:03 +0000 (13:04 -0500)] 
cherry-pick changelog update for 2.0.47

2 months agocherry-pick changelog from 2.0.46
Mike Bayer [Wed, 21 Jan 2026 18:04:02 +0000 (13:04 -0500)] 
cherry-pick changelog from 2.0.46

2 months agoMerge "make qtoken for PostgreSQL _fk_regex_pattern less restrictive" into main
Michael Bayer [Wed, 21 Jan 2026 17:57:47 +0000 (17:57 +0000)] 
Merge "make qtoken for PostgreSQL _fk_regex_pattern less restrictive" into main

2 months agochange float -> Double in the _type_map.
Mike Bayer [Tue, 20 Jan 2026 14:45:25 +0000 (09:45 -0500)] 
change float -> Double in the _type_map.

The :class:`.Double` type is now used when a Python float value is detected
as a literal value to be sent as a bound parameter, rather than the
:class:`.Float` type.  :class:`.Double` has the same implementation as
:class:`.Float`, but when rendered in a CAST, produces ``DOUBLE`` or
``DOUBLE PRECISION`` rather than ``FLOAT``.   The former better matches
Python's ``float`` datatype which uses 8-byte double-precision storage.
Third party dialects which don't support the :class:`.Double` type directly
may need adjustment so that they render an appropriate keyword (e.g.
``FLOAT``) when the :class:`.Double` datatype is encountered.

Fixes: #10300
Change-Id: I6d221ca9206a10c73fefad55f7ab7a6da5c81d6b

2 months agomake qtoken for PostgreSQL _fk_regex_pattern less restrictive
Gord Thompson [Mon, 19 Jan 2026 12:34:28 +0000 (05:34 -0700)] 
make qtoken for PostgreSQL _fk_regex_pattern less restrictive

Improved the foreign key reflection regular expression pattern used by the
PostgreSQL dialect to be more permissive in matching identifier characters,
allowing it to correctly handle unicode characters in table and column
names. This change improves compatibility with PostgreSQL variants such as
CockroachDB that may use different quoting patterns in combination with
unicode characters in their identifiers.  Pull request courtesy Gord
Thompson.

Change-Id: Iaee340879400e01df2f776417e8b1018f1801cfe

2 months agoMerge "Update generic associations examples for strict typing" into main
Michael Bayer [Wed, 21 Jan 2026 01:04:25 +0000 (01:04 +0000)] 
Merge "Update generic associations examples for strict typing" into main

2 months agodocs: fix grammar in reflection documentation 13084/head
Imad Saddik [Tue, 20 Jan 2026 20:52:24 +0000 (21:52 +0100)] 
docs: fix grammar in reflection documentation

2 months agoUpdate generic associations examples for strict typing
Mike Fiedler [Tue, 20 Jan 2026 18:22:46 +0000 (13:22 -0500)] 
Update generic associations examples for strict typing

### Description

Following previous work in #10450 and #12031, add more type hints to the examples.

I added a new test case to exercise these examples in the future as well.

### Checklist

This pull request is:

- [x] A documentation / typographical / small typing error fix
- Good to go, no issue or tests are needed

**Have a nice day!**

Closes: #13082
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13082
Pull-request-sha: 7a2bed3f6d9fe33c621ac2a6ca56364fa5fe7053

Change-Id: Ia143abbc4c8491c2976203d1b99162652b26b417

2 months agoexclude 3.14t + windows arm
Mike Bayer [Sat, 17 Jan 2026 16:48:21 +0000 (11:48 -0500)] 
exclude 3.14t + windows arm

Change-Id: I8bd9c9cd5994f81a5758a99ef11cb0bc2d0d8f90

2 months agodoc fixes
Mike Bayer [Sat, 17 Jan 2026 16:42:24 +0000 (11:42 -0500)] 
doc fixes

Change-Id: Ica5aebe16e139dda8035e84f1966805e50c008b6