
    -hD                         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\	5      r\" \SS5      r " S S\5      rg)   )exc)util)_exclusive_against)_generative)ColumnCollection)Insert)ClauseElement)alias)public_factory)r   insertc                   |    \ rS rSrSrSrSr\S 5       r\	R                  S 5       r\\" SSS0S	9S
 5       5       rSrg)r      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    rC:\Users\ROHAN GUPTA\OneDrive\Desktop\mathbuddy-assessment\venv\Lib\site-packages\sqlalchemy/dialects/mysql/dml.pyinsertedInsert.inserted$   s    < ""***    c                 *    [        U R                  SS9$ )Nr   )name)r
   tabler   s    r   r   Insert.inserted_aliasD   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 SS5      n[	        XC5      U l        g)ag  
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   N)r   ArgumentErrorlengetattrOnDuplicateClauser   )r   argskwvaluesr   s        r   on_duplicate_key_updateInsert.on_duplicate_key_updateH   st    h B##K  4y1}''0  !WFF '7>#4^#L r   )r   N)__name__
__module____qualname____firstlineno____doc__stringify_dialectinherit_cachepropertyr   r   memoized_propertyr   r   r   r)   __static_attributes__ r   r   r   r      ss    	  M+ +> 
2 2 ! $5
<M <Mr   r   z.dialects.mysql.insertz.dialects.mysql.Insertc                   &    \ rS rSrSrSrSrS rSrg)r%      r)   Nr   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tuple_parameter_orderingdict
ValueErrorr   update)r   r   r?   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=)r<   r   r?   )	r+   r,   r-   r.   __visit_name__r<   r0   rB   r4   r5   r   r   r%   r%      s    .Nr   r%   N) r   r   sql.baser   r   r   sql.dmlr   StandardInsertsql.elementsr	   sql.expressionr
   util.langhelpersr   __all__r   r%   r5   r   r   <module>rM      s[      * # ( / ) # . wM^ wMt 

$&>

! !r   