
    *Jf3                        U d Z ddlZddlmZmZmZmZmZmZm	Z	m
Z
 ddlmZmZmZ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mZmZ ddlmZ ddlm Z  erddlm!Z! dZ"dZ# G d de	          Z$ G d d          Z%ee&e'gee&ee         e
ee'                  ee$         f         f         Z(ee)d<   de&de'dee&ee         e
ee'                  ee$         f         fdZ*  e            e*          Z+ G d de%          Z,ee&e'gee&e
ee'                  ee$         f         f         Z-ee)d<   de&de'dee&e
ee'                  ee$         f         fdZ.  e            e.          Z/dee$         ded e
ee'                  dee         fd!Z0 ej1        d"          Z2	 d(de&de'd%e3dee$         fd&Z4ej5        ej6        ej7        d'Z8dS ))z&
Utility module to manipulate queries
    N)AnyCallableDictListMappingMatch
NamedTupleOptional)SequenceTupleUnionTYPE_CHECKING)	lru_cache)	TypeAlias   )pq)errors)
Composable)BufferQueryParams)PyFormat)conn_encoding)Transformeri   2   c                   >    e Zd ZU eed<   eeef         ed<   eed<   dS )	QueryPartpreitemformatN)	__name__
__module____qualname__bytes__annotations__r   intstrr        S/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/psycopg/_queries.pyr   r      s;         	JJJ
S/r)   r   c                   ~    e Zd ZdZd                                ZddZdedee	         dd	fd
Z
dee	         dd	fdZd	S )PostgresQueryzO
    Helper to convert a Python query and parameters into Postgres format.
    z^
        query params types formats
        _tx _want_formats _parts _encoding _order
        transformerr   c                     || _         d | _        d| _        d | _        d | _        t          |j                  | _        |  d| _        d | _	        d S )Nr(   r)   )
_txparamstypes_want_formatsformatsr   
connection	_encodingquery_order)selfr-   s     r*   __init__zPostgresQuery.__init__+   sR    <@&(
 8<6:&{'=>>$
+/r)   r6   varsreturnNc                    t          |t                    r|                    | j                  }n2t          |t                    r|                    | j                  }n|}|jt          |          t          k    r t          |          t          k    rt          }nt          } ||| j                  \  | _        | _        | _        | _        n|| _        dx| _        | _        |                     |           dS z
        Set up the query and parameters to convert.

        The results of this function can be obtained accessing the object
        attributes (`query`, `params`, `types`, `formats`).
        N)
isinstancer'   encoder5   r   as_bytesr/   lenMAX_CACHED_STATEMENT_LENGTHMAX_CACHED_STATEMENT_PARAMS	_query2pg_query2pg_nocacher6   r2   r7   _partsdumpr8   r6   r:   bqueryfs        r*   convertzPostgresQuery.convert;   s     eS!! 	\\$.11FFz** 	^^DH--FFF F:::II!<<<(%IJJ JFTZ+T[$++  DJ/33D		$r)   c                    |ot          | j        || j                  }| j        J | j                            || j                  | _        | j        j        pd| _        | j        j        | _        dS d| _        d| _        d| _        dS )
        Process a new set of variables on the query processed by `convert()`.

        This method updates `params` and `types`.
        Nr(   )	_validate_and_reorder_paramsrF   r7   r2   r/   dump_sequencer0   r1   r3   r8   r:   r0   s      r*   rG   zPostgresQuery.dump`   s     1$+tT[QQF%111(009KLLDK-2DJ8+DLLLDKDJDLLLr)   )r-   r   )r!   r"   r#   __doc__split	__slots__r9   r   r
   r   rK   rG   r(   r)   r*   r,   r,   !   s          EGG 
0 0 0 0 #U #(6*: #t # # # #J &)  d            r)   r,   	_Query2Pgr6   encodingr;   c                 b   t          | |          }d}g }g }t          |d         j        t                    r|dd         D ]r}t          |j        t                    sJ |                    |j                   |                    d|j        dz   z             |                    |j                   snBt          |d         j        t                    r!i }g }|dd         D ]}t          |j        t                    sJ |                    |j                   |j        |vrpdt          |          dz   z  }||j        f||j        <   |                    |j                   |                    |           |                    |j                   ||j                 d         |j        k    rt          j
        d|j         d          |                    ||j                 d                    |                    |d         j                   d                    |          |||fS )	a  
    Convert Python query and params into something Postgres understands.

    - Convert Python placeholders (``%s``, ``%(name)s``) into Postgres
      format (``$1``, ``$2``)
    - placeholders can be %s, %t, or %b (auto, text or binary)
    - return ``query`` (bytes), ``formats`` (list of formats) ``order``
      (sequence of names used in the query, in the position they appear)
      ``parts`` (splits of queries and placeholders).
    Nr   s   $%dr   zplaceholder 'z' cannot have different formatsr)   )_split_queryr>   r   r&   appendr   r    r'   rA   eProgrammingErrorjoin)	r6   rU   partsorderchunksr3   partseenphs	            r*   rE   rE   x   s!    ))E!%EFG%(-%% 2#2#J 	( 	(Ddi-----MM$(###MM&DIM2333NN4;''''		( 
E!HM3	'	' 224#2#J 	2 	2Ddi-----MM$(###y$$s4yy1}-#%t{"3TYTY'''b!!!t{++++	?1%44,R	RRR   d49oa01111 MM%)-   88FWeU22r)   c                   R    e Zd ZdZdZdedee         ddfdZdee         ddfdZ	dS )	PostgresClientQueryzI
    PostgresQuery subclass merging query and arguments client-side.
    )templater6   r:   r;   Nc                    t          |t                    r|                    | j                  }n2t          |t                    r|                    | j                  }n|}|dt          |          t          k    r t          |          t          k    rt          }nt          } ||| j                  \  | _        | _        | _        n|| _        d| _        |                     |           dS r=   )r>   r'   r?   r5   r   r@   r/   rA   rB   rC   _query2pg_client_query2pg_client_nocachere   r7   rF   r6   rG   rH   s        r*   rK   zPostgresClientQuery.convert   s     eS!! 	\\$.11FFz** 	^^DH--FFFF:::II!<<<%5,89&$.8Q8Q5T]DKDJDK		$r)   c                      |Qt           j        | j                  }t           fd|D                        _         j         j        z   _        dS d _        dS )rM   Nc              3   T   K   | ]"}|j                             |          ndV  #d S )Ns   NULL)r/   
as_literal).0pr8   s     r*   	<genexpr>z+PostgresClientQuery.dump.<locals>.<genexpr>   sM          IJ!-##A&&&W           r)   )rN   rF   r7   tupler0   re   r6   rP   s   `  r*   rG   zPostgresClientQuery.dump   sx     1$+tT[QQF        NT       DK 4DJJJDKKKr)   )
r!   r"   r#   rQ   rS   r   r
   r   rK   rG   r(   r)   r*   rd   rd      sz          IU (6*: t    <&) d      r)   rd   _Query2PgClientc                 v   t          | |d          }d}g }t          |d         j        t                    rY|dd         D ]M}t          |j        t                    sJ |                    |j                   |                    d           Nnt          |d         j        t                    ri }g }|dd         D ]}t          |j        t                    sJ |                    |j                   |j        |vrCd}||j        f||j        <   |                    |j                   |                    |           |                    ||j                 d                    |                    |j                   |                    |d         j                   d                    |          ||fS )zX
    Convert Python query and params into a template to perform client-side binding
    F)collapse_double_percentNr   rW   s   %sr)   )	rX   r>   r   r&   rY   r   r'   r    r\   )r6   rU   r]   r^   r_   r`   ra   rb   s           r*   rh   rh      s    %HHHE!%EF%(-%% (#2#J 	! 	!Ddi-----MM$(###MM%    	!
 
E!HM3	'	' (24#2#J 
	( 
	(Ddi-----MM$(###y$$#%t{"3TYTY'''b!!!!d49oa0111TY'''' MM%)-   88FUE))r)   r]   r:   r^   c           
         t                    }|t          u s	|t          u rd}n||t          u rd}npt	          t
                    rt	          t          t          f          sd}n<t	          t                    rd}n$t          dt                    j
                   |rt                    t          |           dz
  k    r8t          j        dt          |           dz
   dt                     d          r/t	          | d         j        t                    st          d	          S rCt          |           dk    r0t	          | d         d         t                    st          d
          	 fd|pdD             S # t           $ rF t          j        dd                    t%          fd|pdD                                            w xY w)zG
    Verify the compatibility between a query and a set of params.
    TFz8query parameters should be a sequence or a mapping, got r   zthe query has z placeholders but z parameters were passedr   z2named placeholders require a mapping of parametersz=positional placeholders (%s) require a sequence of parametersc                      g | ]
}|         S r(   r(   )rl   r   r:   s     r*   
<listcomp>z0_validate_and_reorder_params.<locals>.<listcomp>:  s    7774DJ777r)   r(   zquery parameter missing: z, c              3   $   K   | ]
}|v|V  d S )Nr(   )rl   ir:   s     r*   rn   z/_validate_and_reorder_params.<locals>.<genexpr>>  s'      $M$M1q}}Q}}}}$M$Mr)   )typelistro   dictr>   r   r$   r'   r   	TypeErrorr!   rA   rZ   r[   r   r&   KeyErrorr\   sorted)r]   r:   r^   tsequences    `   r*   rN   rN     s(    	T

ADyyAJJ	
d	D(	#	# 
JteS\,J,J 
	D'	"	" 
*JJ'* *
 
 	

  t99E

Q&&$7Ua 7 7II7 7 7    	R
58=#66 	RPQQQ  	CJJNN:eAhqk3+G+GNO  	77775;B7777 	 	 	$QIIf$M$M$M$M$M$M$MMMNNQ Q  	s   8F AGs"  (?x)
        %                       # a literal %
        (?:
            (?:
                \( ([^)]+) \)   # or a name in (braces)
                .               # followed by a format
            )
            |
            (?:.)               # or any char, really
        )
        asciiTrr   c                    g }d}d }t                               |           D ]W}| ||                    d          d                  }|                    ||f           |                    d          d         }X|r |                    | |d          d f           n|                    | d f           g }d}d }	|t	          |          k     r||         \  }}|0|                    t          |dt          j                             n|                    d          }
|
dk    r&|rd}
||dz            \  }}||
z   |z   |f||dz   <   ||= |
dk    rdt          j
        d| |                    d          d         d                                          d                             |           d          |
dk    rt          j
        d	          |
d
d          dvr>t          j
        d|                    d                              |           d          |                    d          r(|                    d                              |          n|}|	st          |          }	n%|	t          |          urt          j
        d          t          |
d
d                   }|                    t          |||                     |dz  }|t	          |          k     |S )Nr   r   s   %%   %s   %(zincomplete placeholder: ''s   % zfincomplete placeholder: '%'; if you want to use '%' as an operator you can double it up, i.e. use '%%'rW   s   sbtz8only '%s', '%b', '%t' are allowed as placeholders, got 'z1positional and named placeholders cannot be mixed)_re_placeholderfinditerspanrY   rA   r   r   AUTOgrouprZ   r[   rR   decoderx   
_ph_to_fmt)r6   rU   rr   r]   curmr   rvrw   phtyperb   pre1m1r   r    s                  r*   rX   rX   Q  s    9;E
C 	A%%e,,  C!&&))A,&'c1XffQiil $eCDDk4())))eT]###	B 	
AF
c%jj..qQ9IIiQ66777WWQZZ;;& QU|HD""HtOR0E!a%La;;$I166!99Q<==)//11!4;;HEEI I I   5[[$@   WF""$4WWQZZ&&x004 4 4   /0ggajj?qwwqzz  ***a 	$ZZFF4::%%$C   BrssG$
		)Cv..///	Q_ c%jj..b Ir)   )   s   t   b)r   T)9rQ   retypingr   r   r   r   r   r   r	   r
   r   r   r   r   	functoolsr   typing_extensionsr    r   r   rZ   sqlr   abcr   r   r   _enumsr   
_encodingsr   r   rB   rC   r   r,   r$   r'   rT   r%   rE   rD   rd   rp   rh   rg   rN   compiler   boolrX   r   TEXTBINARYr   r(   r)   r*   <module>r      s     
			 R R R R R R R R R R R R R R R R R R R R 8 8 8 8 8 8 8 8 8 8 8 8       ' ' ' ' ' '                   & & & & & & & & & &       % % % % % % !      "       
   N  N  N  N  N  N  N  N d  
CL%tH~xS	/BDOSTT	9   
/3/3/3
5$x.(49"5tIFG/3 /3 /3 /3n IIKK)**	2 2 2 2 2- 2 2 2j &
CL%xS	2DOCDD   
"*"*"*
5(49%tI67"* "* "* "*J 99;;788 +	?+"(+19$s)1D+c]+ + + +\ "*
   LPG GGGDHG	)_G G G GV -
-
/ 


r)   