
    [h^/                       d dl mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ ddlm	Z	 d	d
l
mZ d	dl
mZ d	dl
mZ d	dl
mZ d	dl
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddl$m%Z% ddl&m'Z' d Z(d.d%Z) G d& d$e          Z G d' d(e           Z* G d) d*e*          Z+ G d+ d,e*          Z,d-S )/    )annotations)Any)List)Optional)Tuple)Union   )ext   )_OnConflictConstraintT)_OnConflictIndexElementsT)_OnConflictIndexWhereT)_OnConflictSetT)_OnConflictWhereT   )util)	coercions)roles)schema)_DMLTableArgument)_exclusive_against)_generative)ColumnCollection)ReadOnlyColumnCollectionInsert)ClauseElement)ColumnElement)KeyedColumnElement)
TextClause)alias)Self)r   inserttabler   returnr   c                     t          |           S )as  Construct a PostgreSQL-specific variant :class:`_postgresql.Insert`
    construct.

    .. container:: inherited_member

        The :func:`sqlalchemy.dialects.postgresql.insert` function creates
        a :class:`sqlalchemy.dialects.postgresql.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:`_postgresql.Insert` construct includes additional methods
    :meth:`_postgresql.Insert.on_conflict_do_update`,
    :meth:`_postgresql.Insert.on_conflict_do_nothing`.

    r   )r$   s    q/var/www/api.easyaligner.net/htdocs/venv_linux/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/dml.pyr#   r#   *   s    " %==    c                      e Zd ZdZdZdZej        dd            Z e	dddi	          Z
ee
	 	 	 	 	 ddd                        Zee
	 	 	 ddd                        Zd
S )r   zPostgreSQL-specific implementation of INSERT.

    Adds methods for PG-specific syntaxes such as ON CONFLICT.

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

    
postgresqlFr%   6ReadOnlyColumnCollection[str, KeyedColumnElement[Any]]c                8    t          | j        d          j        S )ak  Provide the ``excluded`` namespace for an ON CONFLICT statement

        PG's ON CONFLICT clause allows reference to the row that would
        be inserted, known as ``excluded``.  This attribute provides
        all columns in this row to be referenceable.

        .. tip::  The :attr:`_postgresql.Insert.excluded` 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.excluded.some_column``), but special names and
            dictionary method names should be accessed using indexed access,
            such as ``stmt.excluded["column name"]`` or
            ``stmt.excluded["values"]``.   See the docstring for
            :class:`_expression.ColumnCollection` for further examples.

        .. seealso::

            :ref:`postgresql_insert_on_conflict` - example of how
            to use :attr:`_expression.Insert.excluded`

        excluded)name)r!   r$   columns)selfs    r'   r-   zInsert.excludedK   s    6 TZj11199r(   _post_values_clausezCThis Insert construct already has an ON CONFLICT clause established)msgsN
constraintr   index_elementsr   index_wherer   set_r   wherer   r"   c                6    t          |||||          | _        | S )a$  
        Specifies a DO UPDATE SET action for ON CONFLICT clause.

        Either the ``constraint`` or ``index_elements`` argument is
        required, but only one of these can be specified.

        :param constraint:
         The name of a unique or exclusion constraint on the table,
         or the constraint object itself if it has a .name attribute.

        :param index_elements:
         A sequence consisting of string column names, :class:`_schema.Column`
         objects, or other column expression objects that will be used
         to infer a target index.

        :param index_where:
         Additional WHERE criterion that can be used to infer a
         conditional target index.

        :param set\_:
         A dictionary or other mapping object
         where the keys are either names of columns in the target table,
         or :class:`_schema.Column` objects or other ORM-mapped columns
         matching that of the target table, and expressions or literals
         as values, specifying the ``SET`` actions to take.

         .. versionadded:: 1.4 The
            :paramref:`_postgresql.Insert.on_conflict_do_update.set_`
            parameter supports :class:`_schema.Column` objects from the target
            :class:`_schema.Table` as keys.

         .. 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 CONFLICT style of
            UPDATE, unless they are manually specified in the
            :paramref:`.Insert.on_conflict_do_update.set_` dictionary.

        :param where:
         Optional argument. An expression object representing a ``WHERE``
         clause that restricts the rows affected by ``DO UPDATE SET``. Rows not
         meeting the ``WHERE`` condition will not be updated (effectively a
         ``DO NOTHING`` for those rows).


        .. seealso::

            :ref:`postgresql_insert_on_conflict`

        )OnConflictDoUpdater1   )r0   r3   r4   r5   r6   r7   s         r'   on_conflict_do_updatezInsert.on_conflict_do_updatep   s)    x $6T5$
 $
  r(   c                2    t          |||          | _        | S )a	  
        Specifies a DO NOTHING action for ON CONFLICT clause.

        The ``constraint`` and ``index_elements`` arguments
        are optional, but only one of these can be specified.

        :param constraint:
         The name of a unique or exclusion constraint on the table,
         or the constraint object itself if it has a .name attribute.

        :param index_elements:
         A sequence consisting of string column names, :class:`_schema.Column`
         objects, or other column expression objects that will be used
         to infer a target index.

        :param index_where:
         Additional WHERE criterion that can be used to infer a
         conditional target index.

        .. seealso::

            :ref:`postgresql_insert_on_conflict`

        )OnConflictDoNothingr1   r0   r3   r4   r5   s       r'   on_conflict_do_nothingzInsert.on_conflict_do_nothing   s%    @ $7$
 $
  r(   )r%   r+   NNNNN)r3   r   r4   r   r5   r   r6   r   r7   r   r%   r"   NNN)r3   r   r4   r   r5   r   r%   r"   )__name__
__module____qualname____doc__stringify_dialectinherit_cacher   memoized_propertyr-   r   _on_conflict_exclusiver   r:   r>    r(   r'   r   r   >   s          %M	: : : :8 0/! $0
    .248.2 $#'= = = =  [=~  .248.2	! ! ! !  [! ! !r(   c                  B    e Zd ZU dZded<   ded<   ded<   	 	 	 dddZdS )OnConflictClauser*   zOptional[str]constraint_targetz.Optional[List[Union[str, schema.Column[Any]]]]inferred_target_elementsz/Optional[Union[ColumnElement[Any], TextClause]]inferred_target_whereclauseNr3   r   r4   r   r5   r   c                J   |Mt          |t                    s8t          |t          j        t          j        f          rt          |d          p|}||t          d          t          |t                    r|| _        d | _	        d | _
        nt          |t          j                  r(|j        }|j        d                             d          }nPt          |t          j                  r|j        }|j        }n'|j        }|j        d                             d          }|hd | _        d |D             | _	        |Et#          j        t          |t          j                  rt&          j        nt&          j        |          nd | _
        d S |d x| _        x| _	        | _
        d S d S )Nr.   z8'constraint' and 'index_elements' are mutually exclusiver*   r7   c                L    g | ]!}t          j        t          j        |          "S rI   )r   expectr   DDLConstraintColumnRole).0columns     r'   
<listcomp>z-OnConflictClause.__init__.<locals>.<listcomp>  s8     - - -  !>GG- - -r(   )
isinstancestrr   
Constraintr
   ExcludeConstraintgetattr
ValueErrorrL   rM   rN   Indexexpressionsdialect_optionsgetr/   r7   r   rQ   r   StatementOptionRoleWhereHavingRoler=   s       r'   __init__zOnConflictClause.__init__   s    !j#.. G:"C$9:4 4 G %Z88FJ
!) N   *c** )3&04-3700J55 !+!7(8FJJ  J(=>> !+!3(.!+!3(8FJJ  %%)D"- -,- - -D) *   &j#2GHH311"2    ,,,  D" T%B000  r(   r@   )r3   r   r4   r   r5   r   )rA   rB   rC   rE   __annotations__rb   rI   r(   r'   rK   rK      sl         $$$$$LLLL    .248.2	< < < < < < <r(   rK   c                      e Zd ZdZdS )r<   r>   N)rA   rB   rC   __visit_name__rI   r(   r'   r<   r<     s        -NNNr(   r<   c                  F     e Zd ZU dZded<   ded<   	 	 	 	 	 dd fdZ xZS )r9   r:   z0List[Tuple[Union[schema.Column[Any], str], Any]]update_values_to_setzOptional[ColumnElement[Any]]update_whereclauseNr3   r   r4   r   r5   r   r6   r   r7   r   c                   t                                          |||           | j        | j        t	          d          t          |t                    r|st	          d          n4t          |t                    rt          |          }nt	          d          d |                                D             | _	        |t          j        t          j        |          nd | _        d S )N)r3   r4   r5   zVEither constraint or index_elements, but not both, must be specified unless DO NOTHINGz*set parameter dictionary must not be emptyzqset parameter must be a non-empty dictionary or a ColumnCollection such as the `.c.` collection of a Table objectc                V    g | ]&\  }}t          j        t          j        |          |f'S rI   )r   rQ   r   DMLColumnRole)rS   keyvalues      r'   rU   z/OnConflictDoUpdate.__init__.<locals>.<listcomp>K  sA     %
 %
 %
U e1377?%
 %
 %
r(   )superrb   rM   rL   r[   rV   dictr   itemsrg   r   rQ   r   ra   rh   )r0   r3   r4   r5   r6   r7   	__class__s         r'   rb   zOnConflictDoUpdate.__init__)  s    	!)# 	 	
 	
 	
 )1&.D  
 dD!! 
	 O !MNNNO.// 	::DD$  
%
 %
"jjll%
 %
 %
!   U2E::: 	r(   r?   )
r3   r   r4   r   r5   r   r6   r   r7   r   )rA   rB   rC   re   rc   rb   __classcell__)rq   s   @r'   r9   r9   #  sr         ,NJJJJ4444 .248.2 $#'*
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
r(   r9   N)r$   r   r%   r   )-
__future__r   typingr   r   r   r   r    r
   _typingr   r   r   r   r   r   sqlr   r   r   sql._typingr   sql.baser   r   r   r   sql.dmlr   StandardInsertsql.elementsr   r   r   r    sql.expressionr!   util.typingr"   __all__r#   rK   r<   r9   rI   r(   r'   <module>r      s   # " " " " "                                     , , , , , , / / / / / / , , , , , , % % % % % % ' ' ' ' ' '                         , , , , , , * * * * * * # # # # # # ( ( ( ( ( ( 0 0 0 0 0 0 / / / / / / ) ) ) ) ) ) ) ) ) ) ) ) . . . . . . & & & & & & # # # # # #          (V V V V V^ V V VrE E E E E} E E EP. . . . .* . . .0
 0
 0
 0
 0
) 0
 0
 0
 0
 0
r(   