
    mg 6                    J   S SK Jr  S SK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9r\R(                  4S jr\R(                  4S jr " S S\R,                  \   5      r " S S\R0                  5      rS rg)    )annotationsN)Any)Optional)TypeVar   )CONTAINED_BY)CONTAINS)OVERLAP   )types)util)
expression)	operators)_TypeEngineArgument_T)boundc                $    UR                  X5      $ )zbA synonym for the ARRAY-level :meth:`.ARRAY.Comparator.any` method.
See that method for details.

)anyotherarrexproperators      l/Users/Alptekin/Desktop/izin_takip/venv/lib/python3.13/site-packages/sqlalchemy/dialects/postgresql/array.pyr   r           ;;u''    c                $    UR                  X5      $ )zbA synonym for the ARRAY-level :meth:`.ARRAY.Comparator.all` method.
See that method for details.

)allr   s      r   Allr   '   r   r   c                  \   ^  \ rS rSrSrS rSrSrU 4S jr\	S 5       r
S
S jrSS jrS	rU =r$ )array0   a  A PostgreSQL ARRAY literal.

This is used to produce ARRAY literals in SQL expressions, e.g.::

    from sqlalchemy.dialects.postgresql import array
    from sqlalchemy.dialects import postgresql
    from sqlalchemy import select, func

    stmt = select(array([1, 2]) + array([3, 4, 5]))

    print(stmt.compile(dialect=postgresql.dialect()))

Produces the SQL:

.. sourcecode:: sql

    SELECT ARRAY[%(param_1)s, %(param_2)s] ||
        ARRAY[%(param_3)s, %(param_4)s, %(param_5)s]) AS anon_1

An instance of :class:`.array` will always have the datatype
:class:`_types.ARRAY`.  The "inner" type of the array is inferred from
the values present, unless the ``type_`` keyword argument is passed::

    array(["foo", "bar"], type_=CHAR)

Multidimensional arrays are produced by nesting :class:`.array` constructs.
The dimensionality of the final :class:`_types.ARRAY`
type is calculated by
recursively adding the dimensions of the inner :class:`_types.ARRAY`
type::

    stmt = select(
        array(
            [array([1, 2]), array([3, 4]), array([column("q"), column("x")])]
        )
    )
    print(stmt.compile(dialect=postgresql.dialect()))

Produces:

.. sourcecode:: sql

    SELECT ARRAY[
        ARRAY[%(param_1)s, %(param_2)s],
        ARRAY[%(param_3)s, %(param_4)s],
        ARRAY[q, x]
    ] AS anon_1

.. versionadded:: 1.3.6 added support for multidimensional array literals

.. seealso::

    :class:`_postgresql.ARRAY`


postgresqlTc                  > UR                  SS 5      n[        TU ]  " [        R                  /UQ70 UD6  U R
                   Vs/ s H  oDR                  PM     snU l        Ub  UO/U R                  (       a  U R                  S   O[        R                  n[        U[        5      (       a6  [        UR                  UR                  b  UR                  S-   OSS9U l        g [        U5      U l        g s  snf )Ntype_r   r      )
dimensions)popsuper__init__r   comma_opclausestype_type_tuplesqltypesNULLTYPE
isinstanceARRAY	item_typer&   )selfr+   kwtype_argarg	main_type	__class__s         r   r)   array.__init__n   s    66'4(++<g<<04=HH= # (,(8(8!!!$h>O>O 	 i''## !++7 ((1,DI i(DI% >s   C2c                    U 4$ N r3   s    r   _select_iterablearray._select_iterable   s	    wr   c                    U(       d  U[         R                  L a#  [        R                  " S UUUU R                  SS9$ [        U Vs/ s H  nU R                  XSUS9PM     sn5      $ s  snf )NT)_compared_to_operatorr$   _compared_to_typeunique)_assume_scalarr$   )r   getitemr   BindParameterr,   r    _bind_param)r3   r   objrD   r$   os         r   rG   array._bind_param   s    X):)::++&."&))  
 !	 ! $$ D %  !	 s   A)c                    U[         R                  [         R                  [         R                  4;   a  [        R
                  " U 5      $ U $ r;   )r   any_opall_oprE   r   Grouping)r3   againsts     r   
self_grouparray.self_group   s9    y'')9)99;L;LMM&&t,,Kr   )r-   r,   )FNr;   )__name__
__module____qualname____firstlineno____doc____visit_name__stringify_dialectinherit_cacher)   propertyr>   rG   rP   __static_attributes____classcell__)r8   s   @r   r    r    0   sC    6p N$M)0  * r   r    c                      \ rS rSrSr   S       SS jjr " S S\R                  R                  5      r\r	\
S 5       r\
S 5       rS	 r\R                  S
 5       rS rS rS rSrg)r1      a	  PostgreSQL ARRAY type.

The :class:`_postgresql.ARRAY` type is constructed in the same way
as the core :class:`_types.ARRAY` type; a member type is required, and a
number of dimensions is recommended if the type is to be used for more
than one dimension::

    from sqlalchemy.dialects import postgresql

    mytable = Table(
        "mytable",
        metadata,
        Column("data", postgresql.ARRAY(Integer, dimensions=2)),
    )

The :class:`_postgresql.ARRAY` type provides all operations defined on the
core :class:`_types.ARRAY` type, including support for "dimensions",
indexed access, and simple matching such as
:meth:`.types.ARRAY.Comparator.any` and
:meth:`.types.ARRAY.Comparator.all`.  :class:`_postgresql.ARRAY`
class also
provides PostgreSQL-specific methods for containment operations, including
:meth:`.postgresql.ARRAY.Comparator.contains`
:meth:`.postgresql.ARRAY.Comparator.contained_by`, and
:meth:`.postgresql.ARRAY.Comparator.overlap`, e.g.::

    mytable.c.data.contains([1, 2])

Indexed access is one-based by default, to match that of PostgreSQL;
for zero-based indexed access, set
:paramref:`_postgresql.ARRAY.zero_indexes`.

Additionally, the :class:`_postgresql.ARRAY`
type does not work directly in
conjunction with the :class:`.ENUM` type.  For a workaround, see the
special type at :ref:`postgresql_array_of_enum`.

.. container:: topic

    **Detecting Changes in ARRAY columns when using the ORM**

    The :class:`_postgresql.ARRAY` type, when used with the SQLAlchemy ORM,
    does not detect in-place mutations to the array. In order to detect
    these, the :mod:`sqlalchemy.ext.mutable` extension must be used, using
    the :class:`.MutableList` class::

        from sqlalchemy.dialects.postgresql import ARRAY
        from sqlalchemy.ext.mutable import MutableList


        class SomeOrmClass(Base):
            # ...

            data = Column(MutableList.as_mutable(ARRAY(Integer)))

    This extension will allow "in-place" changes such to the array
    such as ``.append()`` to produce events which will be detected by the
    unit of work.  Note that changes to elements **inside** the array,
    including subarrays that are mutated in place, are **not** detected.

    Alternatively, assigning a new array value to an ORM element that
    replaces the old one will always trigger a change event.

.. seealso::

    :class:`_types.ARRAY` - base array type

    :class:`_postgresql.array` - produces a literal array value.

Nc                    [        U[        5      (       a  [        S5      e[        U[        5      (       a  U" 5       nXl        X l        X0l        X@l        g)au  Construct an ARRAY.

E.g.::

  Column("myarray", ARRAY(Integer))

Arguments are:

:param item_type: The data type of items of this array. Note that
  dimensionality is irrelevant here, so multi-dimensional arrays like
  ``INTEGER[][]``, are constructed as ``ARRAY(Integer)``, not as
  ``ARRAY(ARRAY(Integer))`` or such.

:param as_tuple=False: Specify whether return results
  should be converted to tuples from lists. DBAPIs such
  as psycopg2 return lists by default. When tuples are
  returned, the results are hashable.

:param dimensions: if non-None, the ARRAY will assume a fixed
 number of dimensions.  This will cause the DDL emitted for this
 ARRAY to include the exact number of bracket clauses ``[]``,
 and will also optimize the performance of the type overall.
 Note that PG arrays are always implicitly "non-dimensioned",
 meaning they can store any number of dimensions no matter how
 they were declared.

:param zero_indexes=False: when True, index values will be converted
 between Python zero-based and PostgreSQL one-based indexes, e.g.
 a value of one will be added to all index values before passing
 to the database.

zUDo not nest ARRAY types; ARRAY(basetype) handles multi-dimensional arrays of basetypeN)r0   r1   
ValueErrorr,   r2   as_tupler&   zero_indexes)r3   r2   ra   r&   rb   s        r   r)   ARRAY.__init__   sO    N i''?  i&&!I" $(r   c                  *    \ rS rSrSrS rS rS rSrg)ARRAY.Comparatori!  a  Define comparison operations for :class:`_types.ARRAY`.

Note that these operations are in addition to those provided
by the base :class:`.types.ARRAY.Comparator` class, including
:meth:`.types.ARRAY.Comparator.any` and
:meth:`.types.ARRAY.Comparator.all`.

c                H    U R                  [        U[        R                  S9$ )zBoolean expression.  Test if elements are a superset of the
elements of the argument array expression.

kwargs may be ignored by this operator but are required for API
conformance.
result_type)operater	   r.   Boolean)r3   r   kwargss      r   containsARRAY.Comparator.contains+  s     <<%X=M=M<NNr   c                H    U R                  [        U[        R                  S9$ )zlBoolean expression.  Test if elements are a proper subset of the
elements of the argument array expression.
rg   )ri   r   r.   rj   r3   r   s     r   contained_byARRAY.Comparator.contained_by4  s'     <<e1A1A    r   c                H    U R                  [        U[        R                  S9$ )z]Boolean expression.  Test if array has elements in common with
an argument array expression.
rg   )ri   r
   r.   rj   ro   s     r   overlapARRAY.Comparator.overlap<  s     <<H<L<L<MMr   r<   N)	rR   rS   rT   rU   rV   rl   rp   rs   r[   r<   r   r   
Comparatorre   !  s    		O		Nr   ru   c                    U R                   $ r;   )ra   r=   s    r   hashableARRAY.hashableD  s    }}r   c                    [         $ r;   )listr=   s    r   python_typeARRAY.python_typeH  s    r   c                
    X:H  $ r;   r<   )r3   xys      r   compare_valuesARRAY.compare_valuesL  s	    vr   c                    [        U R                  [        R                  5      =(       a    U R                  R                  $ r;   )r0   r2   r.   Enumnative_enumr=   s    r   _against_native_enumARRAY._against_native_enumO  s-     t~~x}}5 +**	
r   c                ~   ^ ^^ T R                   R                  U5      R                  U5      mTc  g S mUU U4S jnU$ )Nc                ,    SSR                  U 5       S3$ )NzARRAY[z, ])join)elementss    r   to_str'ARRAY.literal_processor.<locals>.to_str]  s    DIIh/022r   c                D   > TR                  U TTR                  T5      nU$ r;   )_apply_item_processorr&   )valueinner	item_procr3   r   s     r   process(ARRAY.literal_processor.<locals>.process`  s'    ..y$//6E Lr   )r2   dialect_implliteral_processor)r3   dialectr   r   r   s   `  @@r   r   ARRAY.literal_processorV  sA    NN//8JJ
	 	3	 r   c                l   ^ ^ T R                   R                  U5      R                  U5      mUU 4S jnU$ )Nc                R   > U c  U $ TR                  U TTR                  [        5      $ r;   )r   r&   rz   r   r   r3   s    r   r   %ARRAY.bind_processor.<locals>.processm  s-    }119doot r   )r2   r   bind_processor)r3   r   r   r   s   `  @r   r   ARRAY.bind_processorh  s1    NN//8GG
		 r   c                   ^ ^^^^ T R                   R                  U5      R                  X5      mUU 4S jnT R                  (       a%  Um[        R
                  " S5      mU4S jmUU4S jnU$ )Nc                   > U c  U $ TR                  U TTR                  TR                  (       a
  [        5      $ [        5      $ r;   )r   r&   ra   tuplerz   r   s    r   r   'ARRAY.result_processor.<locals>.process|  sE    }11OO!]]E	  15	 r   z^{(.*)}$c                Z   > TR                  U 5      R                  S5      n[        U5      $ )Nr   )matchgroup_split_enum_values)r   r   patterns     r   handle_raw_string1ARRAY.result_processor.<locals>.handle_raw_string  s'    e,2215)%00r   c                `   > U c  U $ T" [        U [        5      (       a  T" U 5      5      $ U 5      $ r;   )r0   str)r   r   super_rps    r   r   r     sB    = L  !%-- &e,   r   )r2   r   result_processorr   recompile)r3   r   coltyper   r   r   r   r   s   `   @@@@r   r   ARRAY.result_processorw  sY    NN//8II
			 $$Hjj-G1
 r   )ra   r&   r2   rb   )FNF)r2   z_TypeEngineArgument[Any]ra   boolr&   zOptional[int]rb   r   )rR   rS   rT   rU   rV   r)   r.   r1   ru   comparator_factoryrZ   rw   r{   r   r   memoized_propertyr   r   r   r   r[   r<   r   r   r1   r1      s    ET $("1)+1) 1) "	1)
 1)fNX^^.. NB $    

 
$$r   r1   c                   SU ;  a  U (       a  U R                  S5      $ / $ U R                  SS5      nUR                  SS5      n/ n[        R                   " SU5      nSnU Hb  nUS:X  a	  U(       + nM  U(       a#  UR                  UR                  SS5      5        M<  UR	                  [        R
                  " S	U5      5        Md     U$ )
N",z\"z_$ESC_QUOTE$_z\\\z(")Fz([^\s,]+),?)splitreplacer   appendextendfindall)array_stringtextresult	on_quotes	in_quotestoks         r   r   r     s    
,*6|!!#&>B> 7D<<t$DF&II#:%IMM#++os;<MM"**^S9:  Mr   )
__future__r   r   typingr   r   r   r   r   r	   r
    r   r.   r   sqlr   sql._typingr   r   eqr   ExpressionClauseListr    r1   r   r<   r   r   <module>r      s    # 	    #   !    . T "+ ( "+ (sJ++B/ sluHNN upr   