
    jl=                       U d Z ddlmZ ddlZddlmZmZmZmZ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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 erddlm Z  dZ!dZ" G d de          Z# G d d          Z$ee%e&gdf         Z'de(d<   d-dZ) ee)          Z* G d de$          Z+ee%e&gd f         Z,de(d!<   d.d"Z- ee-          Z. ej/        d#          Z0	 d/d0d)Z1ej2        ej3        ej4        d*Z5 G d+ d,e$          Z6dS )1z&
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                  .    e Zd ZU ded<   ded<   ded<   dS )	QueryPartbytesprez	int | stritemr   formatN)__name__
__module____qualname____annotations__     [/DATA/AppData/hermes/projects/honcho/.venv/lib/python3.11/site-packages/psycopg/_queries.pyr   r      s0         JJJOOOr%   r   c                      e Zd ZdZd                                ZddZddZddZe	d d            Z
e	d!d            Zd"dZd#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                l    || _         d | _        d| _        d | _        d | _        |  d| _        d | _        d S )Nr$   r%   )_txparamstypes_want_formatsformatsquery_order)selfr)   s     r&   __init__zPostgresQuery.__init__,   s@    6:&(
 5937$
(,r%   r0   r   varsParams | NonereturnNonec                   t          |t                    r|                     ||          S |                     |          }|ot	          |          t
          k    r t	          |          t          k    rt          }nt          } ||| j	        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   _convert_template_ensure_byteslenMAX_CACHED_STATEMENT_LENGTHMAX_CACHED_STATEMENT_PARAMS	_query2pg_query2pg_nocacher+   encodingr0   r.   r1   _partsdumpr2   r0   r4   fs       r&   convertzPostgresQuery.convert;   s     eX&& 	7))%666""5)) E

999II!<<<(%GHqtx(H HDDJ*DK DJ/33D		$r%   c                   |u|                      | 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_paramsrC   r1   r.   r+   dump_sequencer,   r-   r/   r2   r4   r,   s      r&   rD   zPostgresQuery.dump^   s     55dk4UUF%111(009KLLDK-2DJ8+DLLLDKDJDLLLr%   r   TypeGuard[Sequence[Any]]c                F   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
                   |S )NTFz8query parameters should be a sequence or a mapping, got )typelisttupledictr:   r   r   strr   	TypeErrorr"   )r4   tsequences      r&   is_params_sequencez PostgresQuery.is_params_sequenceo   s     JJ99U

HH$YYHHh'' 	
4%0N0N 	HHg&& 	HH2T

/2 2   r%   partslist[QueryPart]orderlist[str] | NoneSequence[Any]c           
        t                                         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          	 |rfd|D             S d	S # t          $ rF t          j        d
d                    t          fd|pd	D                                            w xY w)zO
        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 parametersc                     g | ]
}|         S r$   r$   ).0r   r4   s     r&   
<listcomp>z=PostgresQuery.validate_and_reorder_params.<locals>.<listcomp>   s    9994DJ999r%   r$   zquery parameter missing: z, c              3  $   K   | ]
}|v|V  d S Nr$   )r_   ir4   s     r&   	<genexpr>z<PostgresQuery.validate_and_reorder_params.<locals>.<genexpr>   s'      (Q(Qq1D======(Q(Qr%   )r(   rW   r=   eProgrammingErrorr:   r   intrT   rS   KeyErrorjoinsorted)rX   r4   rZ   s    ` r&   rJ   z)PostgresQuery.validate_and_reorder_params   s    ++D11 	4yyCJJN**(;SZZ!^ ; ;D		; ; ;    VJuQx}c:: V TUUUK  E

Qz%(1+s/K/KS  
 9999599992   (U		&(Q(Q(Q(QEKR(Q(Q(Q"Q"QRRU U  s   0D AEr   r   c                    t          |t                    r|                    | j        j                  S t          |t
          j                  r|                    | j                  S |S rb   )r:   rS   encoder+   rB   r   
Composableas_bytes)r2   r0   s     r&   r<   zPostgresQuery._ensure_bytes   sX    eS!! 	<< 1222s~.. 	>>$(+++Lr%   r   c                n   |t          d          t          |d| j                  }|                                 |j        | _        |j        rP| j                            |j        |j                  | _        | j        j        pd| _        | j        j        | _        d S d | _        d| _        d | _        d S )NA'execute()' with string template query doesn't support parametersTserver_paramstxr$   )	rT   r   r+   processr0   r,   rK   r/   r-   r2   r0   r4   tps       r&   r;   zPostgresQuery._convert_template   s    S   uDTXFFF


X
9 	 (00BJGGDK-2DJ8+DLLLDKDJDLLLr%   N)r)   r   r0   r   r4   r5   r6   r7   r4   r5   r6   r7   )r4   r   r6   rM   )rX   rY   r4   r   rZ   r[   r6   r\   )r0   r   r6   r   r0   r   r4   r5   r6   r7   )r    r!   r"   __doc__split	__slots__r3   rG   rD   staticmethodrW   rJ   r<   r;   r$   r%   r&   r(   r(   "   s          EGG 
- - - -! ! ! !F       "    \$       \ D              r%   r(   ?tuple[bytes, list[PyFormat], list[str] | None, list[QueryPart]]r   	_Query2Pgr0   r   rB   rS   r6   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   rg   appendr   r   rS   r=   re   rf   ri   )	r0   rB   rX   rZ   chunksr/   partseenphs	            r&   rA   rA      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                  .    e Zd ZdZdZdd	Zdd
ZddZdS )PostgresClientQueryzI
    PostgresQuery subclass merging query and arguments client-side.
    )templater0   r   r4   r5   r6   r7   c                   t          |t                    r|                     ||          S |                     |          }|it	          |          t
          k    r t	          |          t          k    rt          }nt          } ||| j	        j
                  \  | _        | _        | _        n|| _        d| _        |                     |           dS r9   )r:   r   r;   r<   r=   r>   r?   _query2pg_client_query2pg_client_nocacher+   rB   r   r1   rC   r0   rD   rE   s       r&   rG   zPostgresClientQuery.convert  s     eX&& 	7))%666""5))E

999II!<<<%5,67atx?P6Q6Q3DM4;DJDK		$r%   c                     |W                       j        | j                  }t           fd|D                        _         j         j        z   _        dS d _        dS )rI   Nc              3  T   K   | ]"}|j                             |          ndV  #d S )Ns   NULL)r+   
as_literal)r_   pr2   s     r&   rd   z+PostgresClientQuery.dump.<locals>.<genexpr>+  sM          IJ!-##A&&&W           r%   )rJ   rC   r1   rQ   r,   r   r0   rL   s   `  r&   rD   zPostgresClientQuery.dump#  s~     55dk4UUF        NT       DK 4DJJJDKKKr%   r   c                    |t          d          t          |d| j                  }|                                 |j        | _        |j        | _        d S )Nrp   Frq   )rT   r   r+   rt   r0   r,   ru   s       r&   r;   z%PostgresClientQuery._convert_template2  sX    S   uEdhGGG


X
ir%   Nrw   rx   ry   )r    r!   r"   rz   r|   rG   rD   r;   r$   r%   r&   r   r      sa          I   8   	  	  	  	  	  	 r%   r   /tuple[bytes, list[str] | None, list[QueryPart]]_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   r   s   %sr%   )	r   r:   r   rg   r   r   rS   r   ri   )r0   rB   rX   rZ   r   r   r   r   s           r&   r   r   C  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%   s"  (?x)
        %                       # a literal %
        (?:
            (?:
                \( ([^)]+) \)   # or a name in (braces)
                .               # followed by a format
            )
            |
            (?:.)               # or any char, really
        )
        asciiTr   boolrY   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          x}
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 '%%'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groupre   rf   r{   decoderO   
_ph_to_fmt)r0   rB   r   rX   curmr   rvrc   phtyper   pre1m1r   r   s                  r&   r   r   x  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''!**B&&& 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..` Ir%   )   s   t   bc                  &    e Zd ZddZddZdd
ZdS )PostgresRawQueryr0   r   r4   r5   r6   r7   c                    t          |t                    r|                     ||          S |                     |          | _        d x| _        | _        |                     |           d S rb   )r:   r   r;   r<   r0   r.   r1   rD   r2   r0   r4   s      r&   rG   zPostgresRawQuery.convert  sa    eX&& 	7))%666''..
+//T[		$r%   c                `   |t                               |          st          d          t          j        gt          |          z  | _        | j                            || j                  | _	        | j        j
        pd| _
        | j        j        | _        d S d | _	        d| _
        d | _        d S )Nz,raw queries require a sequence of parametersr$   )r(   rW   rT   r   r   r=   r.   r+   rK   r,   r-   r/   )r2   r4   s     r&   rD   zPostgresRawQuery.dump  s     33D99 P NOOO"*-3t99!<D(00t7IJJDK-2DJ8+DLLLDKDJDLLLr%   r   c                T    t          j        t          |           j         d          )Nz! doesn't support template strings)re   NotSupportedErrorrO   r    r   s      r&   r;   z"PostgresRawQuery._convert_template  s,    !Dzz"EEE
 
 	
r%   Nrw   rx   ry   )r    r!   r"   rG   rD   r;   r$   r%   r&   r   r     sP                  
 
 
 
 
 
r%   r   )r0   r   rB   rS   r6   r~   )r0   r   rB   rS   r6   r   )r   T)r0   r   rB   rS   r   r   r6   rY   )7rz   
__future__r   retypingr   r   r   r   r   	functoolsr	   collections.abcr
   r   r    r   re   r   r   abcr   r   r   r   _enumsr   _compatr   	_tstringsr   r   r>   r?   r   r(   r   rS   r   r#   rA   r@   r   r   r   r   compiler   r   r   TEXTBINARYr   r   r$   r%   r&   <module>r      s     # " " " " " 				 G G G G G G G G G G G G G G       7 7 7 7 7 7 7 7 7 7               7 7 7 7 7 7 7 7 7 7 7 7             ( ( ( ( ( ( !      "       
   [  [  [  [  [  [  [  [ ~  
CLSS	    
/3 /3 /3 /3n I'((	;  ;  ;  ;  ; - ;  ;  ; | &
CLCC    
"* "* "* "*J 9566  "* 
 
 
 LPF F F F FT -
-
/ 

 
 
 
 
} 
 
 
 
 
r%   