
    (phD!                         S r SSK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\5      r " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)z;Database functions that do comparisons or type conversions.    )NotSupportedError)FuncValue)	TextField)	JSONField)_lazy_re_compilec                   d   ^  \ rS rSrSrSrSrU 4S jrU 4S jrU 4S jr	S r
S	 rU 4S
 jrSrU =r$ )Cast
   z)Coerce an expression to a new field type.CASTz,%(function)s(%(expressions)s AS %(db_type)s)c                     > [         TU ]  XS9  g )N)output_field)super__init__)self
expressionr   	__class__s      X/var/www/html/venv/lib/python3.13/site-packages/django/db/models/functions/comparison.pyr   Cast.__init__   s    ?    c                 b   > U R                   R                  U5      US'   [        TU ]  " X40 UD6$ )Ndb_type)r   cast_db_typer   as_sqlr   compiler
connectionextra_contextr   s       r   r   Cast.as_sql   s2    #'#4#4#A#A*#Mi w~hDmDDr   c                   > U R                   R                  U5      nUS;   a6  Sn[        T	U ]  " X4SU0UD6u  pgUS:X  a  SOSnUR	                  SU5        Xg4$ US:X  a  S	n[        T	U ]  " X4SU0UD6$ U R                  " X40 UD6$ )
N>   timedatetimezstrftime(%%s, %(expressions)s)templater!   z%H:%M:%fz%Y-%m-%d %H:%M:%fr   datezdate(%(expressions)s))r   r   r   r   insert)
r   r   r   r   r   r#   sqlparamsformat_stringr   s
            r   	as_sqliteCast.as_sqlite   s    ##++J7**7H'./7;HKC +2V*;JATMMM!]+;.H7>/7;H  {{8A=AAr   c                     S nU R                   R                  5       nUS:X  a  SnOUS:X  a  UR                  (       a  SnU R                  " X4SU0UD6$ )N
FloatFieldz(%(expressions)s + 0.0)r   z"JSON_EXTRACT(%(expressions)s, '$')r#   )r   get_internal_typemysql_is_mariadbr   )r   r   r   r   r#   output_types         r   as_mysqlCast.as_mysql)   sV    ''99;,&0HK'J,G,G;H{{8T(TmTTr   c                 .    U R                   " UU4SS0UD6$ )Nr#   z(%(expressions)s)::%(db_type)sr   )r   r   r   r   s       r   as_postgresqlCast.as_postgresql4   s/     {{
 6
 	
 	
r   c                    > U R                   R                  5       S:X  a  Sn[        TU ]  " X4SU0UD6$ U R                  " X40 UD6$ )Nr   z JSON_QUERY(%(expressions)s, '$')r#   )r   r-   r   r   )r   r   r   r   r#   r   s        r   	as_oracleCast.as_oracle?   sY    ..0K?9H7>/7;H  {{8A=AAr    )__name__
__module____qualname____firstlineno____doc__functionr#   r   r   r)   r0   r4   r7   __static_attributes____classcell__r   s   @r   r
   r
   
   s9    3H=H@EB$	U	
B Br   r
   c                   L   ^  \ rS rSrSrSrU 4S jr\S 5       rU 4S jr	Sr
U =r$ )CoalesceI   z:Return, from left to right, the first non-null expression.COALESCEc                 Z   > [        U5      S:  a  [        S5      e[        TU ]  " U0 UD6  g )N   z+Coalesce must take at least two expressionslen
ValueErrorr   r   r   expressionsextrar   s      r   r   Coalesce.__init__N   .    {aJKK+//r   c                 j    U R                  5        H  nUR                  nU[        L d  Uc  M  Us  $    g N)get_source_expressionsempty_result_set_valueNotImplemented)r   r   results      r   rT   Coalesce.empty_result_set_valueS   s7    557J66F'6+= 8 r   c           
      *  > U R                   R                  5       S:X  a]  U R                  5       nUR                  U R	                  5        Vs/ s H  n[        USS9PM     sn5        [        [        U]"  " X40 UD6$ U R                  " X40 UD6$ s  snf )Nr   TO_NCLOB)r?   )	r   r-   copyset_source_expressionsrS   r   r   rD   r   )r   r   r   r   cloner   r   s         r   r7   Coalesce.as_oracle[   s     ..0K?IIKE(( '+&A&A&C&C
 j9&C 50WWW{{8A=AAs   Br9   )r:   r;   r<   r=   r>   r?   r   propertyrT   r7   r@   rA   rB   s   @r   rD   rD   I   s0    DH0
  B Br   rD   c                   P   ^  \ rS rSrSrSrSr\" S5      rU 4S jr	U 4S jr
SrU =r$ )	Collatej   COLLATEz*%(expressions)s %(function)s %(collation)sFz^[\w-]+$c                    > U(       a   U R                   R                  U5      (       d  [        SU-  5      eX l        [        TU ]  U5        g )NzInvalid collation name: %r.)collation_rematchrK   	collationr   r   )r   r   rf   r   s      r   r   Collate.__init__r   s?    d//55i@@:YFGG"$r   c                    > UR                  SUR                  R                  U R                  5      5        [        TU ]  " X40 UD6$ )Nrf   )
setdefaultops
quote_namerf   r   r   r   s       r   r   Collate.as_sqlx   s:      jnn.G.G.WXw~hDmDDr   )rf   )r:   r;   r<   r=   r?   r#   allowed_defaultr   rd   r   r   r@   rA   rB   s   @r   r`   r`   j   s/    H;HO $K0L%E Er   r`   c                   <   ^  \ rS rSrSrSrU 4S jrU 4S jrSrU =r	$ )Greatest}   z
Return the maximum expression.

If any expression is null the return value is database-specific:
On PostgreSQL, the maximum not-null expression is returned.
On MySQL, Oracle, and SQLite, if any expression is null, null is returned.
GREATESTc                 Z   > [        U5      S:  a  [        S5      e[        TU ]  " U0 UD6  g )NrH   z+Greatest must take at least two expressionsrI   rL   s      r   r   Greatest.__init__   rP   r   c                 *   > [         TU ]  " X4SS0UD6$ )zUse the MAX function on SQLite.r?   MAXr   r)   r   s       r   r)   Greatest.as_sqlite       w WWWWr   r9   
r:   r;   r<   r=   r>   r?   r   r)   r@   rA   rB   s   @r   ro   ro   }   s      H0
X Xr   ro   c                   X   ^  \ rS rSrSr\" 5       rU 4S jrU 4S jrU 4S jr	S r
SrU =r$ )
JSONObject   JSON_OBJECTc                    > / nUR                  5        H!  u  p4UR                  [        U5      U45        M#     [        TU ]  " U6   g rR   )itemsextendr   r   r   )r   fieldsrM   keyvaluer   s        r   r   JSONObject.__init__   s>     ,,.JCc
E23 )+&r   c                 r   > UR                   R                  (       d  [        S5      e[        TU ]  " X40 UD6$ )Nz7JSONObject() is not supported on this database backend.)featureshas_json_object_functionr   r   r   r   s       r   r   JSONObject.as_sql   s8    "";;#I  w~hDmDDr   c                   > U R                  5       nUR                  [        UR                  5       5       VVs/ s H$  u  pVUS-  S:X  a  [	        U[        5       5      OUPM&     snn5        [        [        U]"  " UU4SS0UD6$ s  snnf )NrH   r   r?   JSONB_BUILD_OBJECT)	rZ   r[   	enumeraterS   r
   r   r   r{   r   )r   r   r   r   rZ   indexr   r   s          r   r4   JSONObject.as_postgresql   s    yy{## *343N3N3P)Q)Q%E 27aZ-ZO)Q	
 Z-
 *
 	
 	
s   +B
c                 N     " S S5      nU R                   " UU4U" 5       SS.UD6$ )Nc                       \ rS rSrS rSrg)'JSONObject.as_oracle.<locals>.ArgJoiner   c                     [        US S S2   USS S2   5       Vs/ s H  nSR                  U5      PM     nnSR                  U5      $ s  snf )NrH      z VALUE z, )zipjoin)r   argsargs      r   r   ,JSONObject.as_oracle.<locals>.ArgJoiner.join   sN    7:4!9d14a4j7QR7Q	s+7QRyy& Ss   A	r9   N)r:   r;   r<   r=   r   r@   r9   r   r   	ArgJoinerr      s    'r   r   z,%(function)s(%(expressions)s RETURNING CLOB))
arg_joinerr#   r3   )r   r   r   r   r   s        r   r7   JSONObject.as_oracle   s>    	' 	'
 {{
 !{C	

 
 	
r   r9   )r:   r;   r<   r=   r?   r   r   r   r   r4   r7   r@   rA   rB   s   @r   r{   r{      s)    H;L'E

 
r   r{   c                   <   ^  \ rS rSrSrSrU 4S jrU 4S jrSrU =r	$ )Least   z
Return the minimum expression.

If any expression is null the return value is database-specific:
On PostgreSQL, return the minimum not-null expression.
On MySQL, Oracle, and SQLite, if any expression is null, return null.
LEASTc                 Z   > [        U5      S:  a  [        S5      e[        TU ]  " U0 UD6  g )NrH   z(Least must take at least two expressionsrI   rL   s      r   r   Least.__init__   s.    {aGHH+//r   c                 *   > [         TU ]  " X4SS0UD6$ )zUse the MIN function on SQLite.r?   MINrv   r   s       r   r)   Least.as_sqlite   rx   r   r9   ry   rB   s   @r   r   r      s      H0
X Xr   r   c                   0   ^  \ rS rSrSrSrU 4S jrSrU =r$ )NullIf   NULLIFrH   c                    > U R                  5       S   n[        U[        5      (       a  UR                  c  [	        S5      e[
        TU ]  " X40 UD6$ )Nr   z2Oracle does not allow Value(None) for expression1.)rS   
isinstancer   r   rK   r   r   )r   r   r   r   expression1r   s        r   r7   NullIf.as_oracle   sN    113A6k5))k.?.?.GQRRw~hDmDDr   r9   )	r:   r;   r<   r=   r?   arityr7   r@   rA   rB   s   @r   r   r      s    HEE Er   r   N)r>   	django.dbr   django.db.models.expressionsr   r   django.db.models.fieldsr   django.db.models.fields.jsonr   django.utils.regex_helperr   r
   rD   r`   ro   r{   r   r   r9   r   r   <module>r      sz    A ' 4 - 2 6<B4 <B~Bt BBEd E&Xt X*,
 ,
^XD X*ET Er   