
    ,hC                    X   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  \(       a*  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9r& " S S \R>                  \&   5      r' " S! S"\5      r(S# r) " S$ S%\RT                  \&   5      r+ " S& S'\+5      r, " S( S)\+5      r- " S* S+\+5      r. " S, S-\+5      r/ " S. S/\+5      r0 " S0 S1\+5      r1g2)3    )annotations)Any)Iterable)List)Optional)overload)TYPE_CHECKING)TypeVar   )types)ARRAY   )	coercions)elements)
expression)	functions)roles)schema)ColumnCollectionConstraint)TEXT)InternalTraversal)_ColumnExpressionArgument)ClauseElement)ColumnElement)OperatorType)
FromClause)_CloneCallableType)_TraverseInternalsType_T)boundc                  *   \ rS rSr% SrS rSrS\R                  4S\R                  4S\R                  4/r
S\S'   \    SS	 j5       r\    SS
 j5       r    SS jr S   SS jjrSS jr\R"                  4     SS jjr\SS j5       rSrg)aggregate_order_by*   a  Represent a PostgreSQL aggregate order by expression.

E.g.::

    from sqlalchemy.dialects.postgresql import aggregate_order_by

    expr = func.array_agg(aggregate_order_by(table.c.a, table.c.b.desc()))
    stmt = select(expr)

would represent the expression:

.. sourcecode:: sql

    SELECT array_agg(a ORDER BY b DESC) FROM table;

Similarly::

    expr = func.string_agg(
        table.c.a, aggregate_order_by(literal_column("','"), table.c.a)
    )
    stmt = select(expr)

Would represent:

.. sourcecode:: sql

    SELECT string_agg(a, ',' ORDER BY a) FROM table;

.. versionchanged:: 1.2.13 - the ORDER BY argument may be multiple terms

.. seealso::

    :class:`_functions.array_agg`


postgresqltargettypeorder_byr   _traverse_internalsc                    g N selfr%   r'   s      Z/var/www/auris/envauris/lib/python3.13/site-packages/sqlalchemy/dialects/postgresql/ext.py__init__aggregate_order_by.__init__X       
     c                    g r*   r+   r,   s      r.   r/   r0   _   r1   r2   c                   [         R                  " [        R                  U5      U l        U R                  R
                  U l        [        U5      nU   US:X  a  [        S5      eUS:X  a.  [         R                  " [        R                  US   5      U l        g [        R                  " US[        R                  06U l        g )Nr   z)at least one ORDER BY element is requiredr   _literal_as_text_role)r   expectr   ExpressionElementRoler%   r&   len	TypeErrorr'   r   
ClauseList)r-   r%   r'   _lobs       r.   r/   r0   f   s    
 &/%5%5''&
 KK$$	8}19GHHQY%,,++Xa[DM %//161L1LDMr2   Nc                    U $ r*   r+   )r-   againsts     r.   
self_groupaggregate_order_by.self_group}   s	     r2   c                2    U R                   U R                  4$ r*   r%   r'   )r-   kwargss     r.   get_childrenaggregate_order_by.get_children   s    {{DMM))r2   c                d    U" U R                   40 UD6U l         U" U R                  40 UD6U l        g r*   rA   )r-   clonekws      r.   _copy_internals"aggregate_order_by._copy_internals   s.     DKK.2.dmm2r2r2   c                \    U R                   R                  U R                  R                  -   $ r*   )r%   _from_objectsr'   )r-   s    r.   rK    aggregate_order_by._from_objects   s!    {{((4==+F+FFFr2   )r'   r%   r&   )r%   zColumnElement[_T]r'   _ColumnExpressionArgument[Any])r%   z_ColumnExpressionArgument[_T]r'   rM   r*   )r=   zOptional[OperatorType]returnr   )rB   r   rN   zIterable[ClauseElement])rF   r   rG   r   rN   None)rN   zList[FromClause])__name__
__module____qualname____firstlineno____doc____visit_name__stringify_dialectr   dp_clauseelementdp_typer(   __annotations__r   r/   r>   rC   r   _clonerH   propertyrK   __static_attributes__r+   r2   r.   r"   r"   *   s   "H *N$	$556	"**+	&7783/  ! 2  - 2 - 20 15-	
* +3//3'3AD3	3 G Gr2   r"   c                  z   ^  \ rS rSrSrSrSrSrSr\	R                  " SSS	5      S
 5       rU 4S jrSS jrSrU =r$ )ExcludeConstraint   zA table-level EXCLUDE constraint.

Defines an EXCLUDE constraint as described in the `PostgreSQL
documentation`__.

__ https://www.postgresql.org/docs/current/static/sql-createtable.html#SQL-CREATETABLE-EXCLUDE

exclude_constraintNFr$   wherez:class:`.ExcludeConstraint`z$:paramref:`.ExcludeConstraint.where`c                   / n/ n0 U l         [        U6 u  pV[        [        R                  " [        R
                  U5      U5       HR  u  u  pxpnU
b  UR                  U
5        Ub  UR                  OU	nUb  XR                   U'   UR                  X|U45        MT     X@l        [        R                  " U /UQ7UR                  S5      UR                  S5      UR                  S5      S.6  UR                  SS5      U l        UR                  S5      nUb*  [        R                  " [        R                  U5      U l        UR                  S	0 5      U l        g)
a
  
Create an :class:`.ExcludeConstraint` object.

E.g.::

    const = ExcludeConstraint(
        (Column("period"), "&&"),
        (Column("group"), "="),
        where=(Column("group") != "some group"),
        ops={"group": "my_operator_class"},
    )

The constraint is normally embedded into the :class:`_schema.Table`
construct
directly, or added later using :meth:`.append_constraint`::

    some_table = Table(
        "some_table",
        metadata,
        Column("id", Integer, primary_key=True),
        Column("period", TSRANGE()),
        Column("group", String),
    )

    some_table.append_constraint(
        ExcludeConstraint(
            (some_table.c.period, "&&"),
            (some_table.c.group, "="),
            where=some_table.c.group != "some group",
            name="some_table_excl_const",
            ops={"group": "my_operator_class"},
        )
    )

The exclude constraint defined in this example requires the
``btree_gist`` extension, that can be created using the
command ``CREATE EXTENSION btree_gist;``.

:param \*elements:

  A sequence of two tuples of the form ``(column, operator)`` where
  "column" is either a :class:`_schema.Column` object, or a SQL
  expression element (e.g. ``func.int8range(table.from, table.to)``)
  or the name of a column as string, and "operator" is a string
  containing the operator to use (e.g. `"&&"` or `"="`).

  In order to specify a column name when a :class:`_schema.Column`
  object is not available, while ensuring
  that any necessary quoting rules take effect, an ad-hoc
  :class:`_schema.Column` or :func:`_expression.column`
  object should be used.
  The ``column`` may also be a string SQL expression when
  passed as :func:`_expression.literal_column` or
  :func:`_expression.text`

:param name:
  Optional, the in-database name of this constraint.

:param deferrable:
  Optional bool.  If set, emit DEFERRABLE or NOT DEFERRABLE when
  issuing DDL for this constraint.

:param initially:
  Optional string.  If set, emit INITIALLY <value> when issuing DDL
  for this constraint.

:param using:
  Optional string.  If set, emit USING <index_method> when issuing DDL
  for this constraint. Defaults to 'gist'.

:param where:
  Optional SQL expression construct or literal SQL string.
  If set, emit WHERE <predicate> when issuing DDL
  for this constraint.

:param ops:
  Optional dictionary.  Used to define operator classes for the
  elements; works the same way as that of the
  :ref:`postgresql_ops <postgresql_operator_classes>`
  parameter specified to the :class:`_schema.Index` construct.

  .. versionadded:: 1.3.21

  .. seealso::

    :ref:`postgresql_operator_classes` - general description of how
    PostgreSQL operator classes are specified.

Nname
deferrable	initially)rc   rd   re   usinggistra   ops)	operatorszipr    expect_col_expression_collectionr   DDLConstraintColumnRoleappendrc   _render_exprsr   r/   getrf   r6   StatementOptionRolera   rh   )r-   r   rG   columnsrender_exprsexpressionsri   exprcolumnstrnameadd_elementoperatorrc   ra   s                 r.   r/   ExcludeConstraint.__init__   s@   ~ !$h>A66--{ 	?
:0T7( &{+"("46;;'D'/t$X 67?
" *"++	
	
 vvl+ff[)	
 VVGV,
w"))%*C*CUKDJ66%$r2   c           	        > [         TU ]  U5        U R                   VVVs/ s H/  u  p4n[        U[        5      (       d  UOUR
                  U   UU4PM1     snnnU l        g s  snnnf r*   )super_set_parentrn   
isinstancestrc)r-   tablerG   rt   rc   rx   	__class__s         r.   r|   ExcludeConstraint._set_parent'  sg    E" *.););
 *<$H	 'tS11uwwt}
 *<
 
s   6A"c           
     v   U R                    VVVs/ s H)  u  p4n[        R                  " X0R                  U5      U4PM+     nnnnU R                  " UU R
                  U R                  U R                  U R                  U R                  S.6nUR                  R                  U R                  5        U$ s  snnnf )N)rc   rd   re   ra   rf   )rn   r   _copy_expressionparentr   rc   rd   re   ra   rf   dispatch_update)r-   target_tablerG   rt   _rx   r   r   s           r.   _copyExcludeConstraint._copy3  s     &*%7%7

 &8! ''kk<H &8 	 
 NNnn****
 	


4==)!
s   0B4)rn   ri   rh   rf   ra   r*   )rP   rQ   rR   rS   rT   rU   ra   inherit_cachecreate_drop_stringify_dialectr   _document_text_coercionr/   r|   r   r\   __classcell__r   s   @r.   r^   r^      sW     *NEM$0!%%%.
%
%B

 r2   r^   c                 T    [         US'   [        R                  R                  " U 0 UD6$ )zPostgreSQL-specific form of :class:`_functions.array_agg`, ensures
return type is :class:`_postgresql.ARRAY` and not
the plain :class:`_types.ARRAY`, unless an explicit ``type_``
is passed.

_default_array_type)r   r   func	array_agg)argrG   s     r.   r   r   G  s)     !&B>>##S/B//r2   c                  ,   ^  \ rS rSrSrU 4S jrSrU =r$ )_regconfig_fniR  Tc                  > [        U5      n[        U5      S:  aR  [        R                  " [        R
                  UR                  S5      [        U SS 5      U [        R                  S9nU/nO/ nU Vs/ s H3  n[        R                  " [        R
                  U[        U SS 5      U S9PM5     nn[        TU ],  " X5-   0 UD6  g s  snf )Nr   r   rc   )rc   apply_propagate_attrstype_rc   r   )listr8   r   r6   r   r7   popgetattrr   	REGCONFIGr{   r/   )r-   argsrB   initial_argr   
addtl_argsr   s         r.   r/   _regconfig_fn.__init__U  s    Dzt9q=#**++T640&*ooK '-KK 
  ++T640&*	  	 
 	;3??
s   4:Cr+   )rP   rQ   rR   rS   r   r/   r\   r   r   s   @r.   r   r   R  s    M@ @r2   r   c                  4    \ rS rSrSrSr\R                  rSr	g)to_tsvectorio  a  The PostgreSQL ``to_tsvector`` SQL function.

This function applies automatic casting of the REGCONFIG argument
to use the :class:`_postgresql.REGCONFIG` datatype automatically,
and applies a return type of :class:`_postgresql.TSVECTOR`.

Assuming the PostgreSQL dialect has been imported, either by invoking
``from sqlalchemy.dialects import postgresql``, or by creating a PostgreSQL
engine using ``create_engine("postgresql...")``,
:class:`_postgresql.to_tsvector` will be used automatically when invoking
``sqlalchemy.func.to_tsvector()``, ensuring the correct argument and return
type handlers are used at compile and execution time.

.. versionadded:: 2.0.0rc1

Tr+   N)
rP   rQ   rR   rS   rT   r   r   TSVECTORr&   r\   r+   r2   r.   r   r   o  s    " M>>Dr2   r   c                  4    \ rS rSrSrSr\R                  rSr	g)
to_tsqueryi  a  The PostgreSQL ``to_tsquery`` SQL function.

This function applies automatic casting of the REGCONFIG argument
to use the :class:`_postgresql.REGCONFIG` datatype automatically,
and applies a return type of :class:`_postgresql.TSQUERY`.

Assuming the PostgreSQL dialect has been imported, either by invoking
``from sqlalchemy.dialects import postgresql``, or by creating a PostgreSQL
engine using ``create_engine("postgresql...")``,
:class:`_postgresql.to_tsquery` will be used automatically when invoking
``sqlalchemy.func.to_tsquery()``, ensuring the correct argument and return
type handlers are used at compile and execution time.

.. versionadded:: 2.0.0rc1

Tr+   N
rP   rQ   rR   rS   rT   r   r   TSQUERYr&   r\   r+   r2   r.   r   r         " M==Dr2   r   c                  4    \ rS rSrSrSr\R                  rSr	g)plainto_tsqueryi  a  The PostgreSQL ``plainto_tsquery`` SQL function.

This function applies automatic casting of the REGCONFIG argument
to use the :class:`_postgresql.REGCONFIG` datatype automatically,
and applies a return type of :class:`_postgresql.TSQUERY`.

Assuming the PostgreSQL dialect has been imported, either by invoking
``from sqlalchemy.dialects import postgresql``, or by creating a PostgreSQL
engine using ``create_engine("postgresql...")``,
:class:`_postgresql.plainto_tsquery` will be used automatically when
invoking ``sqlalchemy.func.plainto_tsquery()``, ensuring the correct
argument and return type handlers are used at compile and execution time.

.. versionadded:: 2.0.0rc1

Tr+   Nr   r+   r2   r.   r   r     r   r2   r   c                  4    \ rS rSrSrSr\R                  rSr	g)phraseto_tsqueryi  a  The PostgreSQL ``phraseto_tsquery`` SQL function.

This function applies automatic casting of the REGCONFIG argument
to use the :class:`_postgresql.REGCONFIG` datatype automatically,
and applies a return type of :class:`_postgresql.TSQUERY`.

Assuming the PostgreSQL dialect has been imported, either by invoking
``from sqlalchemy.dialects import postgresql``, or by creating a PostgreSQL
engine using ``create_engine("postgresql...")``,
:class:`_postgresql.phraseto_tsquery` will be used automatically when
invoking ``sqlalchemy.func.phraseto_tsquery()``, ensuring the correct
argument and return type handlers are used at compile and execution time.

.. versionadded:: 2.0.0rc1

Tr+   Nr   r+   r2   r.   r   r     r   r2   r   c                  4    \ rS rSrSrSr\R                  rSr	g)websearch_to_tsqueryi  a  The PostgreSQL ``websearch_to_tsquery`` SQL function.

This function applies automatic casting of the REGCONFIG argument
to use the :class:`_postgresql.REGCONFIG` datatype automatically,
and applies a return type of :class:`_postgresql.TSQUERY`.

Assuming the PostgreSQL dialect has been imported, either by invoking
``from sqlalchemy.dialects import postgresql``, or by creating a PostgreSQL
engine using ``create_engine("postgresql...")``,
:class:`_postgresql.websearch_to_tsquery` will be used automatically when
invoking ``sqlalchemy.func.websearch_to_tsquery()``, ensuring the correct
argument and return type handlers are used at compile and execution time.

.. versionadded:: 2.0.0rc1

Tr+   Nr   r+   r2   r.   r   r     r   r2   r   c                  4   ^  \ rS rSrSrSr\rU 4S jrSr	U =r
$ )ts_headlinei  a  The PostgreSQL ``ts_headline`` SQL function.

This function applies automatic casting of the REGCONFIG argument
to use the :class:`_postgresql.REGCONFIG` datatype automatically,
and applies a return type of :class:`_types.TEXT`.

Assuming the PostgreSQL dialect has been imported, either by invoking
``from sqlalchemy.dialects import postgresql``, or by creating a PostgreSQL
engine using ``create_engine("postgresql...")``,
:class:`_postgresql.ts_headline` will be used automatically when invoking
``sqlalchemy.func.ts_headline()``, ensuring the correct argument and return
type handlers are used at compile and execution time.

.. versionadded:: 2.0.0rc1

Tc                F  > [        U5      n[        U5      S:  a  SnOQ[        US   [        R                  5      (       a-  US   R
                  R                  [        R                  L a  SnOSnU(       aR  [        R                  " [        R                  UR                  S5      U [        U SS 5      [        R                  S9nU/nO/ nU Vs/ s H3  n[        R                  " [        R                  U[        U SS 5      U S9PM5     nn[         TU ]D  " XF-   0 UD6  g s  snf )	N   Fr   Tr   rc   )r   rc   r   r   )r   r8   r}   r   r   r&   _type_affinityr   r   r   r6   r   r7   r   r   r   r{   r/   )r-   r   rB   has_regconfigr   r   r   r   s          r.   r/   ts_headline.__init__  s   Dz t9q=!MtAw 6 677Q++u}}< "M M#**++&*T640ooK '-KK 
  ++T640&*	  	 
 	;3??
s   :Dr+   )rP   rQ   rR   rS   rT   r   r   r&   r/   r\   r   r   s   @r.   r   r     s     " MD&@ &@r2   r   N)2
__future__r   typingr   r   r   r   r   r	   r
    r   arrayr   sqlr   r   r   r   r   r   
sql.schemar   sql.sqltypesr   sql.visitorsr   sql._typingr   sql.elementsr   r   sql.operatorsr   sql.selectabler   r   r   r   r"   r^   r   GenericFunctionr   r   r   r   r   r   r   r+   r2   r.   <module>r      s    #                 4   -8---,26TcG11"5 cGLt2 tn0@I--b1 @:- , ,m ,} ,= ,;@- ;@r2   