diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2023-01-28 19:50:25 -0500 |
---|---|---|
committer | Federico Caselli <cfederico87@gmail.com> | 2023-01-30 22:28:53 +0100 |
commit | d23dcbaea2a8e000c5fa2ba443e1b683b3b79fa6 (patch) | |
tree | 6b89a07b8bda5a469bf6c8dde165101315f571ed /lib/sqlalchemy/sql/crud.py | |
parent | b99b0c522ddb94468da27867ddfa1f7e2633c920 (diff) | |
download | sqlalchemy-d23dcbaea2a8e000c5fa2ba443e1b683b3b79fa6.tar.gz |
don't count / gather INSERT bind names inside of a CTE
Fixed regression related to the implementation for the new
"insertmanyvalues" feature where an internal ``TypeError`` would occur in
arrangements where a :func:`_sql.insert` would be referred towards inside
of another :func:`_sql.insert` via a CTE; made additional repairs for this
use case for positional dialects such as asyncpg when using
"insertmanyvalues".
at the core here is a change to positional insertmanyvalues
where we now get exactly the positions for the "manyvalues" within
the larger list, allowing non-"manyvalues" on the left and right
sides at the same time, not assuming anything about how RETURNING
renders etc., since CTEs are in the mix also.
Fixes: #9173
Change-Id: I5ff071fbef0d92a2d6046b9c4e609bb008438afd
Diffstat (limited to 'lib/sqlalchemy/sql/crud.py')
-rw-r--r-- | lib/sqlalchemy/sql/crud.py | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/lib/sqlalchemy/sql/crud.py b/lib/sqlalchemy/sql/crud.py index 5017afa78..04b62d1ff 100644 --- a/lib/sqlalchemy/sql/crud.py +++ b/lib/sqlalchemy/sql/crud.py @@ -150,6 +150,17 @@ def _get_crud_params( compiler.update_prefetch = [] compiler.implicit_returning = [] + visiting_cte = kw.get("visiting_cte", None) + if visiting_cte is not None: + # for insert -> CTE -> insert, don't populate an incoming + # _crud_accumulate_bind_names collection; the INSERT we process here + # will not be inline within the VALUES of the enclosing INSERT as the + # CTE is placed on the outside. See issue #9173 + kw.pop("accumulate_bind_names", None) + assert ( + "accumulate_bind_names" not in kw + ), "Don't know how to handle insert within insert without a CTE" + # getters - these are normally just column.key, # but in the case of mysql multi-table update, the rules for # .key must conditionally take tablename into account |