
    ,hX                    n   S SK Jr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S	S
K
Jr  S	SK
Jr  S	SKJr  S	SKJr  S	SKJr  S	SKJr  S	SKJr  S	SKJr  S	SKJr  S	SKJr  S	SKJr  S	SKJr  S	SKJr  Sr SS jr! " S S\5      r " S S\5      r"\	\\\4   \\\#\4      \\\4   4   r$g)    )annotations)Any)Dict)List)Mapping)Optional)Tuple)Union   )exc)util)_DMLTableArgument)_exclusive_against)_generative)ColumnCollection)ReadOnlyColumnCollectionInsert)ClauseElement)KeyedColumnElement)alias)NamedFromClause)Self)r   insertr   c                    [        U 5      $ )a   Construct a MySQL/MariaDB-specific variant :class:`_mysql.Insert`
construct.

.. container:: inherited_member

    The :func:`sqlalchemy.dialects.mysql.insert` function creates
    a :class:`sqlalchemy.dialects.mysql.Insert`.  This class is based
    on the dialect-agnostic :class:`_sql.Insert` construct which may
    be constructed using the :func:`_sql.insert` function in
    SQLAlchemy Core.

The :class:`_mysql.Insert` construct includes additional methods
:meth:`_mysql.Insert.on_duplicate_key_update`.

r   )tables    U/var/www/auris/envauris/lib/python3.13/site-packages/sqlalchemy/dialects/mysql/dml.pyr   r   #   s      %=    c                      \ rS rSrSrSrSr\  SS j5       r\	R                  SS j5       r\\" SSS0S	9SS
 j5       5       rSrg)r   6   zMySQL-specific implementation of INSERT.

Adds methods for MySQL-specific syntaxes such as ON DUPLICATE KEY UPDATE.

The :class:`~.mysql.Insert` object is created using the
:func:`sqlalchemy.dialects.mysql.insert` function.

.. versionadded:: 1.2

mysqlFc                .    U R                   R                  $ )a  Provide the "inserted" namespace for an ON DUPLICATE KEY UPDATE
statement

MySQL's ON DUPLICATE KEY UPDATE clause allows reference to the row
that would be inserted, via a special function called ``VALUES()``.
This attribute provides all columns in this row to be referenceable
such that they will render within a ``VALUES()`` function inside the
ON DUPLICATE KEY UPDATE clause.    The attribute is named ``.inserted``
so as not to conflict with the existing
:meth:`_expression.Insert.values` method.

.. tip::  The :attr:`_mysql.Insert.inserted` attribute is an instance
    of :class:`_expression.ColumnCollection`, which provides an
    interface the same as that of the :attr:`_schema.Table.c`
    collection described at :ref:`metadata_tables_and_columns`.
    With this collection, ordinary names are accessible like attributes
    (e.g. ``stmt.inserted.some_column``), but special names and
    dictionary method names should be accessed using indexed access,
    such as ``stmt.inserted["column name"]`` or
    ``stmt.inserted["values"]``.  See the docstring for
    :class:`_expression.ColumnCollection` for further examples.

.. seealso::

    :ref:`mysql_insert_on_duplicate_key_update` - example of how
    to use :attr:`_expression.Insert.inserted`

)inserted_aliascolumnsselfs    r   insertedInsert.insertedE   s    @ ""***r   c                *    [        U R                  SS9$ )Nr'   )name)r   r   r%   s    r   r#   Insert.inserted_aliasg   s    TZZj11r   _post_values_clausezDThis Insert construct already has an ON DUPLICATE KEY clause present)msgsc                    U(       a  U(       a  [         R                  " S5      eU(       a+  [        U5      S:  a  [         R                  " S5      eUS   nOUn[        U R                  U5      U l        U $ )a  
Specifies the ON DUPLICATE KEY UPDATE clause.

:param \**kw:  Column keys linked to UPDATE values.  The
 values may be any SQL expression or supported literal Python
 values.

.. warning:: This dictionary does **not** take into account
   Python-specified default UPDATE values or generation functions,
   e.g. those specified using :paramref:`_schema.Column.onupdate`.
   These values will not be exercised for an ON DUPLICATE KEY UPDATE
   style of UPDATE, unless values are manually specified here.

:param \*args: As an alternative to passing key/value parameters,
 a dictionary or list of 2-tuples can be passed as a single positional
 argument.

 Passing a single dictionary is equivalent to the keyword argument
 form::

    insert().on_duplicate_key_update({"name": "some name"})

 Passing a list of 2-tuples indicates that the parameter assignments
 in the UPDATE clause should be ordered as sent, in a manner similar
 to that described for the :class:`_expression.Update`
 construct overall
 in :ref:`tutorial_parameter_ordered_updates`::

    insert().on_duplicate_key_update(
        [
            ("name", "some name"),
            ("value", "some value"),
        ]
    )

 .. versionchanged:: 1.3 parameters can be specified as a dictionary
    or list of 2-tuples; the latter form provides for parameter
    ordering.


.. versionadded:: 1.2

.. seealso::

    :ref:`mysql_insert_on_duplicate_key_update`

z9Can't pass kwargs and positional arguments simultaneously   zDOnly a single dictionary or list of tuples is accepted positionally.r   )r   ArgumentErrorlenOnDuplicateClauser#   r,   )r&   argskwvaluess       r   on_duplicate_key_updateInsert.on_duplicate_key_updatek   sw    p B##K  4y1}''0  !WFF#4$
  r   )r,   N)returnz6ReadOnlyColumnCollection[str, KeyedColumnElement[Any]])r8   r   )r3   
_UpdateArgr4   r   r8   r   )__name__
__module____qualname____firstlineno____doc__stringify_dialectinherit_cachepropertyr'   r   memoized_propertyr#   r   r   r6   __static_attributes__ r   r   r   r   6   s|    	  M+	?+ +B 
2 2 ! $5
B Br   c                  L    \ rS rSr% SrSrS\S'   S\S'   Sr      SS	 jrS
r	g)r2      r6   NzOptional[List[str]]_parameter_orderingzDict[str, Any]updater!   c                   Xl         [        U[        5      (       aF  U(       a?  [        US   [        5      (       a'  U VVs/ s H  u  p4UPM	     snnU l        [        U5      n[        U[
        5      (       a  U(       d  [        S5      eO,[        U[        5      (       a  [        U5      nO[        S5      eX l        g s  snnf )Nr   z-update parameter dictionary must not be emptyztupdate parameter must be a non-empty dictionary or a ColumnCollection such as the `.c.` collection of a Table object)	r#   
isinstancelisttuplerG   dict
ValueErrorr   rH   )r&   r#   rH   keyvalues        r   __init__OnDuplicateClause.__init__   s     - fd##z&)U33>D'Ef
f'ED$&\Ffd## C    011&\F$ 
 ! (Fs    B=)rG   r#   rH   )r#   r   rH   r9   r8   None)
r:   r;   r<   r=   __visit_name__rG   __annotations__r?   rQ   rC   rD   r   r   r2   r2      s<    .N/3,3-7A	r   r2   N)r   r   r8   r   )%
__future__r   typingr   r   r   r   r   r	   r
    r   r   sql._typingr   sql.baser   r   r   r   sql.dmlr   StandardInsertsql.elementsr   r   sql.expressionr   sql.selectabler   util.typingr   __all__r   r2   strr9   rD   r   r   <module>rc      s    #          , * # ( 0 / ) . # -  &^ D$ $N CHtE#s(O,.>sCx.HH
r   