ó
    Ð]jl=  ã                  ó8  • % 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  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JrJrJr  SSKJr  SSK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      r0 S%       S&S jjr1\Rd                  \Rf                  \Rh                  S .r5 " S! S"\$5      r6g)'z&
Utility module to manipulate queries
é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚ
NamedTupleÚ	TypeAliasÚ	TypeGuard)Ú	lru_cache)ÚCallableÚMappingÚSequenceé   )Úerrors)ÚpqÚsql)ÚBufferÚParamsÚQueryÚQueryNoTemplate)ÚPyFormat)ÚTemplate)ÚTemplateProcessor)Ú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!   ó    ÚM/home/mande/repo/quber/.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S	 jrSS
 j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                óh   • Xl         S U l        SU l        S U l        S U l        U   SU l        S U l        g )Nr!   r(   )Ú_txÚparamsÚtypesÚ_want_formatsÚformatsÚqueryÚ_order)ÚselfÚtransformers     r)   Ú__init__ÚPostgresQuery.__init__,   s7   € ØŒà6:ˆŒà&(ˆŒ
ð 59ˆÔØ37ˆŒáØˆŒ
Ø(,ˆ�r(   c                ó”  • [        U[        5      (       a  U R                  X5      $ U R                  U5      nUbi  [	        U5      [
        ::  a  [	        U5      [        ::  a  [        nO[        nU" XR                  R                  5      u  U l        U l        U l        U l        OXl        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)Ú
isinstancer   Ú_convert_templateÚ_ensure_bytesÚlenÚMAX_CACHED_STATEMENT_LENGTHÚMAX_CACHED_STATEMENT_PARAMSÚ	_query2pgÚ_query2pg_nocacher.   Úencodingr3   r1   r4   Ú_partsÚdump©r5   r3   ÚvarsÚfs       r)   ÚconvertÚPostgresQuery.convert;   s©   € ô �eœX×&Ñ&Ø×)Ñ)¨%Ó6Ð6à×"Ñ" 5Ó)ˆàÑô �E“
Ô9Ó9Ü˜“IÔ!<Ó<ä(‘ä%�áGHØ—x‘x×(Ñ(óHÑDˆDŒJ˜Ô*¨D¬K¸½ð ŒJØ/3Ð3ˆDÔ ¤à�	‰	�$�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_paramsrD   r4   r1   r.   Údump_sequencer/   r0   r2   ©r5   rG   r/   s      r)   rE   ÚPostgresQuery.dump^   sŒ   € ð ÑØ×5Ñ5°d·k±kÀ4ÏÉÓUˆFØ×%Ñ%Ñ1Ð1Ð1ØŸ(™(×0Ñ0°×9KÑ9KÓLˆDŒKØŸ™Ÿ™×-¨2ˆDŒJØŸ8™8×+Ñ+ˆD�LàˆDŒKØˆDŒJØˆD�Lr(   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   Ústrr   Ú	TypeErrorr$   )rG   ÚtÚsequences      r)   Úis_params_sequenceÚ PostgresQuery.is_params_sequenceo   sª   € ô �‹JˆØ”Š9˜œUš
ØˆHð ˆð ”$ŠYØˆHð ˆô ˜œh×'Ñ'´
¸4Ä%ÌÀ×0NÑ0NØˆHð ˆô ˜œg×&Ñ&ØˆHð ˆô	 ðÜ˜T›
×/Ñ/Ð0ð2óð 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ÚirG   s     €r)   Ú	<genexpr>Ú<PostgresQuery.validate_and_reorder_params.<locals>.<genexpr>¢   s   øé € Ð(Q²K¨qÈDÁ=¯©²Kùs   ƒ	�	)r+   rZ   r>   ÚeÚProgrammingErrorr;   r   ÚintrW   rV   ÚKeyErrorÚjoinÚsorted)ÚpartsrG   Úorderr   s    `  r)   rM   Ú)PostgresQuery.validate_and_reorder_params‚   s8  ø€ ô ×+Ñ+¨D×1Ñ1Ü�4‹yœC ›J¨™NÓ*Ü×(Ò(Ø$¤S¨£Z°!¡^Ð$4ð 5Ü˜D›	�{Ð"9ð;óð ö œJ u¨Q¡x§}¡}´c×:Ñ:ÜÐ TÓUÐUØˆKö œ˜E›
 Q›¬z¸%À¹(À1¹+Äs×/KÑ/KÜØSóð ð
ÞÙ38Ó9²5¨4˜D œJ±5Ñ9Ð9àùò :øô ó Ü×(Ò(ðØŸ	™	¤&Ô(Q°E·K¸R°KÓ(QÓ"QÓRÐSðUóð ðús   ÃC? Ã'C:Ã6C? Ã:C? Ã?AEc                óî   • [        U[        5      (       a%  UR                  U R                  R                  5      $ [        U[
        R                  5      (       a  UR                  U R                  5      $ U$ r^   )r;   rV   Úencoder.   rC   r   Ú
ComposableÚas_bytes)r5   r3   s     r)   r=   ÚPostgresQuery._ensure_bytes¥   sQ   € Ü�eœS×!Ñ!Ø—<‘< §¡× 1Ñ 1Ó2Ð2Ü˜œsŸ~™~×.Ñ.Ø—>‘> $§(¡(Ó+Ð+àˆLr(   c                óÂ  • Ub  [        S5      e[        USU R                  S9nUR                  5         UR                  U l        UR
                  (       au  U R                  R                  UR
                  U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 )NúA'execute()' with string template query doesn't support parametersT©Úserver_paramsÚtxr!   )	rW   r   r.   Úprocessr3   r/   rN   r2   r0   ©r5   r3   rG   Útps       r)   r<   ÚPostgresQuery._convert_template­   s¡   € ØÑÜØSóð ô ˜u°D¸T¿X¹XÑFˆØ
�
‰
ŒØ—X‘XˆŒ
Ø�9�9ØŸ(™(×0Ñ0°·±¸B¿J¹JÓGˆDŒKØŸ™Ÿ™×-¨2ˆDŒJØŸ8™8×+Ñ+ˆD�LàˆDŒKØˆDŒJØˆD�Lr(   )r4   rD   r.   r1   r2   r/   r3   r0   N)r6   r   ©r3   r   rG   úParams | NoneÚreturnÚNone©rG   r{   r|   r}   )rG   r   r|   zTypeGuard[Sequence[Any]])ri   úlist[QueryPart]rG   r   rj   zlist[str] | Noner|   zSequence[Any])r3   r   r|   r   ©r3   r   rG   r{   r|   r}   )r"   r#   r$   r%   Ú__doc__ÚsplitÚ	__slots__r7   rI   rE   ÚstaticmethodrZ   rM   r=   r<   r'   r!   r(   r)   r+   r+   "   s}   † ñð÷ ‰E‹Gð ô
-ô!ôF ð" óó ðð$ ð Øð Ø&,ð Ø5Eð à	ó ó ð ôD÷ 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X†R                  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    rV   r>   rc   rd   rg   )	r3   rC   ri   rj   Úchunksr2   ÚpartÚseenÚphs	            r)   rB   rB   Æ   sÆ  € ô ˜Ó)€EØ"€EØ€FØ€Gä�%˜‘(—-‘-¤×%Ñ%Ø˜#˜2“JˆDÜ˜dŸi™i¬×-Ñ-Ð-Ð-Ø�M‰M˜$Ÿ(™(Ô#Ø�M‰M˜& D§I¡I°¡MÑ2Ô3Ø�N‰N˜4Ÿ;™;Ö'ó	 ô 
�E˜!‘H—M‘M¤3×	'Ò	'Ø24ˆØˆØ˜#˜2”JˆDÜ˜dŸi™i¬×-Ñ-Ð-Ð-Ø�M‰M˜$Ÿ(™(Ô#Ø�y‰y Ó$Øœs 4›y¨1™}Ñ-�Ø#%§{¡{Ð"3�—Y‘Y‘Ø—‘˜TŸY™YÔ'Ø—‘˜bÔ!Ø—‘˜tŸ{™{Ö+àŸ	™	‘? 1Ñ%¨¯©Ó4Ü×,Ò,Ø'¨¯	©	 {Ð2QÐRóð ð —‘˜d§9¡9™o¨aÑ0×1ñ ð" ‡M�M�%˜‘)—-‘-Ô à�8‰8�FÓ˜W¨UÐ2Ð2r(   c                  ó:   • \ rS rSrSrSrS	S jrS
S jrSS jrSr	g)ÚPostgresClientQueryé   zA
PostgresQuery subclass merging query and arguments client-side.
)Útemplatec                óz  • [        U[        5      (       a  U R                  X5      $ U R                  U5      nUbc  [	        U5      [
        ::  a  [	        U5      [        ::  a  [        nO[        nU" XR                  R                  5      u  U l        U l        U l        OXl        SU l        U R                  U5        gr:   )r;   r   r<   r=   r>   r?   r@   Ú_query2pg_clientÚ_query2pg_client_nocacher.   rC   r’   r4   rD   r3   rE   rF   s       r)   rI   ÚPostgresClientQuery.convert  s”   € ô �eœX×&Ñ&Ø×)Ñ)¨%Ó6Ð6à×"Ñ" 5Ó)ˆàÑä�E“
Ô9Ó9Ü˜“IÔ!<Ó<ä%5‘ä,�á67¸¿x¹x×?PÑ?PÓ6QÑ3ˆDŒM˜4œ;¨­àŒJØˆDŒKà�	‰	�$�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)rL   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_   Úpr5   s     €r)   ra   Ú+PostgresClientQuery.dump.<locals>.<genexpr>+  s*   øé € ð  ÚNTÈ©-�—‘×#Ñ# AÔ&¸WÔDÊfùs   ƒ,/)rM   rD   r4   rT   r/   r’   r3   rO   s   `  r)   rE   ÚPostgresClientQuery.dump#  s]   ø€ ð ÑØ×5Ñ5°d·k±kÀ4ÈÏÉÓUˆFÜô  ÙNTó ó ˆDŒKð Ÿ™¨¯©Ñ4ˆD�JàˆD�Kr(   c                ó®   • Ub  [        S5      e[        USU R                  S9nUR                  5         UR                  U l        UR
                  U l        g )Nrr   Frs   )rW   r   r.   rv   r3   r/   rw   s       r)   r<   Ú%PostgresClientQuery._convert_template2  sK   € ØÑÜØSóð ô ˜u°E¸d¿h¹hÑGˆØ
�
‰
ŒØ—X‘XˆŒ
Ø—i‘iˆ�r(   )r4   rD   r/   r3   r’   Nrz   r~   r€   )
r"   r#   r$   r%   r�   rƒ   rI   rE   r<   r'   r!   r(   r)   r�   r�      s   † ñð €Iôô8÷	 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   rˆ   s   %sr(   )	r‰   r;   r   re   rŠ   r   rV   r    rg   )r3   rC   ri   rj   r‹   rŒ   r�   rŽ   s           r)   r•   r•   C  sZ  € ô ˜À%ÑH€EØ"€EØ€Fä�%˜‘(—-‘-¤×%Ñ%Ø˜#˜2“JˆDÜ˜dŸi™i¬×-Ñ-Ð-Ð-Ø�M‰M˜$Ÿ(™(Ô#Ø�M‰M˜%Ö ó ô
 
�E˜!‘H—M‘M¤3×	'Ñ	'Ø24ˆØˆØ˜#˜2“JˆDÜ˜dŸi™i¬×-Ñ-Ð-Ð-Ø�M‰M˜$Ÿ(™(Ô#Ø�y‰y Ó$Ø�Ø#%§{¡{Ð"3�—Y‘Y‘Ø—‘˜TŸY™YÔ'Ø—‘˜bÖ!à—‘˜d§9¡9™o¨aÑ0Ô1Ø—‘˜TŸY™YÖ'ñ ð ‡M�M�%˜‘)—-‘-Ô à�8‰8�FÓ˜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
S:X  a$  U(       a  Sn
X8S-      u  p¼Xj-   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 '%%'rˆ   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   r‚   ÚdecoderR   Ú
_ph_to_fmt)r3   rC   r¢   ri   ÚcurÚmr   Úrvr`   ÚphtyperŽ   Úpre1Úm1r   r    s                  r)   r‰   r‰   x  s}  € ð 9;€EØ
€Cð 	€AÜ×%Ñ% eÖ,ˆØ˜!Ÿ&™& ›) A™,Ð'ˆØ�‰�c�XÔØ�f‰f�Q‹i˜‰lŠñ -ö 	Ø�‰�e˜D�k 4Ð(Õ)à�‰�e˜T�]Ô#à	€Bð 	
€AØ€FØ
Œc�%‹jŒ.Ø‘‰ˆØ‰9à�I‰I”i  Q¬¯©Ó6Ô7ØðV €IðS —'‘'˜!“*ÐˆB Ó&æ&Ø�Ø ™U‘|‰HˆDØ™H t™O¨RÐ0ˆE�a‘%‰LØ�Ùà�‹;Ü×$Ò$ðØŸ6™6 !›9 Q™<˜=Ð)×/Ñ/Ó1°!Ñ4×;Ñ;¸HÓEÐFÀaðIóð ð �5‹[ä×$Ò$ð@óð ð ��ˆW˜FÓ"Ü×$Ò$ðØ—W‘W˜Q“Z×&Ñ& xÓ0Ð1°ð4óð ð /0¯g©g°a¯j©jˆq�w‰w�q‹z× Ñ  Ô*¸aˆæÜ˜$“Z‰FØœ4 ›:Ò%Ü×$Ò$ØCóð ô ˜B˜r˜s˜GÑ$ˆØ
�	‰	”)˜C vÓ.Ô/Ø	ˆQ‰ˆð] Œc�%‹jŽ.ð` €Ir(   )ó   só   tó   bc                  ó2   • \ rS rSrSS jrSS jrS	S jrSrg)
ÚPostgresRawQueryiÈ  c                óº   • [        U[        5      (       a  U R                  X5      $ U R                  U5      U l        S =U l        U l        U R                  U5        g r^   )r;   r   r<   r=   r3   r1   r4   rE   ©r5   r3   rG   s      r)   rI   ÚPostgresRawQuery.convertÉ  sL   € Ü�eœX×&Ñ&Ø×)Ñ)¨%Ó6Ð6à×'Ñ'¨Ó.ˆŒ
Ø+/Ð/ˆÔ˜Tœ[Ø�	‰	�$�r(   c                ó–  • Ub±  [         R                  U5      (       d  [        S5      e[        R                  /[        U5      -  U l        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 )Nz,raw queries require a sequence of parametersr!   )r+   rZ   rW   r   r©   r>   r1   r.   rN   r/   r0   r2   )r5   rG   s     r)   rE   ÚPostgresRawQuery.dumpÑ  s’   € ØÑÜ ×3Ñ3°D×9Ñ9ÜÐ NÓOÐOÜ"*§-¡- ´3°t³9Ñ!<ˆDÔàŸ(™(×0Ñ0°×7IÑ7IÓJˆDŒKØŸ™Ÿ™×-¨2ˆDŒJØŸ8™8×+Ñ+ˆD�LàˆDŒKØˆDŒJØˆD�Lr(   c                óZ   • [         R                  " [        U 5      R                   S35      e)Nz! doesn't support template strings)rc   ÚNotSupportedErrorrR   r"   r¹   s      r)   r<   Ú"PostgresRawQuery._convert_templateß  s+   € Ü×!Ò!Ü�D‹z×"Ñ"Ð#Ð#DÐEó
ð 	
r(   )r4   r1   r2   r/   r3   r0   Nrz   r~   r€   )r"   r#   r$   r%   rI   rE   r<   r'   r!   r(   r)   r·   r·   È  s   † ôô ÷
r(   r·   )r3   r   rC   rV   r|   r…   )r3   r   rC   rV   r|   rŸ   )ÚasciiT)r3   r   rC   rV   r¢   Úboolr|   r   )7r�   Ú
__future__r   ÚreÚtypingr   r   r   r   r   Ú	functoolsr	   Úcollections.abcr
   r   r   Ú r   rc   r   r   Úabcr   r   r   r   Ú_enumsr   Ú_compatr   Ú	_tstringsr   r   r?   r@   r   r+   r   rV   r†   r&   rB   rA   r�   r    r•   r”   Úcompiler¦   r‰   r©   ÚTEXTÚBINARYr¬   r·   r!   r(   r)   Ú<module>rÏ      sv  ðòõ #ã 	ß GÕ GÝ ß 7Ñ 7å ß ß 7Ó 7Ý Ý Ý (æÝ à"Ð Ø Ð ô�
ô ÷[ ñ [ ð~  Ø
ˆC€LÐSÐSñ€	ˆ9ó ð
/3Øð/3Øð/3àDô/3ñn Ð'Ó(€	ô; ˜-ô ; ð| &Ø
ˆC€LÐCÐCñ€�ó ð
"*Øð"*Øð"*à4ô"*ñJ Ð5Ó6Ð ð —*’*ð 
ó 
€ð LPðFØðFØðFØDHðFàõFðT �-‰-Ø
�-‰-Ø
�/‰/ñ€
ô
�}õ 
r(   