
    (ph4                    &   % S r SSKJr  SSKrSSKJrJrJrJrJ	r	  SSKJ
r
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JrJr  SSKJr  SSKJrJr  SSKJr  \(       a  SSKJr  Sr Sr! " S S\	5      r" " S S5      r#\\$\%/S4   r&S\'S'         S"S jr(\" \(5      r) " S S\#5      r*\\$\%/S4   r+S\'S'         S#S jr,\" \,5      r-\R\                  " S5      r/ S$       S%S  jjr0\Rb                  \Rd                  \Rf                  S!.r4g)&z&
Utility module to manipulate queries
    )annotationsN)AnyCallableMappingMatch
NamedTuple)SequenceTYPE_CHECKING)	lru_cache   )pq)errors)
Composable)BufferQueryParams)PyFormat)	TypeAlias	TypeGuard)conn_encoding)Transformeri   2   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg	)
	QueryPart   bytesprez	int | stritemr   format N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r        C/var/www/html/venv/lib/python3.13/site-packages/psycopg/_queries.pyr   r      s    	J
Or'   r   c                      \ rS rSrSrSR                  5       rSS jrSS jrSS jr	\
SS j5       r\
        SS j5       rS	rg
)PostgresQuery#   zG
Helper to convert a Python query and parameters into Postgres format.
z^
        query params types formats
        _tx _want_formats _parts _encoding _order
        c                    Xl         S U l        SU l        S U l        S U l        [        UR                  5      U l        U   SU l        S U l	        g )Nr    r'   )
_txparamstypes_want_formatsformatsr   
connection	_encodingquery_order)selftransformers     r(   __init__PostgresQuery.__init__-   sI    6:&(
 5937&{'='=>
(,r'   c                   [        U[        5      (       a  UR                  U R                  5      nO3[        U[        5      (       a  UR                  U R                  5      nOUnUb_  [        U5      [        ::  a  [        U5      [        ::  a  [        nO[        nU" X0R                  5      u  U l        U l        U l        U l        OX0l        S=U l        U l        U R!                  U5        g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)
isinstancestrencoder3   r   as_bytesr-   lenMAX_CACHED_STATEMENT_LENGTHMAX_CACHED_STATEMENT_PARAMS	_query2pg_query2pg_nocacher4   r0   r5   _partsdumpr6   r4   varsbqueryfs        r(   convertPostgresQuery.convert=   s     eS!!\\$..1Fz**^^DHH-FF F::I!<<(%IJJFTZ+T[$+  J/33D		$r'   c                r   Ub  U R                  U R                  XR                  5      nU R                  c   eU R                  R                  X R                  5      U l        U R                  R                  =(       d    SU l        U R                  R                  U l        gSU l        SU l        SU l        g)r
Process a new set of variables on the query processed by `convert()`.

This method updates `params` and `types`.
Nr    )	validate_and_reorder_paramsrE   r5   r0   r-   dump_sequencer.   r/   r1   r6   rH   r.   s      r(   rF   PostgresQuery.dumpb   s     55dkk4UF%%111((009K9KLDK-2DJ88++DLDKDJDLr'   c                :   [        U 5      nU[        L d	  U[        L a  SnU$ U[        L a  SnU$ [	        U [
        5      (       a  [	        U [        [        45      (       d  SnU$ [	        U [        5      (       a  SnU$ [        S[        U 5      R                   35      e)NTFz8query parameters should be a sequence or a mapping, got )typelisttupledictr<   r	   r   r=   r   	TypeErrorr!   )rH   tsequences      r(   is_params_sequence PostgresQuery.is_params_sequences   s     J9U
H  $YH  h''
4%0N0NH  g&&H 	 T
++,. r'   c                  ^ [         R                  T5      (       a  [        T5      [        U 5      S-
  :w  a2  [        R                  " S[        U 5      S-
   S[        T5       S35      eT(       a-  [        U S   R                  [        5      (       d  [        S5      eT$ T(       a5  [        U 5      S:  a&  [        U S   S   [        5      (       d  [        S5      e U(       a  U Vs/ s H  nTU   PM
     sn$ gs  snf ! [         aE    [        R                  " S	S
R                  [        U4S jU=(       d    S 5       5      5       35      ef = f)z?
Verify the compatibility between a query and a set of params.
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 parametersr    zquery parameter missing: z, c              3  6   >#    U  H  oT;  d  M
  Uv   M     g 7f)Nr    ).0irH   s     r(   	<genexpr><PostgresQuery.validate_and_reorder_params.<locals>.<genexpr>   s     (QKqD=Ks   		)r*   r[   r@   eProgrammingErrorr<   r   intrX   r=   KeyErrorjoinsorted)partsrH   orderr   s    `  r(   rO   )PostgresQuery.validate_and_reorder_params   s8    ++D114yCJN*(($SZ!^$4 5D	{"9;  JuQx}}c:: TUUK E
Qz%(1+s/K/KS 
38954DJ599 :  ((		&(QEKRK(Q"QRSU s   C? 'C:6C? :C? ?AE)	r3   r5   rE   r-   r0   r1   r.   r4   r/   N)r7   r   r4   r   rH   Params | NonereturnNonerH   rm   rn   ro   )rH   r   rn   zTypeGuard[Sequence[Any]])ri   list[QueryPart]rH   r   rj   zlist[str] | Nonern   zSequence[Any])r!   r"   r#   r$   __doc__split	__slots__r8   rK   rF   staticmethodr[   rO   r&   r    r'   r(   r*   r*   #   sr     EG 
- #J "  $   &, 5E 	   r'   r*   ?tuple[bytes, list[PyFormat], list[str] | None, list[QueryPart]]r   	_Query2Pgc                   [        X5      nSn/ n/ n[        US   R                  [        5      (       a  USS  H{  n[        UR                  [        5      (       d   eUR	                  UR
                  5        UR	                  SUR                  S-   -  5        UR	                  UR                  5        M}     GOW[        US   R                  [        5      (       Ga4  0 n/ nUSS  GH&  n[        UR                  [        5      (       d   eUR	                  UR
                  5        UR                  U;  as  S[        U5      S-   -  nXR                  4XvR                  '   UR	                  UR                  5        UR	                  U5        UR	                  UR                  5        M  XvR                     S   UR                  :w  a$  [        R                  " SUR                   S35      eUR	                  XvR                     S   5        GM)     UR	                  US   R
                  5        SR                  U5      XSU4$ )	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   re   appendr   r   r=   r@   rc   rd   rg   )	r4   encodingri   rj   chunksr1   partseenphs	            r(   rD   rD      s    )E"EFG%(--%%#2JDdii----MM$((#MM&DIIM23NN4;;'	  
E!HMM3	'	'24#2JDdii----MM$((#yy$s4y1}-#%{{"3YYTYY'b!t{{+		?1%4,,'		{2QR  d99oa01 " MM%)-- 88FWU22r'   c                  0    \ rS rSrSrSrSS jrS	S jrSrg)
PostgresClientQuery   zA
PostgresQuery subclass merging query and arguments client-side.
)templatec                   [        U[        5      (       a  UR                  U R                  5      nO3[        U[        5      (       a  UR                  U R                  5      nOUnUbY  [        U5      [        ::  a  [        U5      [        ::  a  [        nO[        nU" X0R                  5      u  U l        U l        U l        OX0l        SU l        U R!                  U5        gr;   )r<   r=   r>   r3   r   r?   r-   r@   rA   rB   _query2pg_client_query2pg_client_nocacher   r5   rE   r4   rF   rG   s        r(   rK   PostgresClientQuery.convert   s     eS!!\\$..1Fz**^^DHH-FFF::I!<<%5,89&..8Q5T]DKJDK		$r'   c                   ^  Ub`  T R                  T R                  UT R                  5      n[        U 4S jU 5       5      T l        T R
                  T R                  -  T l        gST l        g)rN   Nc              3  b   >#    U  H$  ob  TR                   R                  U5      OSv   M&     g 7f)Ns   NULL)r-   
as_literal)r_   pr6   s     r(   ra   +PostgresClientQuery.dump.<locals>.<genexpr>  s*       NT-##A&WDfs   ,/)rO   rE   r5   rV   r.   r   r4   rQ   s   `  r(   rF   PostgresClientQuery.dump  s]     55dkk4UF  NT  DK 4DJDKr'   )r5   rE   r.   r4   r   Nrl   rp   )	r!   r"   r#   r$   rr   rt   rK   rF   r&   r    r'   r(   r   r      s     I<r'   r   /tuple[bytes, list[str] | None, list[QueryPart]]_Query2PgClientc                ~   [        XSS9nSn/ n[        US   R                  [        5      (       a[  USS  HP  n[        UR                  [        5      (       d   eUR	                  UR
                  5        UR	                  S5        MR     GO[        US   R                  [        5      (       a  0 n/ nUSS  H  n[        UR                  [        5      (       d   eUR	                  UR
                  5        UR                  U;  aI  SnXuR                  4XeR                  '   UR	                  UR                  5        UR	                  U5        M  UR	                  XeR                     S   5        UR	                  UR                  5        M     UR	                  US   R
                  5        SR                  U5      X24$ )zP
Convert Python query and params into a template to perform client-side binding
F)collapse_double_percentNr   ry   s   %sr'   )	rz   r<   r   re   r{   r   r=   r   rg   )r4   r|   ri   rj   r}   r~   r   r   s           r(   r   r   $  sZ    %HE"EF%(--%%#2JDdii----MM$((#MM%  
 
E!HMM3	'	'24#2JDdii----MM$((#yy$#%{{"3YYTYY'b!d99oa01TYY'  MM%)-- 88FU))r'   s"  (?x)
        %                       # a literal %
        (?:
            (?:
                \( ([^)]+) \)   # or a name in (braces)
                .               # followed by a format
            )
            |
            (?:.)               # or any char, really
        )
        c                   / nSnS n[         R                  U 5       H?  nXUR                  S5      S    nUR                  Xe45        UR                  S5      S   nMA     U(       a  UR                  XS  S 45        OUR                  U S 45        / nSnS n	U[	        U5      :  Ga  X8   u  peUc-  UR                  [        US[        R                  5      5         U$ UR                  S5      n
U
S:X  a$  U(       a  Sn
X8S-      u  pXj-   U-   U4X8S-   '   X8	 M  U
S:X  aN  [        R                  " SXR                  S5      S   S  R                  5       S   R                  U5       S35      eU
S:X  a  [        R                  " S	5      eU
S
S  S;  a8  [        R                  " SUR                  S5      R                  U5       S35      eUR                  S5      (       a   UR                  S5      R                  U5      OUnU	(       d  [        U5      n	O$U	[        U5      La  [        R                  " S5      e[        U
S
S     nUR                  [        XmU5      5        US-  nU[	        U5      :  a  GM  U$ )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 '%%'ry   s   sbtz8only '%s', '%b', '%t' are allowed as placeholders, got 'z1positional and named placeholders cannot be mixed)_re_placeholderfinditerspanr{   r@   r   r   AUTOgrouprc   rd   rs   decoderT   
_ph_to_fmt)r4   r|   r   ri   curmr   rvr`   phtyper   pre1m1r   r   s                  r(   rz   rz   [  s|    68E
C 	A%%e,!&&)A,'cXffQil - 	eDk4()eT]#	B 	
AF
c%j.9IIiQ67X IU WWQZ;&U|HDHtOR0Ea%L;$$66!9Q<=)//1!4;;HEFaI  5[$$@  WF"$$WWQZ&&x014  /0ggajjqwwqz  *a$ZF4:%$$C  BrsG$
		)Cv./	Q_ c%j.b Ir'   )   s   t   b)r4   r   r|   r=   rn   rv   )r4   r   r|   r=   rn   r   )asciiT)r4   r   r|   r=   r   boolrn   rq   )5rr   
__future__r   retypingr   r   r   r   r   r	   r
   	functoolsr    r   r   rc   sqlr   abcr   r   r   _enumsr   _compatr   r   
_encodingsr   r   rA   rB   r   r*   r   r=   rw   r%   rD   rC   r   r   r   r   compiler   rz   r   TEXTBINARYr   r    r'   r(   <module>r      sj   # 	 < < *     & &  ) % "   
 D DP  
CLSS	9 
/3/3/3D/3n '(	2- 2j &
CLCC 
"*"*"*4"*J 56  **
  LPGGGDHGGV --
--
//
r'   